package human_test import ( "encoding/json" "fmt" "testing" "time" "git.anhgelus.world/anhgelus/go-human.json" ) func TestURL_Json(t *testing.T) { var r human.URL err := json.Unmarshal([]byte(`"http://example.com"`), &r) if err != nil { t.Fatal(err) } if r.Scheme != "http" { t.Errorf("invalid scheme: %s", r.Scheme) } if r.Host != "example.com" { t.Errorf("invalid host: %s", r.Host) } if r.Path != "" { t.Errorf("invalid path: %s", r.Path) } err = json.Unmarshal([]byte(`"http://example.com:80/"`), &r) if err != nil { t.Fatal(err) } if r.Scheme != "http" { t.Errorf("invalid scheme: %s", r.Scheme) } if r.Host != "example.com" { t.Errorf("invalid host: %s", r.Host) } if r.Path != "" { t.Errorf("invalid path: %s", r.Path) } err = json.Unmarshal([]byte(`"https://foo.example.com:443/hello/world/"`), &r) if err != nil { t.Fatal(err) } if r.Scheme != "https" { t.Errorf("invalid scheme: %s", r.Scheme) } if r.Host != "foo.example.com" { t.Errorf("invalid host: %s", r.Host) } if r.Path != "/hello/world" { t.Errorf("invalid path: %s", r.Path) } err = json.Unmarshal([]byte(`"https://example.com:80/hello/world/?foo=bar"`), &r) if err != nil { t.Fatal(err) } if r.Scheme != "https" { t.Errorf("invalid scheme: %s", r.Scheme) } if r.Host != "example.com:80" { t.Errorf("invalid host: %s", r.Host) } if r.Path != "/hello/world" { t.Errorf("invalid path: %s", r.Path) } } func genericMatch(base *human.URL, test string) bool { u, _ := human.NewURL(test) return base.Match(u) } func TestURL_Match(t *testing.T) { base, _ := human.NewURL(`https://example.org/~alice`) if !genericMatch(base, `https://example.org/~alice`) { t.Errorf("same must match") } if !genericMatch(base, `https://example.org/~alice/blog`) { t.Errorf("sub must match") } if !genericMatch(base, `https://example.org/~alice/blog/my-post`) { t.Errorf("any depth sub must match") } if genericMatch(base, `https://example.org/~bob`) { t.Errorf("different path mustn't match") } if genericMatch(base, `https://example.org/`) { t.Errorf("home musn't match") } if genericMatch(base, `https://example.org/~alice-two`) { t.Errorf("different path musn't match") } if genericMatch(base, `https://foo.example.org/~alice`) { t.Errorf("different host musn't match") } if genericMatch(base, `http://example.org/~alice`) { t.Errorf("different scheme musn't match") } if !genericMatch(base, `https://example.org:443/~alice`) { t.Errorf("std port must match") } } func TestVouch_Json(t *testing.T) { var v human.Vouch err := json.Unmarshal([]byte(`{"url": "https://bob.example.com","vouched_at": "2026-01-15"}`), &v) if err != nil { t.Fatal(err) } if v.URL.String() != "https://bob.example.com" { t.Errorf("invalid url: %v", v.URL) } if v.VouchedAt.Format(time.DateOnly) != "2026-01-15" { t.Errorf("invalid vouched_at: %v", v.VouchedAt) } u, _ := human.NewURL(`https://bob.example.com:443/`) now := time.Now() v = human.Vouch{ URL: u, VouchedAt: now, } b, err := json.Marshal(&v) if err != nil { t.Fatal(err) } if string(b) != fmt.Sprintf(`{"url":"https://bob.example.com","vouched_at":"%s"}`, now.Format(time.DateOnly)) { t.Errorf("invalid marshal: %s", b) } }