package web import ( "errors" "net/http" "net/http/httptest" "os" "path/filepath" "strings" "testing" "time" "gitea.kazu634.com/kazu634/tver/internal/store" ) func libraryJob(id int64, relative string) store.Job { size := int64(10) finished := time.Date(2026, 10, 3, 1, 2, 3, 0, time.UTC) return store.Job{ID: id, EpisodeID: "ep1", SeriesID: "series1", SeriesTitle: ``, Title: `第1話`, BroadcasterName: "放送局", DurationSeconds: 61, ThumbnailPath: "/thumb.jpg", Status: "succeeded", FilePath: &relative, FileSizeBytes: &size, FinishedAt: &finished} } func TestLibraryAndPlaybackPage(t *testing.T) { dir := t.TempDir() jobs := &fakeJobStore{jobs: map[string]store.Job{"ep1": libraryJob(1, "show/video.mp4")}} handler := newTestHandlerWithVideoDir(&fakeFetcher{}, jobs, dir, nil) page := getPage(handler, "/library") if page.Code != http.StatusOK { t.Fatalf("library status=%d", page.Code) } body := page.Body.String() for _, want := range []string{"<script>番組</script>", "<b>第1話</b>", "放送局", "1番組・1本・0.00 GB", "10.0 B", "2026-10-03 10:02 JST", "https://statics.tver.jp/thumb.jpg", `/library/series/series1`, "1本"} { if !strings.Contains(body, want) { t.Errorf("library missing %q", want) } } if strings.Contains(body, "") { t.Fatal("library fields were not escaped") } video := getPage(handler, "/library/1") if video.Code != http.StatusOK || !strings.Contains(video.Body.String(), `