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