156 lines
3.6 KiB
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)
|
|
}
|
|
})
|
|
}
|
|
}
|