pytest · conftest · Correios

Gerador de Endereço em pytest

Fixture pytest com endereço brasileiro. Session fixture, conftest.py, pytest-django, mock de Correios API pra teste de frete.

pip install fakeforge-br pytest pytest-mock

conftest.py

# tests/conftest.py
import pytest
from fakeforge import FakeForge

@pytest.fixture(scope="session")
def ff():
    return FakeForge()

@pytest.fixture(scope="session")
def enderecos(ff):
    return ff.address(100)

@pytest.fixture(scope="session")
def enderecos_por_uf(enderecos):
    grupos = {}
    for e in enderecos:
        grupos.setdefault(e["estado"], []).append(e)
    return grupos

@pytest.fixture
def endereco_sp(enderecos_por_uf):
    return enderecos_por_uf.get("SP", [None])[0]

Teste de frete Django

# tests/test_frete.py
import pytest
from myapp.frete import CalculadoraFrete

@pytest.mark.django_db
class TestFrete:
    def test_frete_sp_barato(self, endereco_sp):
        if endereco_sp is None:
            pytest.skip("Sem endereço SP no cache")
        valor = CalculadoraFrete.calcular(cep=endereco_sp["cep"], peso_kg=2)
        assert 0 < valor < 50

    def test_frete_todas_regioes(self, enderecos_por_uf):
        for uf, enderecos in enderecos_por_uf.items():
            if not enderecos:
                continue
            e = enderecos[0]
            valor = CalculadoraFrete.calcular(cep=e["cep"], peso_kg=1)
            assert valor > 0, f"Frete negativo pra {uf}"

Mock Correios API

# tests/test_correios_service.py
class TestCorreiosService:
    @pytest.fixture(autouse=True)
    def mock_correios(self, mocker):
        return mocker.patch(
            "myapp.correios.CorreiosClient.consultar_cep",
            return_value={"logradouro": "Mock Rua", "cidade": "Mock", "uf": "SP"}
        )

    def test_service_consulta_cep(self, endereco_sp, mock_correios):
        from myapp.endereco.service import EnderecoService
        service = EnderecoService()
        result = service.consultar(endereco_sp["cep"])
        assert result["uf"] == "SP"
        mock_correios.assert_called_once()