Jest · fixture · Correios

Gerador de Endereço em Jest

Fixture pra endereço brasileiro em testes Jest. Session fixture, globalSetup, mock de Correios pra teste de frete E2E.

npm install --save-dev fakeforge-br

// tests/fixtures/endereco.ts
import { FakeForge } from "fakeforge-br"
export const ff = new FakeForge()

Fixture com filtro por UF

// tests/fixtures/endereco-fixture.ts
import { FakeForge, Address } from "fakeforge-br"

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

async function ensureCache() {
  if (!cache || cache.length < 100) {
    cache = await ff.address(200)
  }
  return cache
}

export async function getEnderecos(qty = 20): Promise<Address[]> {
  const c = await ensureCache()
  return c.slice(0, qty)
}

export async function getEnderecoPorUF(uf: string): Promise<Address> {
  const c = await ensureCache()
  const found = c.find(e => e.estado === uf)
  if (found) return found
  // Se cache não tem, chama API 5x pra achar
  for (let i = 0; i < 5; i++) {
    const [e] = await ff.address(20)
    if (e.estado === uf) return e
  }
  throw new Error(`Nenhum endereço ${uf}`)
}

Teste — frete por CEP

// tests/frete.test.ts
import { getEnderecos, getEnderecoPorUF } from "./fixtures/endereco-fixture"
import { CalculadoraFrete } from "../src/frete"

describe("CalculadoraFrete", () => {
  test("calcula frete pra endereço SP", async () => {
    const e = await getEnderecoPorUF("SP")
    const valor = await CalculadoraFrete.calcular({ cep: e.cep, peso_kg: 2 })
    expect(valor).toBeGreaterThan(0)
    expect(valor).toBeLessThan(50) // SP tem frete barato
  })

  test("calcula frete pra endereço AM (mais caro)", async () => {
    const e = await getEnderecoPorUF("AM")
    const valor = await CalculadoraFrete.calcular({ cep: e.cep, peso_kg: 2 })
    expect(valor).toBeGreaterThan(30) // Amazonas tem frete mais caro
  })
})

Mock de Correios API

// tests/correios-mock.test.ts
import { getEnderecos } from "./fixtures/endereco-fixture"

jest.mock("../src/correios.client", () => ({
  CorreiosClient: jest.fn(() => ({
    consultarCep: jest.fn().mockImplementation((cep) => Promise.resolve({
      cep,
      logradouro: "Rua Mock",
      cidade: "Cidade Mock",
      uf: "SP",
    })),
  })),
}))

test("service consulta Correios API", async () => {
  const { EnderecoService } = await import("../src/endereco.service")
  const [e] = await getEnderecos(1)

  const service = new EnderecoService()
  const result = await service.consultar(e.cep)
  expect(result.cep).toBe(e.cep)
})