Files
silo-server/internal/jellycompat/session_store_test.go

93 lines
2.4 KiB
Go

package jellycompat
import (
"testing"
"time"
)
func fixedNow() time.Time {
return time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
}
func TestDeleteByUserID(t *testing.T) {
store := NewSessionStore(24*time.Hour, fixedNow)
// Insert sessions for two different users.
_ = store.Put(Session{Token: "aaa", StreamAppUserID: 1, Username: "alice"})
_ = store.Put(Session{Token: "bbb", StreamAppUserID: 1, Username: "alice"})
_ = store.Put(Session{Token: "ccc", StreamAppUserID: 2, Username: "bob"})
store.DeleteByUserID(1)
if _, ok := store.Get("aaa"); ok {
t.Error("expected session aaa to be deleted")
}
if _, ok := store.Get("bbb"); ok {
t.Error("expected session bbb to be deleted")
}
if _, ok := store.Get("ccc"); !ok {
t.Error("expected session ccc to still exist")
}
}
func TestGetSlidingWindow_ExtendsWhenBelowHalfTTL(t *testing.T) {
ttl := 30 * 24 * time.Hour // 30 days
now := fixedNow()
clock := func() time.Time { return now }
store := NewSessionStore(ttl, clock)
_ = store.Put(Session{Token: "tok1", StreamAppUserID: 1})
// Advance time to 20 days (past the halfway point of 15 days).
now = now.Add(20 * 24 * time.Hour)
session, ok := store.Get("tok1")
if !ok {
t.Fatal("expected session to exist")
}
// ExpiresAt should be extended to now + ttl.
expected := now.Add(ttl)
if !session.ExpiresAt.Equal(expected) {
t.Errorf("expected ExpiresAt = %v, got %v", expected, session.ExpiresAt)
}
}
func TestGetSlidingWindow_NoExtensionAboveHalfTTL(t *testing.T) {
ttl := 30 * 24 * time.Hour
now := fixedNow()
clock := func() time.Time { return now }
store := NewSessionStore(ttl, clock)
_ = store.Put(Session{Token: "tok2", StreamAppUserID: 1})
originalExpiry := now.Add(ttl)
// Advance time to 10 days (before the halfway point of 15 days).
now = now.Add(10 * 24 * time.Hour)
session, ok := store.Get("tok2")
if !ok {
t.Fatal("expected session to exist")
}
// ExpiresAt should NOT have changed.
if !session.ExpiresAt.Equal(originalExpiry) {
t.Errorf("expected ExpiresAt = %v, got %v", originalExpiry, session.ExpiresAt)
}
}
func TestGet_ExpiredSession_ReturnsNotFound(t *testing.T) {
now := fixedNow()
clock := func() time.Time { return now }
store := NewSessionStore(1*time.Hour, clock)
_ = store.Put(Session{Token: "short-lived", StreamAppUserID: 1})
// Advance past TTL.
now = now.Add(2 * time.Hour)
if _, ok := store.Get("short-lived"); ok {
t.Error("expected expired session to not be returned")
}
}