Skip to content

Commit 5206f90

Browse files
committed
Adding new branch tests.
1 parent e00c6a8 commit 5206f90

8 files changed

Lines changed: 1235 additions & 4 deletions

File tree

.cspell/custom-dictionary-workspace.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Adzuna
66
algumas
77
alternativa
88
ambiente
9+
andamento
910
ativas
1011
atuais
1112
blockdaemon
@@ -17,11 +18,15 @@ chainalysis
1718
chainlink
1819
chave
1920
coleta
21+
compartilhado
2022
conhecidas
23+
contém
2124
deduplica
25+
deduplicação
2226
deduplicar
2327
defval
2428
deleta
29+
diferenciar
2530
diferentes
2631
doordash
2732
duplicadas
@@ -31,12 +36,18 @@ encontrada
3136
encontradas
3237
encontrados
3338
específica
39+
Estranha
40+
estranho
41+
executa
42+
existem
3443
expirou
3544
exportacao
3645
exportadas
3746
falhar
47+
falhou
3848
ferramentas
3949
filtra
50+
filtro
4051
filtros
4152
fintech
4253
fluxo
@@ -46,8 +57,10 @@ formato
4657
hotjar
4758
huggingface
4859
ignora
60+
incompleto
4961
inexistente
5062
informada
63+
informado
5164
Iniciando
5265
início
5366
instacart
@@ -59,7 +72,10 @@ klarna
5972
lança
6073
linhas
6174
Localização
75+
maiúsculas
6276
mantém
77+
mesma
78+
minúsculas
6379
momentos
6480
montar
6581
Mostrando
@@ -72,13 +88,17 @@ paginação
7288
palavra
7389
palavras
7490
parseia
91+
partir
7592
pela
7693
pelos
7794
permite
95+
permitindo
7896
planetscale
7997
populado
8098
positivos
99+
preenchidos
81100
presencial
101+
primeira
82102
primeiro
83103
processa
84104
processando
@@ -87,18 +107,25 @@ Publicacao
87107
Quebrada
88108
recente
89109
recupera
110+
recuperado
111+
rejeição
90112
rejeita
91113
Resultado
92114
resultados
93115
retornadas
116+
reutiliza
94117
robinhood
95118
salario
119+
salário
96120
scaleai
121+
segunda
97122
sobrescrever
98123
solicitado
99124
supabase
100125
talvez
126+
tentativa
101127
teste
128+
textuais
102129
themuse
103130
titulo
104131
tiver
@@ -108,9 +135,12 @@ unicas
108135
únicas
109136
unstub
110137
usam
138+
útil
111139
vaga
112140
validos
113141
vazia
114142
vazio
143+
vazios
144+
vierem
115145
wealthfront
116146
weightsbiases

