package handlers import ( "testing" "github.com/google/uuid" ) // Pure-function tests for the embed handler helpers — no DB / HTTP // fixtures required. func TestExtractTrackIDFromURL(t *testing.T) { id := uuid.New() cases := []struct { name string url string want uuid.UUID ok bool }{ { name: "happy path — frontend URL", url: "https://veza.fr/tracks/" + id.String(), want: id, ok: true, }, { name: "with trailing slash", url: "https://veza.fr/tracks/" + id.String() + "/", want: id, ok: true, }, { name: "with query string", url: "https://veza.fr/tracks/" + id.String() + "?utm_source=twitter", want: id, ok: true, }, { name: "with hash fragment", url: "https://veza.fr/tracks/" + id.String() + "#segment-2", want: id, ok: true, }, { name: "subpath under /tracks", url: "https://veza.fr/tracks/" + id.String() + "/comments", want: id, ok: true, }, { name: "empty", url: "", ok: false, }, { name: "no /tracks/ segment", url: "https://veza.fr/playlists/abc", ok: false, }, { name: "non-uuid", url: "https://veza.fr/tracks/not-a-uuid", ok: false, }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { got, ok := extractTrackIDFromURL(tc.url) if ok != tc.ok { t.Fatalf("ok = %v, want %v", ok, tc.ok) } if ok && got != tc.want { t.Fatalf("id = %s, want %s", got, tc.want) } }) } } func TestParseSafeInt(t *testing.T) { cases := []struct { in string want int wantOK bool }{ {in: "0", want: 0, wantOK: true}, {in: "480", want: 480, wantOK: true}, {in: "1280", want: 1280, wantOK: true}, {in: "100000", want: 100000, wantOK: true}, // reject overflow attempts {in: "999999", wantOK: false}, // reject non-digit {in: "480px", wantOK: false}, {in: "-1", wantOK: false}, {in: "", wantOK: true}, // empty parses to 0 (loop never runs) } for _, tc := range cases { t.Run(tc.in, func(t *testing.T) { n, err := parseSafeInt(tc.in) if (err == nil) != tc.wantOK { t.Fatalf("parseSafeInt(%q) ok=%v, want %v (err=%v)", tc.in, err == nil, tc.wantOK, err) } if tc.wantOK && n != tc.want { t.Fatalf("parseSafeInt(%q) = %d, want %d", tc.in, n, tc.want) } }) } }