test: replace episode metadata tests with deferred playback test
This commit is contained in:
@@ -3,7 +3,6 @@ package handler
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"mal/internal/db"
|
"mal/internal/db"
|
||||||
"mal/internal/domain"
|
"mal/internal/domain"
|
||||||
@@ -15,25 +14,6 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"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 {
|
type failingSkipSegmentPlaybackService struct {
|
||||||
domain.PlaybackService
|
domain.PlaybackService
|
||||||
}
|
}
|
||||||
@@ -42,62 +22,6 @@ func (s failingSkipSegmentPlaybackService) UpsertSkipSegmentOverride(context.Con
|
|||||||
return errors.New("database constraint skip_segments_user_id_fkey failed")
|
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) {
|
func TestUpsertSkipSegmentRouteHidesServiceError(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|||||||
@@ -18,11 +18,13 @@ type watchPagePlaybackService struct {
|
|||||||
domain.PlaybackService
|
domain.PlaybackService
|
||||||
|
|
||||||
data domain.WatchPageData
|
data domain.WatchPageData
|
||||||
|
deferred bool
|
||||||
err error
|
err error
|
||||||
refreshRequested bool
|
refreshRequested bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *watchPagePlaybackService) BuildWatchData(ctx context.Context, _ int, _ []string, _ string, _ string, _ string) (domain.WatchPageData, error) {
|
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)
|
s.refreshRequested = domain.PlaybackSourceRefreshRequested(ctx)
|
||||||
return s.data, s.err
|
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) {
|
func TestHandleWatchPageRendersEpisodeAvailabilityWarningModal(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user