backend/tests/unit/services/adapters/adzuna.test.js

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,168 @@
1+
// import axios from "axios";
2+
// import { beforeEach, describe, expect, it, vi } from "vitest";
3+
// import { createAdzunaAdapter } from "../../../../src/adapters/adzuna.js";
4+
5+
// vi.mock("axios");
6+
7+
// const BASE_CONFIG = {
8+
// searchLocation: "Brasil",
9+
// resultsPerPage: 20,
10+
// pageTimeoutMs: 1000,
11+
// waitBetweenSearchesMs: 0,
12+
// maxPagesPerKeyword: 1,
13+
// };
14+
15+
// describe("createAdzunaAdapter", () => {
16+
// const adapter = createAdzunaAdapter({
17+
// country: "br",
18+
// appId: "test-app-id",
19+
// appKey: "test-app-key",
20+
// });
21+
22+
// beforeEach(() => {
23+
// vi.resetAllMocks();
24+
// });
25+
26+
// it("faz parse das vagas retornadas pela API", async () => {
27+
// axios.get.mockResolvedValueOnce({
28+
// data: {
29+
// results: [
30+
// {
31+
// title: "Frontend React Developer",
32+
// company: { display_name: "ACME" },
33+
// location: { display_name: "São Paulo" },
34+
// redirect_url: "https://adzuna.com/job/1",
35+
// salary_min: 3000,
36+
// salary_max: 5000,
37+
// created: "2026-03-24T10:00:00Z",
38+
// },
39+
// ],
40+
// },
41+
// });
42+
43+
// const jobs = await adapter.search("React", BASE_CONFIG);
44+
45+
// expect(axios.get).toHaveBeenCalledTimes(1);
46+
// expect(jobs).toHaveLength(1);
47+
// expect(jobs[0]).toMatchObject({
48+
// source: "Adzuna",
49+
// keyword: "React",
50+
// titulo: "Frontend React Developer",
51+
// empresa: "ACME",
52+
// local: "São Paulo",
53+
// link: "https://adzuna.com/job/1",
54+
// salario: "3000-5000",
55+
// dataPublicacao: "2026-03-24T10:00:00Z",
56+
// });
57+
// });
58+
59+
// it("usa url alternativa quando redirect_url não existe", async () => {
60+
// axios.get.mockResolvedValueOnce({
61+
// data: {
62+
// results: [
63+
// {
64+
// title: "Node Developer",
65+
// company: { display_name: "Beta" },
66+
// location: { display_name: "Remoto" },
67+
// url: "https://adzuna.com/job/2",
68+
// created: "2026-03-24T11:00:00Z",
69+
// },
70+
// ],
71+
// },
72+
// });
73+
74+
// const jobs = await adapter.search("Node", BASE_CONFIG);
75+
76+
// expect(axios.get).toHaveBeenCalledTimes(1);
77+
// expect(jobs).toHaveLength(1);
78+
// expect(jobs[0]).toMatchObject({
79+
// source: "Adzuna",
80+
// keyword: "Node",
81+
// titulo: "Node Developer",
82+
// empresa: "Beta",
83+
// local: "Remoto",
84+
// link: "https://adzuna.com/job/2",
85+
// salario: "",
86+
// dataPublicacao: "2026-03-24T11:00:00Z",
87+
// });
88+
// });
89+
90+
// it("busca mais de uma página enquanto houver resultados", async () => {
91+
// axios.get
92+
// .mockResolvedValueOnce({
93+
// data: {
94+
// results: [
95+
// {
96+
// title: "React Dev 1",
97+
// company: { display_name: "ACME" },
98+
// location: { display_name: "SP" },
99+
// redirect_url: "https://adzuna.com/job/1",
100+
// },
101+
// ],
102+
// },
103+
// })
104+
// .mockResolvedValueOnce({
105+
// data: {
106+
// results: [
107+
// {
108+
// title: "React Dev 2",
109+
// company: { display_name: "ACME 2" },
110+
// location: { display_name: "RJ" },
111+
// redirect_url: "https://adzuna.com/job/2",
112+
// },
113+
// ],
114+
// },
115+
// });
116+
117+
// const jobs = await adapter.search("React", {
118+
// ...BASE_CONFIG,
119+
// maxPagesPerKeyword: 2,
120+
// });
121+
122+
// expect(axios.get).toHaveBeenCalledTimes(2);
123+
// expect(jobs).toHaveLength(2);
124+
// expect(jobs[0].titulo).toBe("React Dev 1");
125+
// expect(jobs[1].titulo).toBe("React Dev 2");
126+
// });
127+
128+
// it("interrompe a paginação quando a API retorna results vazio", async () => {
129+
// axios.get
130+
// .mockResolvedValueOnce({
131+
// data: {
132+
// results: [
133+
// {
134+
// title: "React Dev 1",
135+
// company: { display_name: "ACME" },
136+
// location: { display_name: "SP" },
137+
// redirect_url: "https://adzuna.com/job/1",
138+
// },
139+
// ],
140+
// },
141+
// })
142+
// .mockResolvedValueOnce({
143+
// data: {
144+
// results: [],
145+
// },
146+
// });
147+
148+
// const jobs = await adapter.search("React", {
149+
// ...BASE_CONFIG,
150+
// maxPagesPerKeyword: 2,
151+
// });
152+
153+
// expect(axios.get).toHaveBeenCalledTimes(2);
154+
// expect(jobs).toHaveLength(1);
155+
// });
156+
157+
// it("lança erro quando a requisição falha", async () => {
158+
// axios.get.mockRejectedValueOnce(new Error("falha na API"));
159+
160+
// await expect(adapter.search("React", BASE_CONFIG)).rejects.toThrow(
161+
// "falha na API",
162+
// );
163+
// });
164+
// });
165+
1166
import axios from "axios";
2167
import { beforeEach, describe, expect, it, vi } from "vitest";
3168
import { createAdzunaAdapter } from "../../../../src/adapters/adzuna.js";
@@ -154,6 +319,108 @@ describe("createAdzunaAdapter", () => {
154319
expect(jobs).toHaveLength(1);
155320
});
156321

