11/* eslint-disable @typescript-eslint/no-explicit-any */
2-
2+ import "@testing-library/jest-dom/vitest" ;
33import { fireEvent , render , screen , waitFor } from "@testing-library/react" ;
4- import { beforeEach , describe , expect , it , vi } from "vitest" ;
4+ import { afterEach , beforeEach , describe , expect , it , vi } from "vitest" ;
5+
6+ import RegisterSide from "@/components/login/RegisterSide" ;
57
6- // =====================
7- // MOCKS
8- // =====================
98const mockRegister = vi . fn ( ) ;
9+ const mockApiPost = vi . fn ( ) ;
10+ const mockApiGet = vi . fn ( ) ;
1011
1112vi . mock ( "@/services/authService" , ( ) => ( {
1213 register : ( ...args : any [ ] ) => mockRegister ( ...args ) ,
1314} ) ) ;
14- /* eslint-disable @typescript-eslint/no-unused-vars */
15- import { fireEvent , render , screen , waitFor } from "@testing-library/react" ;
16- import { beforeEach , describe , expect , it , vi } from "vitest" ;
17- import "@testing-library/jest-dom/vitest" ;
15+
16+ vi . mock ( "@/services/api" , ( ) => ( {
17+ api : {
18+ post : ( ...args : any [ ] ) => mockApiPost ( ...args ) ,
19+ get : ( ...args : any [ ] ) => mockApiGet ( ...args ) ,
20+ } ,
21+ } ) ) ;
1822
1923vi . mock ( "@unpic/react" , ( ) => ( {
2024 Image : ( props : any ) => < img { ...props } alt = { props . alt } /> ,
2125} ) ) ;
2226
2327vi . mock ( "framer-motion" , ( ) => ( {
2428 motion : {
25- div : ( { children, ...props } : any ) => < div { ...props } > { children } </ div > ,
26- button : ( { children, ...props } : any ) => (
27- < button { ...props } > { children } </ button >
28- ) ,
29- div : ( { children, whileHover, whileTap, animate, transition, ...props } : any ) =>
30- < div { ...props } > { children } </ div > ,
31- button : ( { children, whileHover, whileTap, animate, transition, ...props } : any ) =>
32- < button { ...props } > { children } </ button > ,
29+ div : ( { children } : any ) => < div > { children } </ div > ,
30+ button : ( { children } : any ) => < button > { children } </ button > ,
3331 } ,
3432} ) ) ;
3533
3634vi . mock ( "react-phone-number-input" , ( ) => ( {
37- default : ( { value, onChange, placeholder , disabled } : any ) => (
35+ default : ( { value, onChange } : any ) => (
3836 < input
3937 type = "tel"
4038 value = { value || "" }
4139 onChange = { ( e ) => onChange ( e . target . value ) }
42- placeholder = { placeholder }
43- disabled = { disabled }
4440 />
4541 ) ,
4642} ) ) ;
@@ -49,24 +45,15 @@ vi.mock("react-router-dom", () => ({
4945 useNavigate : ( ) => vi . fn ( ) ,
5046} ) ) ;
5147
52- const mockApiPost = vi . fn ( ) ;
53- const mockApiGet = vi . fn ( ) ;
54- vi . mock ( "@/services/api" , ( ) => ( {
55- api : {
56- post : ( ...args : any [ ] ) => mockApiPost ( ...args ) ,
57- get : ( ...args : any [ ] ) => mockApiGet ( ...args ) ,
58- } ,
59- } ) ) ;
60-
61- import RegisterSide from "@/components/login/RegisterSide" ;
62-
63- // =====================
64- // TEST SUITE
65- // =====================
6648describe ( "RegisterSide" , ( ) => {
49+ let originalLocation : Location ;
6750
6851 beforeEach ( ( ) => {
6952 mockRegister . mockReset ( ) ;
53+ mockApiPost . mockClear ( ) ;
54+ mockApiGet . mockClear ( ) ;
55+
56+ originalLocation = window . location ;
7057
7158 Object . defineProperty ( window , "location" , {
7259 configurable : true ,
@@ -79,46 +66,31 @@ describe("RegisterSide", () => {
7966 configurable : true ,
8067 value : originalLocation ,
8168 } ) ;
82-
83- beforeEach ( ( ) => {
84- mockApiPost . mockClear ( ) ;
85- mockApiGet . mockClear ( ) ;
8669 } ) ;
8770
88- it ( "renderiza formulário e alterna visibilidade da senha" , ( ) => {
71+ it ( "renderiza formulário e alterna senha" , ( ) => {
8972 render ( < RegisterSide /> ) ;
9073
9174 const passwordInput = screen . getByLabelText ( / s e n h a / i) as HTMLInputElement ;
9275 expect ( passwordInput . type ) . toBe ( "password" ) ;
9376
94- const toggleButtons = screen . getAllByRole ( "button" ) ;
95- fireEvent . click ( toggleButtons [ 0 ] ) ;
77+ fireEvent . click ( screen . getAllByRole ( "button" ) [ 0 ] ) ;
9678
9779 expect ( screen . getByLabelText ( / s e n h a / i) ) . toHaveAttribute ( "type" , "text" ) ;
9880 } ) ;
9981
100- it ( "mostra erros obrigatórios quando submit vazio " , async ( ) => {
82+ it ( "mostra erros obrigatórios" , async ( ) => {
10183 render ( < RegisterSide /> ) ;
10284
10385 fireEvent . click ( screen . getByRole ( "button" , { name : / c a d a s t r a r / i } ) ) ;
10486
105- expect (
106- await screen . findByText ( / c a m p o d e n o m e .* o b r i g a t ó r i o / i)
107- ) . toBeInTheDocument ( ) ;
108- expect (
109- await screen . findByText ( / c a m p o d e e - m a i l .* o b r i g a t ó r i o / i)
110- ) . toBeInTheDocument ( ) ;
111- expect (
112- await screen . findByText ( / c a m p o d e t e l e f o n e .* o b r i g a t ó r i o / i)
113- ) . toBeInTheDocument ( ) ;
114- expect (
115- await screen . findByText ( / c a m p o d e s e n h a .* o b r i g a t ó r i o / i)
116- ) . toBeInTheDocument ( ) ;
117- // CPF é campo opcional — não dispara erro de obrigatório
87+ expect ( await screen . findByText ( / n o m e .* o b r i g a t ó r i o / i) ) . toBeInTheDocument ( ) ;
88+ expect ( await screen . findByText ( / e - m a i l .* o b r i g a t ó r i o / i) ) . toBeInTheDocument ( ) ;
89+ expect ( await screen . findByText ( / t e l e f o n e .* o b r i g a t ó r i o / i) ) . toBeInTheDocument ( ) ;
90+ expect ( await screen . findByText ( / s e n h a .* o b r i g a t ó r i o / i) ) . toBeInTheDocument ( ) ;
11891 } ) ;
11992
120-
121- it ( "valida CPF quando preenchido incorretamente" , async ( ) => {
93+ it ( "valida CPF inválido" , async ( ) => {
12294 render ( < RegisterSide /> ) ;
12395
12496 fireEvent . change ( screen . getByLabelText ( / n o m e / i) , {
@@ -143,11 +115,10 @@ describe("RegisterSide", () => {
143115
144116 fireEvent . click ( screen . getByRole ( "button" , { name : / c a d a s t r a r / i } ) ) ;
145117
146- // Componente exibe: "CPF inválido. Deve conter 11 dígitos."
147118 expect ( await screen . findByText ( / c p f i n v [ a á ] l i d o / i) ) . toBeInTheDocument ( ) ;
148119 } ) ;
149120
150- it ( "envia formulário válido com CPF opcional " , async ( ) => {
121+ it ( "envia formulário válido" , async ( ) => {
151122 mockRegister . mockResolvedValueOnce ( {
152123 message : "Usuário criado" ,
153124 user : { id : 1 } ,
@@ -178,7 +149,7 @@ describe("RegisterSide", () => {
178149 } ) ;
179150 } ) ;
180151
181- it ( "exibe erro quando API falha " , async ( ) => {
152+ it ( "exibe erro da API" , async ( ) => {
182153 mockRegister . mockRejectedValueOnce ( new Error ( "Email já cadastrado" ) ) ;
183154
184155 render ( < RegisterSide /> ) ;
@@ -201,9 +172,7 @@ describe("RegisterSide", () => {
201172
202173 fireEvent . click ( screen . getByRole ( "button" , { name : / c a d a s t r a r / i } ) ) ;
203174
204- expect (
205- await screen . findByText ( / e m a i l j á c a d a s t r a d o / i)
206- ) . toBeInTheDocument ( ) ;
175+ expect ( await screen . findByText ( / e m a i l j á c a d a s t r a d o / i) ) . toBeInTheDocument ( ) ;
207176 } ) ;
208177
209178 it ( "mostra loading durante requisição" , async ( ) => {
@@ -216,15 +185,6 @@ describe("RegisterSide", () => {
216185 fireEvent . change ( screen . getByLabelText ( / n o m e / i) , {
217186 target : { value : "Bene" } ,
218187 } ) ;
219- it ( "formata cpf e envia submit válido" , async ( ) => {
220- mockApiPost . mockResolvedValueOnce ( { data : { } } ) ;
221-
222- render ( < RegisterSide /> ) ;
223- fireEvent . change ( screen . getByLabelText ( / n o m e / i) , { target : { value : "Bene" } } ) ;
224- fireEvent . change ( screen . getByLabelText ( / e m a i l / i) , { target : { value : "bene@teste.com" } } ) ;
225- fireEvent . change ( screen . getByLabelText ( / ^ t e l e f o n e $ / i) , { target : { value : "+5534999999999" } } ) ;
226- fireEvent . change ( screen . getByLabelText ( / s e n h a / i) , { target : { value : "123456" } } ) ;
227- fireEvent . change ( screen . getByLabelText ( / c p f / i) , { target : { value : "12345678901" } } ) ;
228188
229189 fireEvent . change ( screen . getByLabelText ( / e m a i l / i) , {
230190 target : { value : "bene@teste.com" } ,
@@ -245,31 +205,59 @@ describe("RegisterSide", () => {
245205 ) . toBeDisabled ( ) ;
246206 } ) ;
247207
208+ it ( "envia CPF formatado corretamente" , async ( ) => {
209+ mockApiPost . mockResolvedValueOnce ( { data : { } } ) ;
210+
211+ render ( < RegisterSide /> ) ;
212+
213+ fireEvent . change ( screen . getByLabelText ( / n o m e / i) , {
214+ target : { value : "Bene" } ,
215+ } ) ;
216+
217+ fireEvent . change ( screen . getByLabelText ( / e m a i l / i) , {
218+ target : { value : "bene@teste.com" } ,
219+ } ) ;
220+
221+ fireEvent . change ( screen . getByPlaceholderText ( / \( 3 4 \) / i) , {
222+ target : { value : "+5534999999999" } ,
223+ } ) ;
224+
225+ fireEvent . change ( screen . getByLabelText ( / s e n h a / i) , {
226+ target : { value : "123456" } ,
227+ } ) ;
228+
229+ fireEvent . change ( screen . getByLabelText ( / c p f / i) , {
230+ target : { value : "12345678901" } ,
231+ } ) ;
232+
233+ fireEvent . click ( screen . getByRole ( "button" , { name : / c a d a s t r a r / i } ) ) ;
234+
235+ await waitFor ( ( ) => {
236+ expect ( mockApiPost ) . toHaveBeenCalled ( ) ;
237+ } ) ;
238+ } ) ;
239+
248240 it ( "desabilita inputs durante loading" , async ( ) => {
249241 mockRegister . mockImplementation (
250242 ( ) => new Promise ( ( resolve ) => setTimeout ( resolve , 200 ) )
251243 ) ;
252244
253245 render ( < RegisterSide /> ) ;
254246
255- const nome = screen . getByLabelText ( / n o m e / i) ;
256- const email = screen . getByLabelText ( / e m a i l / i) ;
257- const senha = screen . getByLabelText ( / s e n h a / i) ;
247+ fireEvent . change ( screen . getByLabelText ( / n o m e / i) , {
248+ target : { value : "Bene" } ,
249+ } ) ;
250+
251+ fireEvent . change ( screen . getByLabelText ( / e m a i l / i) , {
252+ target : { value : "bene@teste.com" } ,
253+ } ) ;
258254
259- fireEvent . change ( nome , { target : { value : "Bene" } } ) ;
260- fireEvent . change ( email , { target : { value : "bene@teste.com " } } ) ;
261- fireEvent . change ( senha , { target : { value : "123456" } } ) ;
255+ fireEvent . change ( screen . getByLabelText ( / s e n h a / i ) , {
256+ target : { value : "123456 " } ,
257+ } ) ;
262258
263259 fireEvent . change ( screen . getByPlaceholderText ( / \( 3 4 \) / i) , {
264260 target : { value : "+5534999999999" } ,
265- await waitFor ( ( ) => {
266- expect ( mockApiPost ) . toHaveBeenCalledWith ( "/auth/register" , {
267- name : "Bene" ,
268- email : "bene@teste.com" ,
269- phone : "+5534999999999" ,
270- password : "123456" ,
271- cpf : "12345678901" ,
272- } ) ;
273261 } ) ;
274262
275263 fireEvent . click ( screen . getByRole ( "button" , { name : / c a d a s t r a r / i } ) ) ;
@@ -278,4 +266,4 @@ describe("RegisterSide", () => {
278266 await screen . findByRole ( "button" , { name : / c a d a s t r a n d o / i } )
279267 ) . toBeDisabled ( ) ;
280268 } ) ;
281- } ) ;
269+ } ) ;
0 commit comments