Skip to content

Commit f026d68

Browse files
committed
✅ test: add contact form component tests
The tests cover form rendering, validation, submission success and error handling. They verify required fields, input format validation, and proper button state management during form submission.
1 parent 6d61751 commit f026d68

File tree

1 file changed

+139
-0
lines changed

1 file changed

+139
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/**
2+
* @jest-environment jsdom
3+
*/
4+
5+
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
6+
import ContactForm from "@/components/Kontakt/ContactForm.component";
7+
import emailjs, { EmailJSResponseStatus } from "@emailjs/browser";
8+
9+
type SendType = jest.Mock<Promise<EmailJSResponseStatus>>;
10+
11+
jest.mock("@emailjs/browser", () => ({
12+
send: jest.fn(() => Promise.resolve({ status: 200, text: "OK" })) as SendType,
13+
init: jest.fn(),
14+
}));
15+
16+
describe("ContactForm", () => {
17+
const fulltNavn = "Fullt navn";
18+
const telefonNummer = "Telefonnummer";
19+
const hvaOnskerDu = "Hva ønsker du å si?";
20+
const sendSkjemaText = "Send skjema";
21+
22+
beforeEach(() => {
23+
jest.clearAllMocks();
24+
});
25+
26+
const fillFormWithValidData = () => {
27+
fireEvent.change(screen.getByLabelText(fulltNavn), {
28+
target: { value: "Bruker Test" },
29+
});
30+
fireEvent.change(screen.getByLabelText(telefonNummer), {
31+
target: { value: "12345678" },
32+
});
33+
fireEvent.change(screen.getByLabelText(hvaOnskerDu), {
34+
target: { value: "Test melding" },
35+
});
36+
};
37+
38+
it("renders the component", () => {
39+
// Arrange
40+
const expectedTestId = "kontaktcontent";
41+
42+
// Act
43+
render(<ContactForm />);
44+
45+
// Assert
46+
expect(screen.getByTestId(expectedTestId)).toBeInTheDocument();
47+
});
48+
49+
it("submits the form successfully and disables submit button while submitting", async () => {
50+
// Arrange
51+
render(<ContactForm />);
52+
const submitButton = screen.getByText(sendSkjemaText);
53+
54+
// Act
55+
fillFormWithValidData();
56+
fireEvent.click(submitButton);
57+
58+
// Assert - Initial state
59+
expect(submitButton).toBeDisabled();
60+
61+
// Assert - Final state
62+
await waitFor(() => {
63+
expect(screen.getByText("Takk for din beskjed")).toBeInTheDocument();
64+
});
65+
expect(emailjs.send).toHaveBeenCalledTimes(1);
66+
});
67+
68+
it("displays error message on form submission failure", async () => {
69+
// Arrange
70+
(emailjs.send as SendType).mockRejectedValueOnce(new Error("Test error"));
71+
render(<ContactForm />);
72+
73+
// Act
74+
fillFormWithValidData();
75+
fireEvent.click(screen.getByText(sendSkjemaText));
76+
77+
// Assert
78+
await waitFor(() => {
79+
expect(
80+
screen.getByText("Feil under sending av skjema"),
81+
).toBeInTheDocument();
82+
});
83+
expect(emailjs.send).toHaveBeenCalledTimes(1);
84+
});
85+
86+
it("displays validation errors for empty fields", async () => {
87+
// Arrange
88+
render(<ContactForm />);
89+
const expectedErrors = {
90+
name: "Fullt navn er påkrevd",
91+
phone: "Telefonnummer er påkrevd",
92+
message: "Beskjed er påkrevd",
93+
};
94+
95+
// Act
96+
fireEvent.click(screen.getByText(sendSkjemaText));
97+
98+
// Assert
99+
await waitFor(() => {
100+
expect(screen.getByText(expectedErrors.name)).toBeInTheDocument();
101+
});
102+
expect(screen.getByText(expectedErrors.phone)).toBeInTheDocument();
103+
expect(screen.getByText(expectedErrors.message)).toBeInTheDocument();
104+
expect(emailjs.send).not.toHaveBeenCalled();
105+
});
106+
107+
it("displays validation errors for invalid inputs", async () => {
108+
// Arrange
109+
render(<ContactForm />);
110+
const invalidInputs = {
111+
name: "User123", // Invalid name format
112+
phone: "123", // Invalid phone number
113+
message: "Test melding",
114+
};
115+
const expectedErrors = {
116+
name: "Vennligst bruk norske bokstaver",
117+
phone: "Vennligst oppgi et gyldig telefonnummer",
118+
};
119+
120+
// Act
121+
fireEvent.change(screen.getByLabelText(fulltNavn), {
122+
target: { value: invalidInputs.name },
123+
});
124+
fireEvent.change(screen.getByLabelText(telefonNummer), {
125+
target: { value: invalidInputs.phone },
126+
});
127+
fireEvent.change(screen.getByLabelText(hvaOnskerDu), {
128+
target: { value: invalidInputs.message },
129+
});
130+
fireEvent.click(screen.getByText(sendSkjemaText));
131+
132+
// Assert
133+
await waitFor(() => {
134+
expect(screen.getByText(expectedErrors.name)).toBeInTheDocument();
135+
});
136+
expect(screen.getByText(expectedErrors.phone)).toBeInTheDocument();
137+
expect(emailjs.send).not.toHaveBeenCalled();
138+
});
139+
});

0 commit comments

Comments
 (0)