109 lines
2.3 KiB
Go
109 lines
2.3 KiB
Go
|
|
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)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|