Skip to content

feat: adiciona teste end-to-end local via make e2e - #212

Open
ricardosilva86 wants to merge 2 commits into
mainfrom
feat/e2e-local
Open

ricardosilva86 wants to merge 2 commits into
mainfrom
feat/e2e-local

Conversation

@ricardosilva86

Copy link
Copy Markdown
Collaborator

Por que

go test ./... hoje não prova quase nada:

internal/k8s        [no test files]   <- ~630 linhas que falam com o cluster
internal/repo       [no test files]
internal/lab        [no test files]
cmd                 [no test files]
internal/templates  ok                <- único pacote com testes

O único teste existente valida que os manifests embutidos são YAML válido no nível externo. Nada exercita create cluster, list labs ou status. A suíte passa mesmo que o girus create cluster esteja completamente quebrado.

O que entra

make e2e sobe um cluster Kind de verdade, implanta o Girus, valida e remove o cluster. Sete etapas: pré-requisitos, build, criação do cluster, espera dos deployments, validação dos templates, comandos do CLI, resultado.

make e2e                 # ciclo completo, remove o cluster no final
E2E_KEEP=1 make e2e      # mantém o cluster de pé para inspeção
E2E_FORCE=1 make e2e     # remove um cluster girus preexistente antes

Decisões que valem registro

Usa make build, nunca go build. Sem os ldflags, common.Version fica vazio, IsNewerVersion() lê como 0.0.0 e o create cluster abre o prompt de auto-atualização. Com stdin fechado o ReadString devolve "", que cmd/create.go:78 trata como SIM — o teste atualizaria o próprio binário e sairia com os.Exit(0), passando verde sem testar nada.

Compara ConfigMaps aplicados com templates efetivamente carregados. Divergência de schema falha em silêncio: o ConfigMap existe, o backend descarta o lab, e nada aparece na UI. É exatamente o padrão das issues #209 e #210.

Não executa girus stop/girus start. O start não restabelece o port-forward (issues #202 e #208), então o passo falharia sempre. Há um comentário no script para incluí-lo como teste de regressão quando a correção entrar.

Segurança: recusa rodar se já existir um cluster girus (use E2E_FORCE=1), e remove o cluster via trap mesmo em caso de falha (use E2E_KEEP=1 para manter).

Bug real encontrado na primeira execução

O teste reportou 26 ConfigMaps aplicados e apenas 25 carregados. O log do backend:

Erro ao desserializar template lab.yaml:
yaml: line 202: did not find expected '-' indicator

Causa: aspas duplas não escapadas em torno de "dorme" em internal/templates/manifests/lab_11_linux_comandos-basicos.yaml. Essa é a cópia embutida no binário, aplicada por girus create cluster em toda instalação nova.

O PR #198 corrige apenas labs/linux_comandos-basicos/lab.yaml. A cópia embutida é byte-idêntica e seguia quebrada. Corrigida aqui — as duas precisam do mesmo ajuste.

Verificação

Kind v0.33.0, Docker 29.2.1, macOS arm64:

[5/7] Validando os templates de laboratorio
  OK: 26 ConfigMaps de laboratorio aplicados
  OK: backend carregou 26 templates
[6/7] Exercitando os comandos do CLI
  OK: 'girus list labs' respondeu
  OK: 'girus status' respondeu

E2E PASSOU -- 26 laboratorios aplicados, 26 carregados pelo backend

Antes da correção do lab: AVISO: 26 ConfigMaps aplicados, mas so 25 carregados. Ciclo completo leva ~2 minutos com as imagens em cache.

Próximo passo sugerido

Promover isso para um workflow no CI, rodando em PRs que tocam cmd/ ou internal/k8s/. Vale esperar o PR #172 (flag --tag) para fixar a tag das imagens: hoje o teste depende de linuxtips/girus-backend:latest, que não é controlado por este repositório — um push ruim deixaria o e2e vermelho sem nada de errado no código (foi o que aconteceu na issue #171).

🤖 Generated with Claude Code

Hoje `go test ./...` nao prova quase nada: so internal/templates tem
testes, e todo o internal/k8s (~630 linhas que falam com o cluster) nunca
e executado. A suite passa mesmo com `girus create cluster` quebrado.

O `make e2e` sobe um cluster Kind de verdade, implanta o Girus, valida
backend, frontend e templates, e remove o cluster no final.

Etapas: pre-requisitos, build, create cluster, espera dos deployments,
validacao dos templates, comandos do CLI, resultado.

Detalhes que valem registro:

- Usa `make build`, nunca `go build`. Sem os ldflags, common.Version fica
  vazio, IsNewerVersion() le como 0.0.0 e o create cluster abre o prompt
  de auto-atualizacao. Com stdin fechado o ReadString devolve "", que
  cmd/create.go:78 trata como SIM: o teste atualizaria o proprio binario
  e sairia com os.Exit(0), passando sem testar nada.

- Compara ConfigMaps aplicados com templates efetivamente carregados pelo
  backend. Divergencia de schema falha em silencio -- o ConfigMap existe,
  o backend descarta o lab e nada aparece na UI (issues #209 e #210).

- Nao executa `girus stop`/`girus start`: o start nao restabelece o
  port-forward (issues #202 e #208), entao falharia sempre. Incluir como
  teste de regressao quando a correcao entrar.

- Recusa rodar se ja existir um cluster 'girus' (E2E_FORCE=1 ignora) e
  remove o cluster via trap mesmo em caso de falha (E2E_KEEP=1 mantem).

Na primeira execucao o teste encontrou um bug real: 26 ConfigMaps
aplicados, 25 carregados. O backend registrava

  Erro ao desserializar template lab.yaml:
  yaml: line 202: did not find expected '-' indicator

Causa: aspas duplas nao escapadas em torno de "dorme" na copia embutida
de lab_11_linux_comandos-basicos.yaml, que e a que vai dentro do binario
e e aplicada por `girus create cluster`. O PR #198 corrige apenas a copia
em labs/, entao a versao embutida seguia quebrada. Corrigido aqui.

Verificacao local (Kind v0.33.0, Docker 29.2.1):

  make e2e
  E2E PASSOU -- 26 laboratorios aplicados, 26 carregados pelo backend

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Duas mudancas recentes entraram sem documentacao:

- o requisito de Go 1.26, que veio junto com o bump do k8s.io para 0.37.0
- o alvo `make e2e`, adicionado neste mesmo PR

Adicionado em README.md e README.es.md:

- Nota de pre-requisito de Go 1.26 na secao de compilacao, explicando de
  onde vem a exigencia e que CI e Dockerfile seguem a mesma versao.

- Secao "Testes" separando as duas camadas: os testes unitarios, que sao
  rapidos mas hoje so cobrem internal/templates, e o `make e2e`, que e o
  unico que exercita o caminho completo do CLI. Fica explicito que
  `go test ./...` passa mesmo com o `create cluster` quebrado, para
  ninguem confundir suite verde com binario funcional.

- Pre-requisitos do e2e, as sete etapas validadas, as variaveis
  E2E_KEEP e E2E_FORCE, a saida esperada e os tempos de execucao.

- Aviso para usar `make build` em vez de `go build` sem flags: sem os
  ldflags o binario reporta `dev` e o create cluster abre o prompt de
  auto-atualizacao.

- Recomendacao de rodar `make e2e` antes de publicar uma release.

O README.es.md tambem ganhou a secao de gerenciamento de dependencias,
que existia so na versao em portugues.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ricardosilva86 ricardosilva86 added enhancement New feature or request ready-to-merge PR is ready to be merged into main labels Sep 25, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request ready-to-merge PR is ready to be merged into main

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant