From 28702b9cdbdca9340979139d7c3e5d1e8a5f7073 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 19 Jul 2025 17:55:13 +0200 Subject: [PATCH] Test `/videos/id` with multi-part episodes --- api/src/controllers/videos.ts | 2 + api/tests/videos/get-id.test.ts | 87 ++++++++++++++++++++++++++++++++- 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/api/src/controllers/videos.ts b/api/src/controllers/videos.ts index dacdc9e0..f88a6deb 100644 --- a/api/src/controllers/videos.ts +++ b/api/src/controllers/videos.ts @@ -317,6 +317,8 @@ function getNextVideoEntry({ prev ? desc(entries.order) : entries.order, // prefer next part of the current entry over next entry eq(vids.rendering, videos.rendering), + // take the first part available + vids.part, // always prefer latest version of video desc(vids.version), ) diff --git a/api/tests/videos/get-id.test.ts b/api/tests/videos/get-id.test.ts index 33fb147e..a753d179 100644 --- a/api/tests/videos/get-id.test.ts +++ b/api/tests/videos/get-id.test.ts @@ -7,11 +7,11 @@ import { madeInAbyss } from "~/models/examples"; beforeAll(async () => { await db.delete(shows); - const [ret, _] = await createSerie(madeInAbyss); + let [ret, _] = await createSerie(madeInAbyss); expect(ret.status).toBe(201); await db.delete(videos); - await createVideo([ + [ret, _] = await createVideo([ { path: "/video/Made in abyss S01E13.mkv", rendering: "mia13", @@ -114,6 +114,7 @@ beforeAll(async () => { for: [{ serie: madeInAbyss.slug, season: 2, episode: 4 }], }, ]); + expect(ret.status).toBe(201); }); describe("Get videos", () => { @@ -201,4 +202,86 @@ describe("Get videos", () => { }, }); }); + + it("Get video with multi-part next", async () => { + const [resp, body] = await getVideo("made-in-abyss-dawn-of-the-deep-soul", { + langs: "en", + with: ["previous", "next"], + }); + expectStatus(resp, body).toBe(200); + expect(body).toMatchObject({ + path: "/video/Made in abyss movie.mkv", + slugs: ["made-in-abyss-dawn-of-the-deep-soul"], + previous: { + video: "made-in-abyss-s1e13", + entry: expect.objectContaining({ + slug: "made-in-abyss-s1e13", + order: 13, + }), + }, + next: { + video: "made-in-abyss-s2e1-p1", + entry: expect.objectContaining({ + slug: "made-in-abyss-s2e1", + seasonNumber: 2, + episodeNumber: 1, + }), + }, + }); + }); + + it("Get first part", async () => { + const [resp, body] = await getVideo("made-in-abyss-s2e1-p1", { + langs: "en", + with: ["previous", "next"], + }); + expectStatus(resp, body).toBe(200); + expect(body).toMatchObject({ + path: "/video/Made in abyss s2e1 p1.mkv", + slugs: ["made-in-abyss-s2e1-p1"], + previous: { + video: "made-in-abyss-dawn-of-the-deep-soul", + entry: expect.objectContaining({ + slug: "made-in-abyss-dawn-of-the-deep-soul", + order: 13.5, + }), + }, + next: { + video: "made-in-abyss-s2e1-p2-v2", + entry: expect.objectContaining({ + slug: "made-in-abyss-s2e1", + seasonNumber: 2, + episodeNumber: 1, + }), + }, + }); + }); + + it("Get second part", async () => { + const [resp, body] = await getVideo("made-in-abyss-s2e1-p2-v2", { + langs: "en", + with: ["previous", "next"], + }); + expectStatus(resp, body).toBe(200); + expect(body).toMatchObject({ + path: "/video/Made in abyss s2e1 p2 v2.mkv", + slugs: ["made-in-abyss-s2e1-p2-v2"], + previous: { + video: "made-in-abyss-s2e1-p1", + entry: expect.objectContaining({ + slug: "made-in-abyss-s2e1", + seasonNumber: 2, + episodeNumber: 1, + }), + }, + next: { + video: "made-in-abyss-s2e2-v2", + entry: expect.objectContaining({ + slug: "made-in-abyss-s2e2", + seasonNumber: 2, + episodeNumber: 2, + }), + }, + }); + }); });