-
Notifications
You must be signed in to change notification settings - Fork 765
Expand file tree
/
Copy pathcep-timeout.test.js
More file actions
64 lines (58 loc) · 2.17 KB
/
Copy pathcep-timeout.test.js
File metadata and controls
64 lines (58 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// tests/cep-timeout.test.js
// Testa que updateOpenCep NÃO bloqueia a resposta quando OpenCEP falha.
// Mocka o axios para simular OpenCEP fora do ar e mede a latência real do fetchCep.
import axios from 'axios';
import { describe, expect, it, vi } from 'vitest';
import { fetchCep } from '../services/cep/cep';
vi.mock('axios');
describe('fetchCep — updateOpenCep não deve bloquear a resposta', () => {
it('responde em menos de 4s mesmo com OpenCEP + update indisponíveis', async () => {
// Simula: opencep.com/v1 NÃO responde (timeout de 3s)
// update.opencep.com NÃO responde (timeout de 3s)
// viacep (fallback) responde normalmente
axios.get.mockImplementation((url) => {
if (url.includes('opencep.com')) {
// OpenCEP fora do ar — nunca resolve (timeout do axios = 3s)
return new Promise((_, reject) => {
setTimeout(() => {
reject(
Object.assign(new Error('timeout'), { code: 'ECONNABORTED' })
);
}, 3000);
});
}
if (url.includes('viacep.com.br')) {
// ViaCEP (fallback) — responde rápido
return Promise.resolve({
data: {
cep: '05010000',
uf: 'SP',
localidade: 'São Paulo',
bairro: 'Perdizes',
logradouro: 'Rua Caiubi',
},
});
}
if (url.includes('update.opencep.com')) {
// Update também fora do ar
return new Promise((_, reject) => {
setTimeout(() => {
reject(
Object.assign(new Error('timeout'), { code: 'ECONNABORTED' })
);
}, 3000);
});
}
return Promise.reject(new Error(`unexpected URL: ${url}`));
});
const start = Date.now();
const result = await fetchCep('05010000');
const elapsed = Date.now() - start;
// Deve retornar o CEP pelos fallbacks
expect(result.cep).toBe('05010000');
expect(result.city).toBe('São Paulo');
// O updateOpenCep NÃO deve bloquear — resposta < 4s
// (3s do fetchOpenCep + ~0.5s dos fallbacks, sem os 3s extras do update)
expect(elapsed).toBeLessThan(4000);
}, 10000);
});