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")
	}
}
