package httptransport_test import ( "encoding/json" "io" "log/slog" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "go.opentelemetry.io/otel/trace/noop" "switchbot-api/internal/app/observability" "switchbot-api/internal/domain/health" "switchbot-api/internal/domain/hello" httptransport "switchbot-api/internal/transport/http" "switchbot-api/internal/transport/http/handlers" ) func TestHealthz(t *testing.T) { router := newTestRouter() req := httptest.NewRequest(http.MethodGet, "/healthz", nil) rec := httptest.NewRecorder() router.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("expected status %d, got %d", http.StatusOK, rec.Code) } var body map[string]string if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil { t.Fatalf("failed to unmarshal response: %v", err) } if body["status"] != "ok" { t.Fatalf("expected status=ok, got %q", body["status"]) } } func TestHello(t *testing.T) { router := newTestRouter() req := httptest.NewRequest(http.MethodGet, "/hello", nil) rec := httptest.NewRecorder() router.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("expected status %d, got %d", http.StatusOK, rec.Code) } var body map[string]string if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil { t.Fatalf("failed to unmarshal response: %v", err) } if body["message"] != "hello world" { t.Fatalf("expected message=hello world, got %q", body["message"]) } } func newTestRouter() *gin.Engine { gin.SetMode(gin.TestMode) logger := slog.New(slog.NewJSONHandler(io.Discard, nil)) registry := observability.NewRegistry() httpMetrics := observability.NewHTTPMetrics(registry) healthHandler := handlers.NewHealthHandler(health.NewReadinessUsecase(nil)) helloHandler := handlers.NewHelloHandler(hello.NewService()) return httptransport.NewRouter(httptransport.Dependencies{ Logger: logger, Tracer: noop.NewTracerProvider().Tracer("test"), HTTPMetrics: httpMetrics, PrometheusHandler: observability.NewPrometheusHandler(registry), HealthHandler: healthHandler, HelloHandler: helloHandler, }) }