Capítulo 31
Go: API do Ateliê
2 min de leitura 393 palavras 1 gravura
Neste capítulo você vai expor GET/POST /oficinas em memória com testes. O projeto-fio é o Ateliê Boa Viagem, ateliê digital fictício em Boa Viagem, Recife.
Seu ponto de partida
Use o exemplo 31-go-api do pacote anexo e copie inicio/ para uma pasta de prática fora do original. A raiz do exemplo é a referência completa desta etapa.
Use servidor só em 127.0.0.1 quando o README do exemplo pedir HTTP local. Abrir ou testar não publica nada.
Como praticar
Leia → copie ou digite → mude uma coisa → preveja → salve → recarregue → confira. Restaure cada experiência antes da próxima. Faça as atividades antes de abrir as respostas comentadas.

API mínima
Lista em memória. GET devolve JSON. POST valida nome.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
type Oficina struct {
ID int `json:"id"`
Nome string `json:"nome"`
}
Mude uma coisa e preveja
Rejeite nome curto com 400.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
Teste cobre o caso.
Se não acontecer
Encode/decode encoding/json.
Tabela de testes
Use subtestes para vários nomes inválidos.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
cases := []string{"", "ab"}
for _, c := range cases {
t.Run(c, func(t *testing.T) { /* POST */ })
}
Mude uma coisa e preveja
Inclua um caso válido.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
201 no válido.
Se não acontecer
Separe handler para injetar store.
Fechar o módulo Go
Você praticou TDD e HTTP. Para UI rica, combine com o front React do início — sempre local.
Faça na sua cópia
Confira o trecho no contexto do exemplo antes de mudar.
Go API + React estático
Mude uma coisa e preveja
Esboce no papel essa combinação.
Anote o que espera observar antes de salvar e recarregar.
Recarregue e confira
Esboço pronto para o fechamento.
Se não acontecer
Não precisa implementar a junção agora.
Atividades
Atividade 1
Onde estão os dados deste volume?
Atividade 2
Qual status de POST ok?
Atividade 3
Por que subtestes?
Respostas comentadas
Resposta da atividade 1
Memória do processo.
Resposta da atividade 2
201
Resposta da atividade 3
Organizar vários casos com falha isolada.
O arquivo completo
Referência do exemplo 31-go-api, reproduzida aqui para que você possa conferir sem sair da página.
main_test.go
package main
import (
"bytes"
"net/http"
"net/http/httptest"
"testing"
)
func TestPostCurto(t *testing.T) {
req := httptest.NewRequest(http.MethodPost, "/oficinas", bytes.NewBufferString(`{"nome":"ab"}`))
rr := httptest.NewRecorder()
oficinasHandler(rr, req)
if rr.Code != 400 {
t.Fatalf("esperado 400, veio %d", rr.Code)
}
}