Pular para o conteúdo
murad.guide

Aplicações Web

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.

Mapa visual de Go: API do Atelie

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)
        }
}