Skip to content

Commit a6a9f6f

Browse files
test: Modified the tests to support the new route and the new method
1 parent 921bb56 commit a6a9f6f

9 files changed

Lines changed: 268 additions & 305 deletions

File tree

frontend/tests/integration/useJobsData.test.tsx

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,52 @@ import { act, renderHook, waitFor } from "@testing-library/react";
22
import { describe, expect, it, vi } from "vitest";
33

44
const mocks = vi.hoisted(() => ({
5-
fetchJobFilesMock: vi.fn(async () => [{ file: "vagas.xlsx" }]),
6-
fetchJobsByFileMock: vi.fn(async () => ({ jobs: [{ titulo: "Dev" }], file: "vagas.xlsx", modifiedAt: 1, total: 1 })),
5+
fetchJobsByAPIMock: vi.fn(),
6+
runScraperRequestMock: vi.fn(),
77
}));
88

99
vi.mock("@/domains/jobs/infrastructure/jobsApi", () => ({
10-
fetchJobFiles: mocks.fetchJobFilesMock,
11-
fetchJobsByFile: mocks.fetchJobsByFileMock,
10+
fetchJobsByAPI: mocks.fetchJobsByAPIMock,
11+
runScraperRequest: mocks.runScraperRequestMock,
1212
}));
1313

1414
import { useJobsData } from "@/domains/jobs/application/useJobsData";
1515

