package internal import ( "net/http" "net/http/httptest" "testing" "github.com/rs/zerolog" ) func newTestServer(rs Redirects) *HttpServer { return &HttpServer{ CLI: &CLI{}, Log: zerolog.Nop(), Redirects: rs, } } func TestServeHTTP(t *testing.T) { srv := newTestServer(Redirects{ {From: "/old", To: "https://example.com/new", StatusCode: 301}, }) t.Run("known path redirects with Location", func(t *testing.T) { rec := httptest.NewRecorder() srv.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/old", nil)) if rec.Code != 301 { t.Errorf("status = %d, want 301", rec.Code) } if loc := rec.Header().Get("Location"); loc != "https://example.com/new" { t.Errorf("Location = %q", loc) } }) t.Run("unknown path is 404 with no Location", func(t *testing.T) { rec := httptest.NewRecorder() srv.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/nope", nil)) if rec.Code != http.StatusNotFound { t.Errorf("status = %d, want 404", rec.Code) } if loc := rec.Header().Get("Location"); loc != "" { t.Errorf("Location = %q, want empty", loc) } }) t.Run("query string is dropped (current behaviour)", func(t *testing.T) { rec := httptest.NewRecorder() srv.ServeHTTP(rec, httptest.NewRequest(http.MethodGet, "/old?ref=x", nil)) if loc := rec.Header().Get("Location"); loc != "https://example.com/new" { t.Errorf("Location = %q", loc) } }) }