Skip to content

Commit f89dcbb

Browse files
committed
Merge branch 'develop' into PAV-51-fix-api-connection-issue
2 parents 6f8bf6f + 71f711b commit f89dcbb

2 files changed

Lines changed: 75 additions & 243 deletions

File tree

Lines changed: 75 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,42 @@
11
/* eslint-disable @typescript-eslint/no-explicit-any */
2-
2+
import "@testing-library/jest-dom/vitest";
33
import { 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-
// =====================
98
const mockRegister = vi.fn();
9+
const mockApiPost = vi.fn();
10+
const mockApiGet = vi.fn();
1011

1112
vi.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

1923
vi.mock("@unpic/react", () => ({
2024
Image: (props: any) => <img {...props} alt={props.alt} />,
2125
}));
2226

2327
vi.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

3634
vi.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-
// =====================
6648
describe("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(/senha/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(/senha/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: /cadastrar/i }));
10486

105-
expect(
106-
await screen.findByText(/campo de nome.*obrigatório/i)
107-
).toBeInTheDocument();
108-
expect(
109-
await screen.findByText(/campo de e-mail.*obrigatório/i)
110-
).toBeInTheDocument();
111-
expect(
112-
await screen.findByText(/campo de telefone.*obrigatório/i)
113-
).toBeInTheDocument();
114-
expect(
115-
await screen.findByText(/campo de senha.*obrigatório/i)
116-
).toBeInTheDocument();
117-
// CPF é campo opcional — não dispara erro de obrigatório
87+
expect(await screen.findByText(/nome.*obrigatório/i)).toBeInTheDocument();
88+
expect(await screen.findByText(/e-mail.*obrigatório/i)).toBeInTheDocument();
89+
expect(await screen.findByText(/telefone.*obrigatório/i)).toBeInTheDocument();
90+
expect(await screen.findByText(/senha.*obrigatório/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(/nome/i), {
@@ -143,11 +115,10 @@ describe("RegisterSide", () => {
143115

144116
fireEvent.click(screen.getByRole("button", { name: /cadastrar/i }));
145117

146-
// Componente exibe: "CPF inválido. Deve conter 11 dígitos."
147118
expect(await screen.findByText(/cpf inv[aá]lido/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: /cadastrar/i }));
203174

204-
expect(
205-
await screen.findByText(/email já cadastrado/i)
206-
).toBeInTheDocument();
175+
expect(await screen.findByText(/email já cadastrado/i)).toBeInTheDocument();
207176
});
208177

209178
it("mostra loading durante requisição", async () => {
@@ -216,15 +185,6 @@ describe("RegisterSide", () => {
216185
fireEvent.change(screen.getByLabelText(/nome/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(/nome/i), { target: { value: "Bene" } });
224-
fireEvent.change(screen.getByLabelText(/email/i), { target: { value: "bene@teste.com" } });
225-
fireEvent.change(screen.getByLabelText(/^telefone$/i), { target: { value: "+5534999999999" } });
226-
fireEvent.change(screen.getByLabelText(/senha/i), { target: { value: "123456" } });
227-
fireEvent.change(screen.getByLabelText(/cpf/i), { target: { value: "12345678901" } });
228188

229189
fireEvent.change(screen.getByLabelText(/email/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(/nome/i), {
214+
target: { value: "Bene" },
215+
});
216+
217+
fireEvent.change(screen.getByLabelText(/email/i), {
218+
target: { value: "bene@teste.com" },
219+
});
220+
221+
fireEvent.change(screen.getByPlaceholderText(/\(34\)/i), {
222+
target: { value: "+5534999999999" },
223+
});
224+
225+
fireEvent.change(screen.getByLabelText(/senha/i), {
226+
target: { value: "123456" },
227+
});
228+
229+
fireEvent.change(screen.getByLabelText(/cpf/i), {
230+
target: { value: "12345678901" },
231+
});
232+
233+
fireEvent.click(screen.getByRole("button", { name: /cadastrar/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(/nome/i);
256-
const email = screen.getByLabelText(/email/i);
257-
const senha = screen.getByLabelText(/senha/i);
247+
fireEvent.change(screen.getByLabelText(/nome/i), {
248+
target: { value: "Bene" },
249+
});
250+
251+
fireEvent.change(screen.getByLabelText(/email/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(/senha/i), {
256+
target: { value: "123456" },
257+
});
262258

263259
fireEvent.change(screen.getByPlaceholderText(/\(34\)/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: /cadastrar/i }));
@@ -278,4 +266,4 @@ describe("RegisterSide", () => {
278266
await screen.findByRole("button", { name: /cadastrando/i })
279267
).toBeDisabled();
280268
});
281-
});
269+
});

0 commit comments

Comments
 (0)