1616
describe("useJobsData", () => {
17-
it("carrega arquivos e jobs iniciais", async () => {
17+
it("carrega jobs iniciais", async () => {
18+
mocks.fetchJobsByAPIMock.mockResolvedValueOnce({
19+
jobs: [{ title: "Dev" }],
20+
total: 1,
21+
hasNext: false,
22+
hasPrev: false,
23+
page: 1,
24+
limit: 5,
25+
totalPages: 1,
26+
});
27+
1828
const { result } = renderHook(() => useJobsData());
1929

2030
await waitFor(() => {
21-
expect(result.current.files).toHaveLength(1);
22-
expect(result.current.meta.file).toBe("vagas.xlsx");
31+
expect(result.current.jobs).toHaveLength(1);
32+
expect(result.current.meta.total).toBe(1);
2333
});
2434
});
2535

26-
it("carrega jobs por arquivo manualmente", async () => {
36+
it("carrega jobs manualmente através do loadJobs", async () => {
37+
mocks.fetchJobsByAPIMock.mockResolvedValue({
38+
jobs: [{ title: "Dev" }],
39+
total: 1,
40+
hasNext: false,
41+
hasPrev: false,
42+
page: 1,
43+
limit: 5,
44+
totalPages: 1,
45+
});
46+
2747
const { result } = renderHook(() => useJobsData());
2848

2949
await act(async () => {
30-
await result.current.loadJobs("vagas.xlsx");
50+
await result.current.loadJobs();
3151
});
3252

3353
expect(result.current.jobs).toHaveLength(1);

frontend/tests/unit/components/JobsFiltersCard.extended.test.tsx

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ function renderFiltersCard(overrides = {}) {
1515
onRemoveFilter: vi.fn(),
1616
onClearFilters: vi.fn(),
1717
keywords: ["React"],
18-
selectedFile: "vagas.xlsx",
19-
setSelectedFile: vi.fn(),
20-
files: [{ file: "vagas.xlsx" }],
21-
meta: { file: "vagas.xlsx", modifiedAt: Date.now(), total: 1 },
18+
meta: {
19+
total: 1,
20+
hasNext: false,
21+
hasPrev: false,
22+
page: 1,
23+
limit: 5,
24+
totalPages: 1,
25+
},
2226
...overrides,
2327
};
2428

@@ -27,64 +31,54 @@ function renderFiltersCard(overrides = {}) {
2731
return props;
2832
}
2933

30-
describe("JobsFiltersCard", () => {
31-
it("adiciona termo de busca como filtro e permite refresh", () => {
32-
const onRefresh = vi.fn();
33-
const props = renderFiltersCard({
34-
actions: (
35-
<button type="button" onClick={onRefresh}>
36-
Atualizar
37-
</button>
38-
),
39-
});
34+
describe("JobsFiltersCard Extended", () => {
35+
it("adiciona termo de busca como filtro", () => {
36+
const props = renderFiltersCard();
4037

4138
fireEvent.change(screen.getByPlaceholderText(/buscar/i), {
4239
target: { value: "node" },
4340
});
4441
fireEvent.click(
4542
screen.getByRole("button", { name: /adicionar filtro de busca/i }),
4643
);
47-
fireEvent.click(screen.getByRole("button", { name: /atualizar/i }));
4844

4945
expect(props.setSearch).toHaveBeenCalledTimes(1);
5046
expect(props.setSearch.mock.calls[0][0]("React")).toBe("React, node");
5147
expect(screen.getByPlaceholderText(/buscar/i)).toHaveValue("");
52-
expect(onRefresh).toHaveBeenCalledTimes(1);
5348
});
5449

55-
it("renderiza badge de arquivo, total e area de filtros", () => {
50+
it("renderiza total e area de filtros", () => {
5651
renderFiltersCard();
5752

58-
expect(screen.getAllByText(/vagas\.xlsx/i).length).toBeGreaterThan(0);
5953
expect(screen.getByText(/1 vagas/i)).toBeInTheDocument();
6054
expect(screen.getByText(/filtros selecionados/i)).toBeInTheDocument();
6155
expect(screen.getByText(/use o botão filtrar/i)).toBeInTheDocument();
6256
});
6357

64-
it("dispara mudancas nos filtros de keyword e arquivo", () => {
65-
const props = renderFiltersCard({
66-
files: [{ file: "vagas.xlsx" }, { file: "historico.xlsx" }],
67-
meta: { file: "vagas.xlsx", modifiedAt: Date.now(), total: 2 },
68-
});
58+
it("dispara mudancas nos filtros de keyword", () => {
59+
const props = renderFiltersCard();
6960

7061
const selects = screen.getAllByRole("combobox");
7162

7263
fireEvent.change(selects[0], {
7364
target: { value: "React" },
7465
});
75-
fireEvent.change(selects[1], {
76-
target: { value: "historico.xlsx" },
77-
});
7866

7967
expect(props.setKeywordFilter).toHaveBeenCalled();
80-
expect(props.setSelectedFile).toHaveBeenCalled();
8168
});
8269

8370
it("abre o gerenciador e aciona limpar/remover filtros selecionados", () => {
8471
const props = renderFiltersCard({
8572
search: "UX/UI Designer",
8673
keywordFilter: ["React"],
87-
meta: { file: "vagas.xlsx", modifiedAt: Date.now(), total: 2 },
74+
meta: {
75+
total: 2,
76+
hasNext: false,
77+
hasPrev: false,
78+
page: 1,
79+
limit: 5,
80+
totalPages: 1,
81+
},
8882
});
8983

9084
fireEvent.click(screen.getByRole("button", { name: /^filtrar$/i }));

frontend/tests/unit/components/JobsFiltersCard.test.tsx

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ function renderFiltersCard(overrides = {}) {
1515
onRemoveFilter: vi.fn(),
1616
onClearFilters: vi.fn(),
1717
keywords: ["React"],
18-
selectedFile: "vagas.xlsx",
19-
setSelectedFile: vi.fn(),
20-
files: [{ file: "vagas.xlsx" }],
21-
meta: { file: "vagas.xlsx", modifiedAt: Date.now(), total: 1 },
18+
meta: {
19+
total: 1,
20+
hasNext: false,
21+
hasPrev: false,
22+
page: 1,
23+
limit: 5,
24+
totalPages: 1,
25+
},
2226
...overrides,
2327
};
2428

@@ -28,63 +32,53 @@ function renderFiltersCard(overrides = {}) {
2832
}
2933

3034
describe("JobsFiltersCard", () => {
31-
it("adiciona termo de busca como filtro e permite refresh", () => {
32-
const onRefresh = vi.fn();
33-
const props = renderFiltersCard({
34-
actions: (
35-
<button type="button" onClick={onRefresh}>
36-
Atualizar
37-
</button>
38-
),
39-
});
35+
it("adiciona termo de busca como filtro", () => {
36+
const props = renderFiltersCard();
4037

4138
fireEvent.change(screen.getByPlaceholderText(/buscar/i), {
4239
target: { value: "node" },
4340
});
4441
fireEvent.click(
4542
screen.getByRole("button", { name: /adicionar filtro de busca/i }),
4643
);
47-
fireEvent.click(screen.getByRole("button", { name: /atualizar/i }));
4844

4945
expect(props.setSearch).toHaveBeenCalledTimes(1);
5046
expect(props.setSearch.mock.calls[0][0]("React")).toBe("React, node");
5147
expect(screen.getByPlaceholderText(/buscar/i)).toHaveValue("");
52-
expect(onRefresh).toHaveBeenCalledTimes(1);
5348
});
5449

55-
it("renderiza badge de arquivo, total e area de filtros", () => {
50+
it("renderiza total e area de filtros", () => {
5651
renderFiltersCard();
5752

58-
expect(screen.getAllByText(/vagas\.xlsx/i).length).toBeGreaterThan(0);
5953
expect(screen.getByText(/1 vagas/i)).toBeInTheDocument();
6054
expect(screen.getByText(/filtros selecionados/i)).toBeInTheDocument();
6155
expect(screen.getByText(/use o botão filtrar/i)).toBeInTheDocument();
6256
});
6357

64-
it("dispara mudancas nos filtros de keyword e arquivo", () => {
65-
const props = renderFiltersCard({
66-
files: [{ file: "vagas.xlsx" }, { file: "historico.xlsx" }],
67-
meta: { file: "vagas.xlsx", modifiedAt: Date.now(), total: 2 },
68-
});
58+
it("dispara mudancas nos filtros de keyword", () => {
59+
const props = renderFiltersCard();
6960

7061
const selects = screen.getAllByRole("combobox");
7162

7263
fireEvent.change(selects[0], {
7364
target: { value: "React" },
7465
});
75-
fireEvent.change(selects[1], {
76-
target: { value: "historico.xlsx" },
77-
});
7866

7967
expect(props.setKeywordFilter).toHaveBeenCalled();
80-
expect(props.setSelectedFile).toHaveBeenCalled();
8168
});
8269

8370
it("abre o gerenciador e aciona limpar/remover filtros selecionados", () => {
8471
const props = renderFiltersCard({
8572
search: "UX/UI Designer",
8673
keywordFilter: ["React"],
87-
meta: { file: "vagas.xlsx", modifiedAt: Date.now(), total: 2 },
74+
meta: {
75+
total: 2,
76+
hasNext: false,
77+
hasPrev: false,
78+
page: 1,
79+
limit: 5,
80+
totalPages: 1,
81+
},
8882
});
8983

9084
fireEvent.click(screen.getByRole("button", { name: /^filtrar$/i }));

frontend/tests/unit/components/JobsTableCard.test.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,35 @@ import { fireEvent, render, screen } from "@testing-library/react";
33
import { describe, expect, it, vi } from "vitest";
44

55
const baseProps = {
6-
meta: { file: "vagas.xlsx", modifiedAt: 1, total: 1 },
6+
meta: {
7+
total: 1,
8+
hasNext: false,
9+
hasPrev: false,
10+
page: 1,
11+
limit: 5,
12+
totalPages: 5,
13+
},
714
filteredJobs: [
815
{
9-
titulo: "Dev",
10-
empresa: "ACME",
11-
local: "BR",
12-
palavra: "JavaScript, UX-UI",
16+
title: "Dev",
17+
company: "ACME",
18+
location: "BR",
19+
keyword: "JavaScript, UX-UI",
1320
source: "LinkedIn",
14-
link: "https://x",
21+
url: "https://x",
1522
},
1623
],
1724
paginatedJobs: [
1825
{
19-
titulo: "Dev",
20-
empresa: "ACME",
21-
local: "BR",
22-
palavra: "JavaScript, UX-UI",
26+
title: "Dev",
27+
company: "ACME",
28+
location: "BR",
29+
keyword: "JavaScript, UX-UI",
2330
source: "LinkedIn",
24-
link: "https://x",
31+
url: "https://x",
2532
},
2633
],
27-
jobs: [{ titulo: "Dev" }],
34+
jobs: [{ title: "Dev" }],
2835
loading: false,
2936
error: "",
3037
formatDate: () => "agora",
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { describe, expect, it } from "vitest";
2+
import { normalizeComparableText, normalizeComparableLink } from "@/domains/jobs/domain/jobFilters";
3+
4+
describe("jobFilters domain utilities", () => {
5+
describe("normalizeComparableText", () => {
6+
it("normalizes text by removing diacritics and converting to lowercase", () => {
7+
expect(normalizeComparableText("São Paulo")).toBe("sao paulo");
8+
expect(normalizeComparableText("Árvore")).toBe("arvore");
9+
});
10+
11+
it("handles special characters by replacing them with spaces", () => {
12+
expect(normalizeComparableText("Node.js")).toBe("node js");
13+
expect(normalizeComparableText("React/Redux")).toBe("react redux");
14+
});
15+
16+
it("trims and normalizes multiple spaces", () => {
17+
expect(normalizeComparableText(" React JS ")).toBe("react js");
18+
});
19+
});
20+
21+
describe("normalizeComparableLink", () => {
22+
it("removes query parameters and hashes from URLs", () => {
23+
expect(normalizeComparableLink("https://example.com/jobs/1?utm=source#top")).toBe("https://example.com/jobs/1");
24+
});
25+
26+
it("returns empty string for invalid or empty inputs", () => {
27+
expect(normalizeComparableLink(null)).toBe("");
28+
expect(normalizeComparableLink(" ")).toBe("");
29+
});
30+
});
31+
});

frontend/tests/unit/factories/jobsFactory.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,24 @@ import type { Job, JobsMeta } from "@/domains/jobs/domain/job.types";
22

33
export function makeJob(overrides: Partial<Job> = {}): Job {
44
return {
5-
titulo: "Frontend Developer",
6-
empresa: "ACME",
7-
local: "Remoto",
8-
palavra: "React",
9-
link: "https://example.com/job/1",
5+
title: "Frontend Developer",
6+
company: "ACME",
7+
location: "Remoto",
8+
keyword: "React",
9+
url: "https://example.com/job/1",
1010
source: "LinkedIn",
1111
...overrides,
1212
};
1313
}
1414

1515
export function makeJobsMeta(overrides: Partial<JobsMeta> = {}): JobsMeta {
1616
return {
17-
file: "vagas.xlsx",
18-
modifiedAt: 1710000000000,
17+
hasNext: false,
18+
hasPrev: false,
19+
limit: 5,
20+
page: 1,
1921
total: 1,
22+
totalPages: 1,
2023
...overrides,
2124
};
2225
}

0 commit comments

Comments
 (0)