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.
`
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)
}
}