diff --git a/internal/db/skip_segment_overrides_test.go b/internal/db/skip_segment_overrides_test.go index a4f755a..92febeb 100644 --- a/internal/db/skip_segment_overrides_test.go +++ b/internal/db/skip_segment_overrides_test.go @@ -23,3 +23,104 @@ func TestHasSkipSegmentOverrideTableReturnsFalseWhenMissing(t *testing.T) { t.Fatalf("HasSkipSegmentOverrideTable returned true for missing table") } } + +func TestHasSkipSegmentOverrideTableReturnsTrueWhenPresent(t *testing.T) { + sqlDB, err := openSkipSegmentOverrideTestDB(t) + if err != nil { + t.Fatalf("open test db: %v", err) + } + defer func() { _ = sqlDB.Close() }() + + queries := New(sqlDB) + + ok, err := queries.HasSkipSegmentOverrideTable(context.Background()) + if err != nil { + t.Fatalf("HasSkipSegmentOverrideTable: %v", err) + } + if !ok { + t.Fatal("HasSkipSegmentOverrideTable returned false for existing table") + } +} + +func TestSkipSegmentOverrideUpsertAndList(t *testing.T) { + sqlDB, err := openSkipSegmentOverrideTestDB(t) + if err != nil { + t.Fatalf("open test db: %v", err) + } + defer func() { _ = sqlDB.Close() }() + + queries := New(sqlDB) + + row := SkipSegmentOverrideRow{ + ID: "override-1", + UserID: "user-a", + AnimeID: 123, + Episode: 4, + SkipType: "op", + StartTime: 12.5, + EndTime: 28.25, + } + if err := queries.UpsertSkipSegmentOverride(context.Background(), row); err != nil { + t.Fatalf("UpsertSkipSegmentOverride insert: %v", err) + } + + got, err := queries.ListSkipSegmentOverrides(context.Background(), row.UserID, row.AnimeID, row.Episode) + if err != nil { + t.Fatalf("ListSkipSegmentOverrides insert: %v", err) + } + assertSingleSkipSegmentOverrideRow(t, got, row) + + updated := row + updated.StartTime = 13.75 + updated.EndTime = 29.5 + if err := queries.UpsertSkipSegmentOverride(context.Background(), updated); err != nil { + t.Fatalf("UpsertSkipSegmentOverride update: %v", err) + } + + got, err = queries.ListSkipSegmentOverrides(context.Background(), row.UserID, row.AnimeID, row.Episode) + if err != nil { + t.Fatalf("ListSkipSegmentOverrides update: %v", err) + } + assertSingleSkipSegmentOverrideRow(t, got, updated) +} + +func assertSingleSkipSegmentOverrideRow(t *testing.T, got []SkipSegmentOverrideRow, want SkipSegmentOverrideRow) { + t.Helper() + + if len(got) != 1 { + t.Fatalf("len(got) = %d, want 1", len(got)) + } + if got[0] != want { + t.Fatalf("row = %+v, want %+v", got[0], want) + } +} + +func openSkipSegmentOverrideTestDB(t *testing.T) (*sql.DB, error) { + t.Helper() + + sqlDB, err := sql.Open("sqlite3", ":memory:") + if err != nil { + return nil, err + } + + _, err = sqlDB.ExecContext(context.Background(), ` + CREATE TABLE skip_segment_override ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + anime_id INTEGER NOT NULL, + episode INTEGER NOT NULL, + skip_type TEXT NOT NULL, + start_time REAL NOT NULL, + end_time REAL NOT NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE(user_id, anime_id, episode, skip_type) + ); + `) + if err != nil { + _ = sqlDB.Close() + return nil, err + } + + return sqlDB, nil +}