package main import ( "log/slog" "net/http/httptest" "os" "strings" "testing" "github.com/peter-evans/patience" ) func newHandler() handler { return handler{ logger: slog.New(slog.NewTextHandler(os.Stderr, nil)), domain: "lex.example", countries: map[string]country{ "zu": country{ Name: "Zubrowka", SearchURL: "https://lex.gov.zu/?search=%s", }, }, lawsByCC: map[string]map[string]law{}, } } func TestStartPage(t *testing.T) { h := newHandler() req := httptest.NewRequest("GET", "/", nil) req.Host = "lex.example" w := httptest.NewRecorder() h.handle(w, req) resp := w.Result() if resp.StatusCode != 200 { t.Errorf("expected status 200 OK, got %d", resp.StatusCode) } expected := ` Lex.surf: Portal to National Law

The portal to national law.

ZU
` assertEqual(t, w.Body.String(), expected) } func TestSearch(t *testing.T) { h := newHandler() req := httptest.NewRequest("GET", "/", nil) req.Host = "zu.lex.example" w := httptest.NewRecorder() h.handle(w, req) resp := w.Result() if resp.StatusCode != 200 { t.Errorf("expected status 200 OK, got %d", resp.StatusCode) } expected := ` National Law of Zubrowka

National Law of Zubrowka

` assertEqual(t, w.Body.String(), expected) } func TestSearchRedirect(t *testing.T) { h := newHandler() req := httptest.NewRequest("GET", "/?q=tourism", nil) req.Host = "zu.lex.example" w := httptest.NewRecorder() h.handle(w, req) resp := w.Result() if resp.StatusCode != 302 { t.Errorf("expected status 302, got %d", resp.StatusCode) } if resp.Header.Get("Location") != "https://lex.gov.zu/?search=tourism" { t.Errorf("wrong location, got %s", resp.Header.Get("Location")) } } func TestLawRedirect(t *testing.T) { h := newHandler() h.lawsByCC["zu"] = map[string]law{} h.lawsByCC["zu"]["zepl"] = law{ URL: "https://lex.gov.zu/zeppelin-code", } req := httptest.NewRequest("GET", "/zepl", nil) req.Host = "zu.lex.example" w := httptest.NewRecorder() h.handle(w, req) resp := w.Result() if resp.StatusCode != 302 { t.Errorf("expected status 302, got %d", resp.StatusCode) } if resp.Header.Get("Location") != "https://lex.gov.zu/zeppelin-code" { t.Errorf("wrong location, got %s", resp.Header.Get("Location")) } } func assertEqual(t *testing.T, received string, expected string) { if received != expected { a := strings.Split(received, "\n") b := strings.Split(expected, "\n") diffs := patience.Diff(a, b) unidiff := patience.UnifiedDiffText(diffs) t.Error(unidiff) } }