322+
it("retorna lista vazia quando results não é array", async () => {
323+
axios.get.mockResolvedValueOnce({
324+
data: {
325+
results: null,
326+
},
327+
});
328+
329+
const jobs = await adapter.search("React", BASE_CONFIG);
330+
331+
expect(jobs).toEqual([]);
332+
});
333+
334+
it("monta salário com apenas salary_min", async () => {
335+
axios.get.mockResolvedValueOnce({
336+
data: {
337+
results: [
338+
{
339+
title: "React Dev",
340+
company: { display_name: "ACME" },
341+
location: { display_name: "SP" },
342+
redirect_url: "https://adzuna.com/job/3",
343+
salary_min: 3000,
344+
},
345+
],
346+
},
347+
});
348+
349+
const jobs = await adapter.search("React", BASE_CONFIG);
350+
351+
expect(jobs).toHaveLength(1);
352+
expect(jobs[0].salario).toBe("3000-");
353+
});
354+
355+
it("monta salário com apenas salary_max", async () => {
356+
axios.get.mockResolvedValueOnce({
357+
data: {
358+
results: [
359+
{
360+
title: "React Dev",
361+
company: { display_name: "ACME" },
362+
location: { display_name: "SP" },
363+
redirect_url: "https://adzuna.com/job/4",
364+
salary_max: 7000,
365+
},
366+
],
367+
},
368+
});
369+
370+
const jobs = await adapter.search("React", BASE_CONFIG);
371+
372+
expect(jobs).toHaveLength(1);
373+
expect(jobs[0].salario).toBe("-7000");
374+
});
375+
376+
it("retorna campos opcionais vazios quando company, location e created não existem", async () => {
377+
axios.get.mockResolvedValueOnce({
378+
data: {
379+
results: [
380+
{
381+
title: "React Dev",
382+
redirect_url: "https://adzuna.com/job/5",
383+
},
384+
],
385+
},
386+
});
387+
388+
const jobs = await adapter.search("React", BASE_CONFIG);
389+
390+
expect(jobs).toHaveLength(1);
391+
expect(jobs[0]).toMatchObject({
392+
titulo: "React Dev",
393+
empresa: "",
394+
local: "",
395+
link: "https://adzuna.com/job/5",
396+
salario: "",
397+
dataPublicacao: "",
398+
});
399+
});
400+
401+
it("monta a URL sem o parâmetro where quando searchLocation não é informado", async () => {
402+
axios.get.mockResolvedValueOnce({
403+
data: {
404+
results: [],
405+
},
406+
});
407+
408+
await adapter.search("React", {
409+
...BASE_CONFIG,
410+
searchLocation: "",
411+
});
412+
413+
expect(axios.get).toHaveBeenCalledTimes(1);
414+
415+
const calledUrl = axios.get.mock.calls[0][0];
416+
expect(calledUrl).toContain("/jobs/br/search/1");
417+
expect(calledUrl).toContain("app_id=test-app-id");
418+
expect(calledUrl).toContain("app_key=test-app-key");
419+
expect(calledUrl).toContain("results_per_page=20");
420+
expect(calledUrl).toContain("what=React");
421+
expect(calledUrl).not.toContain("where=");
422+
});
423+
157424
it("lança erro quando a requisição falha", async () => {
158425
axios.get.mockRejectedValueOnce(new Error("falha na API"));
159426

0 commit comments

Comments
 (0)