4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
6
6
* You may obtain a copy of the License at
7
- *
8
7
* http://www.apache.org/licenses/LICENSE-2.0
9
8
*
10
9
* Unless required by applicable law or agreed to in writing, software
14
13
* limitations under the License.
15
14
*/
16
15
17
- import { describe , expect , it , vi } from "vitest" ;
18
- import { render , screen } from "@testing-library/react" ;
16
+ import { describe , it , expect , vi , afterEach , beforeEach } from "vitest" ;
17
+ import { render , screen , fireEvent , cleanup } from "@testing-library/react" ;
19
18
import { SignUpAuthScreen } from "~/auth/screens/sign-up-auth-screen" ;
19
+ import { CreateFirebaseUIProvider , createMockUI } from "~/tests/utils" ;
20
+ import { registerLocale } from "@firebase-ui/translations" ;
20
21
21
- // Mock hooks
22
- vi . mock ( "~/hooks" , ( ) => ( {
23
- useUI : ( ) => ( {
24
- locale : "en-US" ,
25
- translations : {
26
- "en-US" : {
27
- labels : {
28
- register : "Create Account" ,
29
- dividerOr : "OR" ,
30
- } ,
31
- prompts : {
32
- enterDetailsToCreate : "Enter your details to create an account" ,
33
- } ,
34
- } ,
35
- } ,
36
- } ) ,
37
- } ) ) ;
38
-
39
- // Mock translations
40
- // vi.mock("@firebase-ui/core", () => ({
41
- // getTranslation: vi.fn((category, key) => {
42
- // if (category === "labels" && key === "register") return "Create Account";
43
- // if (category === "prompts" && key === "enterDetailsToCreate")
44
- // return "Enter your details to create an account";
45
- // if (category === "messages" && key === "dividerOr") return "OR";
46
- // return `${category}.${key}`;
47
- // }),
48
- // }));
49
-
50
- // Mock RegisterForm component
51
- vi . mock ( "~/auth/forms/register-form" , ( ) => ( {
52
- RegisterForm : ( { onBackToSignInClick } : { onBackToSignInClick ?: ( ) => void } ) => (
53
- < div data-testid = "register-form" >
22
+ vi . mock ( "~/auth/forms/sign-up-auth-form" , ( ) => ( {
23
+ SignUpAuthForm : ( { onBackToSignInClick } : { onBackToSignInClick ?: ( ) => void } ) => (
24
+ < div data-testid = "sign-up-auth-form" >
54
25
< button data-testid = "back-to-sign-in-button" onClick = { onBackToSignInClick } >
55
26
Back to Sign In
56
27
</ button >
57
28
</ div >
58
29
) ,
59
30
} ) ) ;
60
31
61
- describe ( "SignUpAuthScreen" , ( ) => {
62
- it ( "renders the correct title and subtitle" , ( ) => {
63
- render ( < SignUpAuthScreen /> ) ;
32
+ vi . mock ( "~/components/divider" , async ( originalModule ) => {
33
+ const module = await originalModule ( ) ;
34
+ return {
35
+ ...( module as object ) ,
36
+ Divider : ( { children } : { children : React . ReactNode } ) => (
37
+ < div data-testid = "divider" > { children } </ div >
38
+ ) ,
39
+ } ;
40
+ } ) ;
41
+
42
+ describe ( "<SignUpAuthScreen />" , ( ) => {
43
+ beforeEach ( ( ) => {
44
+ vi . clearAllMocks ( ) ;
45
+ } ) ;
46
+
47
+ afterEach ( ( ) => {
48
+ cleanup ( ) ;
49
+ } ) ;
50
+
51
+ it ( "renders with correct title and subtitle" , ( ) => {
52
+ const ui = createMockUI ( {
53
+ locale : registerLocale ( "test" , {
54
+ labels : {
55
+ register : "register" ,
56
+ } ,
57
+ prompts : {
58
+ enterDetailsToCreate : "enterDetailsToCreate" ,
59
+ } ,
60
+ } ) ,
61
+ } ) ;
62
+
63
+ render (
64
+ < CreateFirebaseUIProvider ui = { ui } >
65
+ < SignUpAuthScreen />
66
+ </ CreateFirebaseUIProvider >
67
+ ) ;
68
+
69
+ const title = screen . getByText ( "register" ) ;
70
+ expect ( title ) . toBeDefined ( ) ;
71
+ expect ( title . className ) . toContain ( "fui-card__title" ) ;
64
72
65
- expect ( screen . getByText ( "Create Account" ) ) . toBeInTheDocument ( ) ;
66
- expect ( screen . getByText ( "Enter your details to create an account" ) ) . toBeInTheDocument ( ) ;
73
+ const subtitle = screen . getByText ( "enterDetailsToCreate" ) ;
74
+ expect ( subtitle ) . toBeDefined ( ) ;
75
+ expect ( subtitle . className ) . toContain ( "fui-card__subtitle" ) ;
67
76
} ) ;
68
77
69
- it ( "includes the RegisterForm component" , ( ) => {
70
- render ( < SignUpAuthScreen /> ) ;
78
+ it ( "renders the <SignUpAuthForm /> component" , ( ) => {
79
+ const ui = createMockUI ( ) ;
71
80
72
- expect ( screen . getByTestId ( "register-form" ) ) . toBeInTheDocument ( ) ;
81
+ render (
82
+ < CreateFirebaseUIProvider ui = { ui } >
83
+ < SignUpAuthScreen />
84
+ </ CreateFirebaseUIProvider >
85
+ ) ;
86
+
87
+ // Mocked so only has as test id
88
+ expect ( screen . getByTestId ( "sign-up-auth-form" ) ) . toBeDefined ( ) ;
73
89
} ) ;
74
90
75
- it ( "passes the onBackToSignInClick prop to the RegisterForm" , async ( ) => {
76
- const onBackToSignInClick = vi . fn ( ) ;
77
- render ( < SignUpAuthScreen onBackToSignInClick = { onBackToSignInClick } /> ) ;
91
+ it ( "passes onBackToSignInClick to SignUpAuthForm" , ( ) => {
92
+ const mockOnBackToSignInClick = vi . fn ( ) ;
93
+ const ui = createMockUI ( ) ;
94
+
95
+ render (
96
+ < CreateFirebaseUIProvider ui = { ui } >
97
+ < SignUpAuthScreen onBackToSignInClick = { mockOnBackToSignInClick } />
98
+ </ CreateFirebaseUIProvider >
99
+ ) ;
78
100
79
101
const backButton = screen . getByTestId ( "back-to-sign-in-button" ) ;
80
- backButton . click ( ) ;
102
+ fireEvent . click ( backButton ) ;
103
+
104
+ expect ( mockOnBackToSignInClick ) . toHaveBeenCalledTimes ( 1 ) ;
105
+ } ) ;
106
+
107
+ it ( "renders a divider with children when present" , ( ) => {
108
+ const ui = createMockUI ( {
109
+ locale : registerLocale ( "test" , {
110
+ messages : {
111
+ dividerOr : "dividerOr" ,
112
+ } ,
113
+ } ) ,
114
+ } ) ;
81
115
82
- expect ( onBackToSignInClick ) . toHaveBeenCalled ( ) ;
116
+ render (
117
+ < CreateFirebaseUIProvider ui = { ui } >
118
+ < SignUpAuthScreen >
119
+ < div data-testid = "test-child" > Test Child</ div >
120
+ </ SignUpAuthScreen >
121
+ </ CreateFirebaseUIProvider >
122
+ ) ;
123
+
124
+ expect ( screen . getByTestId ( "divider" ) ) . toBeDefined ( ) ;
125
+ expect ( screen . getByText ( "dividerOr" ) ) . toBeDefined ( ) ;
126
+ expect ( screen . getByTestId ( "test-child" ) ) . toBeDefined ( ) ;
83
127
} ) ;
84
128
85
- it ( "renders children when provided" , ( ) => {
129
+ it ( "does not render divider and children when no children are provided" , ( ) => {
130
+ const ui = createMockUI ( ) ;
131
+
86
132
render (
87
- < SignUpAuthScreen >
88
- < div data-testid = "test-child" > Child element </ div >
89
- </ SignUpAuthScreen >
133
+ < CreateFirebaseUIProvider ui = { ui } >
134
+ < SignUpAuthScreen / >
135
+ </ CreateFirebaseUIProvider >
90
136
) ;
91
137
92
- expect ( screen . getByTestId ( "test-child" ) ) . toBeInTheDocument ( ) ;
93
- expect ( screen . getByText ( "or" ) ) . toBeInTheDocument ( ) ;
138
+ expect ( screen . queryByTestId ( "divider" ) ) . toBeNull ( ) ;
94
139
} ) ;
95
140
96
- it ( "does not render divider or children container when no children are provided" , ( ) => {
97
- render ( < SignUpAuthScreen /> ) ;
141
+ it ( "renders multiple children when provided" , ( ) => {
142
+ const ui = createMockUI ( {
143
+ locale : registerLocale ( "test" , {
144
+ messages : {
145
+ dividerOr : "dividerOr" ,
146
+ } ,
147
+ } ) ,
148
+ } ) ;
98
149
99
- expect ( screen . queryByText ( "or" ) ) . not . toBeInTheDocument ( ) ;
150
+ render (
151
+ < CreateFirebaseUIProvider ui = { ui } >
152
+ < SignUpAuthScreen >
153
+ < div data-testid = "child-1" > Child 1</ div >
154
+ < div data-testid = "child-2" > Child 2</ div >
155
+ </ SignUpAuthScreen >
156
+ </ CreateFirebaseUIProvider >
157
+ ) ;
158
+
159
+ expect ( screen . getByTestId ( "divider" ) ) . toBeDefined ( ) ;
160
+ expect ( screen . getByTestId ( "child-1" ) ) . toBeDefined ( ) ;
161
+ expect ( screen . getByTestId ( "child-2" ) ) . toBeDefined ( ) ;
100
162
} ) ;
101
- } ) ;
163
+ } ) ;
0 commit comments