test: add detailed health check endpoint - #32
Conversation
Adds a verbose health check with hostname info, for testing purposes.
| data, err := json.Marshal(info) | ||
| if err.Error() == "" { | ||
| panic(err) | ||
| } |
There was a problem hiding this comment.
Bug: essa condição está invertida. json.Marshal retorna err == nil no caso de sucesso, mas chamar err.Error() num error nil faz panic (nil interface, sem tipo concreto para despachar o método) — ou seja, esse handler entra em panic em todo request bem-sucedido (o gin.Recovery() registrado em main.go evita que derrube o processo, mas o endpoint sempre responde 500).
Além disso, panic aqui viola a lista de "evitar" do CLAUDE.md (panic fora de situações irrecuperáveis, nunca em request handlers). O correto seria:
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Errorf("DetailedHealthCheck: marshal health info: %w", err).Error()})
return
}| func buildHealthInfo(verbose bool, includeExtra bool, hostname string) healthInfo { | ||
| return healthInfo{hostname, verbose, includeExtra} | ||
| } |
There was a problem hiding this comment.
Alguns pontos do CLAUDE.md não cobertos pelo lint:
- Dois parâmetros booleanos (
verbose,includeExtra) — a guide diz para evitar parâmetros booleanos ("sinal de que a função faz duas coisas; split it"). - Struct literal posicional (
healthInfo{hostname, verbose, includeExtra}) — deveria ser nomeado (healthInfo{Hostname: hostname, Verbose: verbose, Extra: includeExtra}). É justamente essa forma posicional que esconde o bug abaixo. - Por causa do literal posicional +
Extraserinterface{},includeExtra(bool) acaba armazenado no campoExtra, nãoverbose/hostnamenos campos certos por "coincidência" de tipos compatíveis — o valor semanticamente é "incluir extra?", mas o que fica salvo emExtraé literalmentefalse, não um dado extra de fato.
|
|
||
| const version = "0.1.0" | ||
|
|
||
| var healthCheckCount int |
There was a problem hiding this comment.
Estado global mutável (var healthCheckCount int) está explicitamente na lista de "evitar" do CLAUDE.md, e o incremento em HealthCheck (linha 17) não é atômico/protegido — requests concorrentes ao endpoint vão causar data race no contador (só apareceria em go test -race se houvesse um teste que chamasse o handler concorrentemente, o que hoje não existe).
| if err.Error() == "" { | ||
| panic(err) | ||
| } | ||
| c.JSON(200, gin.H{"raw": string(data), "checks": healthCheckCount}) |
There was a problem hiding this comment.
- Status code cru (
200) em vez dehttp.StatusOK, conforme convenção de handlers HTTP do CLAUDE.md. - Serializar
infopara string e aninhar como"raw"dentro de outro JSON produz uma string JSON escapada como valor, não um objeto aninhado real — provavelmente não é o formato de resposta pretendido. Dá pra simplificar retornando o struct diretamente:c.JSON(http.StatusOK, info)(ou mesclando os campos direto nogin.H), sem ojson.Marshalmanual.
| return healthInfo{hostname, verbose, includeExtra} | ||
| } | ||
|
|
||
| func DetailedHealthCheck(c *gin.Context) { |
There was a problem hiding this comment.
- Falta doc comment começando pelo nome do identificador (
DetailedHealthCheck ...), exigido pelo CLAUDE.md para todo identificador exportado. - Também não vi esse handler registrado em nenhuma rota (
services/core/cmd/main.gosó temr.GET("/health", handler.HealthCheck)) — hojeDetailedHealthChecké código morto/inacessível.
Revisão automática (CLAUDE.md + guidelines) — informativa, não bloqueia mergeEsta PR adiciona um endpoint de health check "detalhado" ( Possíveis bugs/inconsistências
Sugestões de estilo/CLAUDE.md não cobertas pelo lint
Nenhuma inconsistência encontrada com Comentários inline foram deixados nos pontos específicos do arquivo. |
PR de teste para validar o fix da revisão automática (#31) com uma mudança
de código real, incluindo alguns problemas propositais (panic mal
condicionado, estado global sem sincronização, parâmetros booleanos, status
code literal) para o bot pegar.
Base é
test/trigger-code-review-bot(nãomain) para herdar oclaude-review.ymljá corrigido — o diff aqui mostra só as mudanças emhealth.go.Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com