package handler import ( "context" "errors" "io" "log/slog" "net/http" "net/http/httptest" "net/url" "strings" "testing" "todo-hetzner/app/internal/model" ) type fakeStore struct { todos []model.Todo created string toggled int64 deleted int64 pingErr error } func (s *fakeStore) List(context.Context) ([]model.Todo, error) { return s.todos, nil } func (s *fakeStore) Create(_ context.Context, title string) error { s.created = title return nil } func (s *fakeStore) Toggle(_ context.Context, id int64) (bool, error) { s.toggled = id return id != 404, nil } func (s *fakeStore) Delete(_ context.Context, id int64) (bool, error) { s.deleted = id return id != 404, nil } func (s *fakeStore) Ping(context.Context) error { return s.pingErr } func testHandler(t *testing.T, store *fakeStore) http.Handler { t.Helper() h, err := New(store, slog.New(slog.NewTextHandler(io.Discard, nil))) if err != nil { t.Fatal(err) } return h.Routes() } func TestListRendersEscapedTodos(t *testing.T) { router := testHandler(t, &fakeStore{todos: []model.Todo{{ID: 1, Title: ""}}}) recorder := httptest.NewRecorder() router.ServeHTTP(recorder, httptest.NewRequest(http.MethodGet, "/", nil)) if recorder.Code != http.StatusOK { t.Fatalf("status = %d", recorder.Code) } if strings.Contains(recorder.Body.String(), "