Files
memby/server/internal/recommend/context_test.go
T

83 lines
2.2 KiB
Go
Raw Normal View History

2026-08-02 22:10:19 +12:00
package recommend
import (
"testing"
"time"
)
func TestContextAffinityPrefersTypicalWeekdayTime(t *testing.T) {
location := time.FixedZone("test", 12*60*60)
profile := NewContextAffinityProfile()
comedy := Item{Genres: []string{"Comedy"}}
drama := Item{Genres: []string{"Drama"}}
for i := 0; i < 6; i++ {
profile.Add(
comedy,
time.Date(2026, 7, 6+i*7, 19, 30, 0, 0, location),
1,
i,
location,
)
profile.Add(
drama,
time.Date(2026, 7, 7+i*7, 13, 0, 0, 0, location),
1,
i,
location,
)
}
now := time.Date(2026, 7, 27, 20, 0, 0, 0, location) // Monday evening.
comedyScore, confidence := profile.Score(comedy, now, location)
dramaScore, _ := profile.Score(drama, now, location)
if comedyScore <= dramaScore {
t.Fatalf("Monday-evening comedy score %.3f <= drama score %.3f", comedyScore, dramaScore)
}
if confidence != 1 {
t.Fatalf("confidence = %.3f, want 1 after repeated matching sessions", confidence)
}
}
func TestContextAffinityUsesNeighboringWindowsAsWeakFallback(t *testing.T) {
location := time.UTC
profile := NewContextAffinityProfile()
item := Item{Genres: []string{"Documentary"}}
profile.Add(
item,
time.Date(2026, 7, 20, 16, 30, 0, 0, location), // Monday afternoon.
0.8,
0,
location,
)
exact, exactConfidence := profile.Score(
item, time.Date(2026, 7, 27, 16, 0, 0, 0, location), location,
)
neighbor, neighborConfidence := profile.Score(
item, time.Date(2026, 7, 27, 18, 0, 0, 0, location), location,
)
if neighbor <= 0 || neighbor*neighborConfidence >= exact*exactConfidence {
t.Fatalf(
"weighted neighbor %.3f should be positive and below exact %.3f",
neighbor*neighborConfidence,
exact*exactConfidence,
)
}
if neighborConfidence >= exactConfidence {
t.Fatalf(
"neighbor confidence %.3f should be below exact %.3f",
neighborConfidence,
exactConfidence,
)
}
}
func TestContextAffinityHasNeutralSparseHistoryFallback(t *testing.T) {
score, confidence := (ContextAffinityProfile{}).Score(
Item{Genres: []string{"Drama"}}, time.Now(), time.UTC,
)
if score != 0 || confidence != 0 {
t.Fatalf("empty profile = score %.3f confidence %.3f, want neutral", score, confidence)
}
}