Pular para conteúdo

Como buildar e testar

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-14

Pré-requisitos (JDK 25 no JAVA_HOME, Docker) e como subir o app: Como rodar.

Testes

./gradlew test                                   # todos; exige Docker (Testcontainers)
./gradlew test --tests "br.com.xadm.integracao.central.login.PabastLoginControllerTest"
./gradlew check                                  # o gate da CI: checkstyle, testes, ArchUnit e cobertura

Postgres de teste

Um container só (postgres:18-alpine, com os dados em tmpfs) serve a JVM de teste inteira: é o singleton PostgresTestResource da xadm-comum-teste, e o Flyway migra o schema uma vez. A primeira classe leva uns 20 s, que é a subida do container; as seguintes reusam o banco. Não há como apontar os testes para um banco externo.

Teste de integração estende o IntegracaoComPostgres da xadm-comum-teste (@TestInstance(PER_CLASS) e PostgresTestPropertyProvider). Antes de cada teste ela esvazia todas as tabelas do schema public, menos o histórico do Flyway; o seed vai no @BeforeEach da própria classe, que roda depois da limpeza. Regra da casa em Java/Micronaut, Testes.

  • Exceção: os testes de linha do tempo de migração (V11, V13 e V14) sobem container próprio, porque migram um schema do zero até um alvo e semeiam dado legado no meio.
  • Armadilha: o TestPropertyProvider do Micronaut estende Supplier, então a classe de teste não pode declarar um método get() — e um import static de WireMock.get fica escondido pelo herdado.

Travas

Teste que trava vira falha em vez de segurar o CI: 2 min por teste (junit-platform.properties, desligado sob debug), 15 min para a task test e 5 s para obter conexão do pool de teste.

Cobertura

O check imprime a cobertura de linhas (JaCoCo) ao final — visível, não bloqueante: piso bloqueante seria opt-in, por decisão em decisoes/. A jacoco.toolVersion precisa ser ≥ 0.8.15, porque as anteriores não instrumentam o class major do Java 25 e geram um falso 0%. O denominador exclui o código gerado ($Introspection, $Definition, $Intercepted e os Serde* do micronaut-serde).

Os pontos de maior risco têm teste dedicado: JwtServiceTest (emissão e JWKS com alg=RS256), AesCipherTest (round-trip e adulteração), PabastPasswordHasherTest (compatibilidade com os hashes de produção) e RateLimiterTest (limites e extração de IP).

Transporte de e-mail, sem Docker. SmtpEmailSenderSocketTest sobe um SMTP de mentira num ServerSocket local (diálogo, dot-stuffing, recusa 5xx, host fora do ar), e ResendEmailSenderTest aponta o RESEND_ENDPOINT para um WireMock (payload, header Authorization, 2xx, 4xx/5xx, conexão recusada). O NewAccessRequestNotifierTest prova o fail-open: transporte estourando não derruba o login.

Build

./gradlew shadowJar                                      # jar executável em build/libs/app.jar
docker build -t central-backend .                        # imagem JVM, para build e diagnóstico locais
docker build -f Dockerfile.native -t central-backend:native-test .   # a imagem de produção

Produção é native-only (decisão 0030): a CI builda o Dockerfile.native e publica a imagem; o Coolify só a puxa.