package server import ( "context" "encoding/json" "log/slog" "net/http" "net/http/httptest" "path/filepath" "testing" "gitea.lab.audasmedia.com.au/sam/email_agent/internal/config" "gitea.lab.audasmedia.com.au/sam/email_agent/internal/store" ) func newTestServer(t *testing.T) *Server { t.Helper() cfg := &config.Config{ Env: "test", Addr: ":0", DBPath: filepath.Join(t.TempDir(), "email_agent.db"), LogLevel: "error", } st, err := store.Open(context.Background(), cfg.DBPath) if err != nil { t.Fatalf("store.Open() error = %v", err) } t.Cleanup(func() { _ = st.Close() }) srv, err := New(cfg, st, slog.New(slog.DiscardHandler)) if err != nil { t.Fatalf("New() error = %v", err) } return srv } func TestHealthOK(t *testing.T) { srv := newTestServer(t) req := httptest.NewRequest(http.MethodGet, "/health", nil) rec := httptest.NewRecorder() srv.Handler().ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) } var body map[string]any if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil { t.Fatalf("decode body: %v", err) } if body["status"] != "ok" { t.Errorf("status field = %v, want ok", body["status"]) } } func TestReadyz(t *testing.T) { srv := newTestServer(t) req := httptest.NewRequest(http.MethodGet, "/readyz", nil) rec := httptest.NewRecorder() srv.Handler().ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) } } func TestIndexRendersHTML(t *testing.T) { srv := newTestServer(t) req := httptest.NewRequest(http.MethodGet, "/", nil) rec := httptest.NewRecorder() srv.Handler().ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) } if ct := rec.Header().Get("Content-Type"); ct == "" { t.Error("Content-Type header is empty") } }