From 8ec647943eee26e5f911173b627de560a01bf546 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Mon, 6 Jul 2026 07:09:23 +0200 Subject: [PATCH] test: replace episode metadata tests with deferred playback test --- .../playback/handler/episode_metadata_test.go | 76 ------------------- internal/playback/handler/watch_page_test.go | 19 +++++ 2 files changed, 19 insertions(+), 76 deletions(-) diff --git a/internal/playback/handler/episode_metadata_test.go b/internal/playback/handler/episode_metadata_test.go index 94d8d9c7..3bc2a628 100644 --- a/internal/playback/handler/episode_metadata_test.go +++ b/internal/playback/handler/episode_metadata_test.go @@ -3,7 +3,6 @@ package handler import ( "bytes" "context" - "encoding/json" "errors" "mal/internal/db" "mal/internal/domain" @@ -15,25 +14,6 @@ import ( "github.com/gin-gonic/gin" ) -type episodeMetadataAnimeService struct { - domain.AnimePlaybackService - err error -} - -func (s episodeMetadataAnimeService) GetAllEpisodes(context.Context, int) ([]domain.EpisodeData, error) { - if s.err != nil { - return nil, s.err - } - return []domain.EpisodeData{ - {MalID: 1, Title: "The Beginning"}, - {MalID: 2, Title: "The Follow-Up"}, - }, nil -} - -func (s episodeMetadataAnimeService) GetAnimeByID(context.Context, int) (domain.Anime, error) { - return domain.Anime{}, nil -} - type failingSkipSegmentPlaybackService struct { domain.PlaybackService } @@ -42,62 +22,6 @@ func (s failingSkipSegmentPlaybackService) UpsertSkipSegmentOverride(context.Con return errors.New("database constraint skip_segments_user_id_fkey failed") } -func TestEpisodeMetadataRouteReturnsEpisodeTitles(t *testing.T) { - t.Parallel() - - gin.SetMode(gin.TestMode) - router := gin.New() - h := NewPlaybackHandler(nil, episodeMetadataAnimeService{}) - h.Register(router) - - req := httptest.NewRequestWithContext(context.Background(), http.MethodGet, "/api/watch/episodes/123/metadata", nil) - rec := httptest.NewRecorder() - router.ServeHTTP(rec, req) - - if rec.Code != http.StatusOK { - t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) - } - - var got []struct { - MalID int `json:"mal_id"` - Title string `json:"title"` - } - if err := json.Unmarshal(rec.Body.Bytes(), &got); err != nil { - t.Fatalf("json.Unmarshal() error = %v", err) - } - - if len(got) != 2 { - t.Fatalf("len(got) = %d, want 2", len(got)) - } - if got[0].MalID != 1 || got[0].Title != "The Beginning" { - t.Fatalf("got[0] = %+v, want episode 1 title", got[0]) - } -} - -func TestEpisodeMetadataRouteHidesServiceError(t *testing.T) { - t.Parallel() - - gin.SetMode(gin.TestMode) - router := gin.New() - h := NewPlaybackHandler(nil, episodeMetadataAnimeService{err: errors.New("upstream returned credentials in URL")}) - h.Register(router) - - req := httptest.NewRequestWithContext(context.Background(), http.MethodGet, "/api/watch/episodes/123/metadata", nil) - rec := httptest.NewRecorder() - router.ServeHTTP(rec, req) - - if rec.Code != http.StatusInternalServerError { - t.Fatalf("status = %d, want %d", rec.Code, http.StatusInternalServerError) - } - body := rec.Body.String() - if !strings.Contains(body, `"error":"failed to load episode metadata"`) { - t.Fatalf("expected stable public error, got %s", body) - } - if strings.Contains(body, "upstream returned credentials") { - t.Fatalf("expected private service error to stay out of response, got %s", body) - } -} - func TestUpsertSkipSegmentRouteHidesServiceError(t *testing.T) { t.Parallel() diff --git a/internal/playback/handler/watch_page_test.go b/internal/playback/handler/watch_page_test.go index 071f25f3..bc5010c7 100644 --- a/internal/playback/handler/watch_page_test.go +++ b/internal/playback/handler/watch_page_test.go @@ -18,11 +18,13 @@ type watchPagePlaybackService struct { domain.PlaybackService data domain.WatchPageData + deferred bool err error refreshRequested bool } func (s *watchPagePlaybackService) BuildWatchData(ctx context.Context, _ int, _ []string, _ string, _ string, _ string) (domain.WatchPageData, error) { + s.deferred = domain.PlaybackDataDeferred(ctx) s.refreshRequested = domain.PlaybackSourceRefreshRequested(ctx) return s.data, s.err } @@ -135,6 +137,23 @@ func TestHandleWatchPagePreservesPartialDataOnPlaybackFailure(t *testing.T) { } } +func TestHandleWatchPageDefersPlaybackData(t *testing.T) { + t.Parallel() + + svc := &watchPagePlaybackService{data: baseWatchPageData()} + router := newWatchPageRouter(t, &PlaybackHandler{svc: svc}) + req := httptest.NewRequestWithContext(context.Background(), http.MethodGet, "/anime/123/watch?ep=1", nil) + rec := httptest.NewRecorder() + router.ServeHTTP(rec, req) + + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) + } + if !svc.deferred { + t.Fatal("watch page did not defer playback data") + } +} + func TestHandleWatchPageRendersEpisodeAvailabilityWarningModal(t *testing.T) { t.Parallel()