package main
import (
"testing"
"time"
)
func TestNormalizationPreservesOrderingAndMultiplicity(t *testing.T) {
start := time.Now()
parse := func(raw string) any {
v, err := decode([]byte(raw))
if err != nil {
t.Fatal(err)
}
n, err := normalize(v, start, start)
if err != nil {
t.Fatal(err)
}
return n
}
a := parse(`[{"id":2,"created_at":"2024-01-02T00:00:00Z"},{"id":1,"created_at":"2024-01-01T00:00:00Z"}]`)
b := parse(`[{"id":1,"created_at":"2024-01-01T00:00:00Z"},{"id":2,"created_at":"2024-01-02T00:00:00Z"}]`)
if canonical(a) == canonical(b) {
t.Fatal("normalization hid incorrect date ordering")
}
a = parse(`{"tags":[{"id":1},{"id":1}]}`)
b = parse(`{"tags":[{"id":1}]}`)
if canonical(a) == canonical(b) {
t.Fatal("normalization hid duplicate tags")
}
a = parse(`[{"id":2,"created_at":"2024-01-01T00:00:00Z"},{"id":1,"created_at":"2024-01-01T00:00:00Z"}]`)
b = parse(`[{"id":1,"created_at":"2024-01-01T00:00:00Z"},{"id":2,"created_at":"2024-01-01T00:00:00Z"}]`)
if canonical(a) != canonical(b) {
t.Fatal("equal-date groups should be order independent")
}
a = parse(`{"created_at":"2023-12-31T21:00:00-03:00"}`)
b = parse(`{"created_at":"2024-01-01T00:00:00Z"}`)
if canonical(a) != canonical(b) {
t.Fatal("equivalent fixed timestamps should match")
}
}
func TestNormalizationRejectsBadClocks(t *testing.T) {
now := time.Now()
for _, date := range []string{"garbage", "2000-01-01T00:00:00Z", now.Add(24 * time.Hour).Format(time.RFC3339Nano)} {
if _, err := normalize(map[string]any{"updated_at": date}, now, now); err == nil {
t.Fatalf("accepted invalid request clock %s", date)
}
}
}
func TestNormalizationDoesNotAlterUserText(t *testing.T) {
original := `A title containing File "/somewhere/blog/api.py" is user data`
value, err := normalize(map[string]any{"title": original}, time.Now(), time.Now())
if err != nil {
t.Fatal(err)
}
if value.(map[string]any)["title"] != original {
t.Fatal("changed user text while normalizing traceback paths")
}
}