Files
silo-server/internal/metadata/episode_completeness_test.go

156 lines
3.6 KiB
Go

package metadata
import (
"testing"
"time"
"github.com/Silo-Server/silo-server/internal/models"
)
func TestIsEpisodePlaceholderTitle(t *testing.T) {
cases := map[string]bool{
"": false,
"Pilot": false,
"TBA": true,
"tbd": true,
"Episode 12": true,
}
for title, want := range cases {
if got := IsEpisodePlaceholderTitle(title); got != want {
t.Fatalf("title %q placeholder=%v want %v", title, got, want)
}
}
}
func TestEpisodeHasIncompleteMetadata(t *testing.T) {
now := time.Date(2026, 4, 14, 12, 0, 0, 0, time.UTC)
complete := &models.Episode{
Title: "Pilot",
Overview: "Overview",
StillPath: "s3://still.jpg",
MetadataSource: "provider",
}
if EpisodeHasIncompleteMetadata(complete, now) {
t.Fatal("expected complete episode to be treated as complete")
}
recent := now.Add(-7 * 24 * time.Hour)
incomplete := &models.Episode{
Title: "Episode 2",
Overview: "",
AirDate: &recent,
MetadataSource: "scanner_fallback",
}
if !EpisodeHasIncompleteMetadata(incomplete, now) {
t.Fatal("expected fallback placeholder episode to be treated as incomplete")
}
providerNumbered := &models.Episode{
Title: "Episode 1",
Overview: "Provider overview",
TmdbID: "3812334",
MetadataSource: "provider",
}
if !EpisodeHasIncompleteMetadata(providerNumbered, now) {
t.Fatal("expected provider numbered title to remain quality-incomplete")
}
}
func TestEpisodeHasActionableMetadataDebt(t *testing.T) {
now := time.Date(2026, 4, 14, 12, 0, 0, 0, time.UTC)
recent := now.Add(-7 * 24 * time.Hour)
old := now.Add(-90 * 24 * time.Hour)
cases := []struct {
name string
ep *models.Episode
want bool
}{
{
name: "provider numbered title with overview",
ep: &models.Episode{
Title: "Episode 1",
Overview: "Provider overview",
TmdbID: "3812334",
MetadataSource: "provider",
},
want: false,
},
{
name: "provider numbered title with empty overview",
ep: &models.Episode{
Title: "Episode 1",
TvdbID: "9607609",
MetadataSource: "provider",
},
want: false,
},
{
name: "provider provisional title",
ep: &models.Episode{
Title: "TBD",
TmdbID: "3812334",
MetadataSource: "provider",
},
want: true,
},
{
name: "scanner fallback numbered title",
ep: &models.Episode{
Title: "Episode 1",
MetadataSource: "scanner_fallback",
},
want: true,
},
{
name: "missing title",
ep: &models.Episode{
TmdbID: "3812334",
MetadataSource: "provider",
},
want: true,
},
{
name: "missing provider id",
ep: &models.Episode{
Title: "Pilot",
Overview: "Provider overview",
MetadataSource: "provider",
},
want: true,
},
{
name: "recent provider episode missing still",
ep: &models.Episode{
Title: "Pilot",
Overview: "Provider overview",
TmdbID: "3812334",
AirDate: &recent,
MetadataSource: "provider",
},
want: true,
},
{
name: "old provider episode missing still",
ep: &models.Episode{
Title: "Pilot",
Overview: "Provider overview",
TmdbID: "3812334",
AirDate: &old,
MetadataSource: "provider",
},
want: false,
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
if got := EpisodeHasActionableMetadataDebt(tc.ep, now); got != tc.want {
t.Fatalf("EpisodeHasActionableMetadataDebt() = %v, want %v", got, tc.want)
}
})
}
}