Jest · fixture · ViaCEP mock

Gerador de CEP em Jest

Fixture pra CEP brasileiro em testes Jest. globalSetup, mock ViaCEP API, teste E2E de frete.

npm install --save-dev fakeforge-br

Fixture com cache

// tests/fixtures/cep-fixture.ts
import { FakeForge } from "fakeforge-br"

const ff = new FakeForge()
let cache: string[] | null = null

export async function getCEPs(qty = 20): Promise<string[]> {
  if (!cache || cache.length < qty) {
    cache = await ff.cep(Math.max(qty, 100))
  }
  return cache.slice(0, qty)
}

// Retorna CEP + endereço completo
export async function getCEPComEndereco() {
  const [e] = await ff.address(1)
  return e
}

Teste — validador CEP

// tests/cep-validator.test.ts
import { getCEPs } from "./fixtures/cep-fixture"
import { validarCEP } from "../src/validators"

describe("CEP validator", () => {
  test.each(await getCEPs(10))("aceita %s", (cep) => {
    expect(validarCEP(cep)).toBe(true)
  })

  test("rejeita CEPs inválidos", () => {
    expect(validarCEP("00000-000")).toBe(false)
    expect(validarCEP("")).toBe(false)
    expect(validarCEP("abc")).toBe(false)
  })
})

Mock ViaCEP

// tests/viacep.test.ts
import { getCEPComEndereco } from "./fixtures/cep-fixture"

// Mock global do fetch pra ViaCEP
global.fetch = jest.fn().mockImplementation((url) => {
  const match = url.match(/viacep\.com\.br\/ws\/(\d+)/)
  const cep = match?.[1] || ""
  return Promise.resolve({
    ok: true,
    json: () => Promise.resolve({
      cep, logradouro: "Rua Mock", bairro: "Mock", localidade: "Cidade", uf: "SP",
    }),
  })
})

test("consulta ViaCEP com CEP do fakeforge", async () => {
  const endereco = await getCEPComEndereco()
  const res = await fetch(`https://viacep.com.br/ws/${endereco.cep.replace(/\D/g, '')}/json/`)
  const data = await res.json()
  expect(data.uf).toBe("SP")
})