Kyoo/api/tests/series/nextup.test.ts

171 lines
4.4 KiB
TypeScript

import { beforeAll, describe, expect, it } from "bun:test";
import {
addToHistory,
createMovie,
createSerie,
getMovie,
getNextup,
getSerie,
getWatchlist,
setMovieStatus,
setSerieStatus,
} from "tests/helpers";
import { expectStatus } from "tests/utils";
import { db } from "~/db";
import { entries, shows, videos } from "~/db/schema";
import { bubble, madeInAbyss, madeInAbyssVideo } from "~/models/examples";
beforeAll(async () => {
await db.delete(shows);
await db.delete(entries);
await db.delete(videos);
// create video beforehand to test linking
await db.insert(videos).values(madeInAbyssVideo);
let [ret, body] = await createSerie(madeInAbyss);
expectStatus(ret, body).toBe(201);
[ret, body] = await createMovie(bubble);
expectStatus(ret, body).toBe(201);
});
const miaEntrySlug = `${madeInAbyss.slug}-s1e13`;
const miaNextEntrySlug = `${madeInAbyss.slug}-sp3`;
describe("nextup", () => {
it("Watchlist populates nextup", async () => {
let [r, b] = await setMovieStatus(bubble.slug, {
status: "watching",
completedAt: null,
score: null,
});
expectStatus(r, b).toBe(200);
[r, b] = await setSerieStatus(madeInAbyss.slug, {
status: "watching",
startedAt: "2024-12-22",
completedAt: null,
score: null,
});
expectStatus(r, b).toBe(200);
// only edit score, shouldn't change order
[r, b] = await setMovieStatus(bubble.slug, {
status: "watching",
completedAt: null,
score: 90,
});
expectStatus(r, b).toBe(200);
[r, b] = await getWatchlist("me", {});
expectStatus(r, b).toBe(200);
expect(b.items).toBeArrayOfSize(2);
const [resp, body] = await getNextup("me", {});
expectStatus(resp, body).toBe(200);
expect(body.items).toBeArrayOfSize(2);
expect(body.items[0].slug).toBe(miaEntrySlug);
expect(body.items[0].progress).toMatchObject({
percent: 0,
});
expect(body.items[1].slug).toBe(bubble.slug);
expect(body.items[1].progress).toMatchObject({
percent: 0,
});
});
it("/series/:id?with=nextEntry", async () => {
const [resp, body] = await getSerie(madeInAbyss.slug, {
with: ["nextEntry"],
});
expectStatus(resp, body).toBe(200);
expect(body.nextEntry).toBeObject();
expect(body.nextEntry.slug).toBe(miaEntrySlug);
expect(body.nextEntry.progress).toMatchObject({
percent: 0,
});
});
it("history watching doesn't update", async () => {
let [resp, body] = await addToHistory("me", [
{
entry: miaEntrySlug,
videoId: madeInAbyssVideo.id,
percent: 58,
time: 28 * 60 + 12,
playedDate: "2025-02-01",
},
{
entry: bubble.slug,
videoId: null,
percent: 100,
time: 2 * 60,
playedDate: "2025-02-02",
},
]);
expectStatus(resp, body).toBe(201);
expect(body.inserted).toBe(2);
[resp, body] = await getSerie(madeInAbyss.slug, {
with: ["nextEntry"],
});
expectStatus(resp, body).toBe(200);
expect(body.nextEntry).toBeObject();
expect(body.nextEntry.slug).toBe(miaEntrySlug);
expect(body.nextEntry.progress).toMatchObject({
percent: 58,
time: 28 * 60 + 12,
videoId: madeInAbyssVideo.id,
playedDate: "2025-02-01T00:00:00+00:00",
});
[resp, body] = await getMovie(bubble.slug, {});
expectStatus(resp, body).toBe(200);
expect(body.watchStatus).toMatchObject({
percent: 100,
status: "completed",
completedAt: "2025-02-02 00:00:00+00",
});
[resp, body] = await getNextup("me", {});
expectStatus(resp, body).toBe(200);
expect(body.items).toBeArrayOfSize(1);
expect(body.items[0].slug).toBe(miaEntrySlug);
expect(body.items[0].progress).toMatchObject({
percent: 58,
time: 28 * 60 + 12,
videoId: madeInAbyssVideo.id,
playedDate: "2025-02-01 00:00:00+00",
});
});
it("history completed picks next", async () => {
let [resp, body] = await addToHistory("me", [
{
entry: miaEntrySlug,
videoId: madeInAbyssVideo.id,
percent: 98,
time: 28 * 60 + 12,
playedDate: "2025-02-05",
},
]);
expectStatus(resp, body).toBe(201);
expect(body.inserted).toBe(1);
[resp, body] = await getSerie(madeInAbyss.slug, {
with: ["nextEntry"],
});
expectStatus(resp, body).toBe(200);
expect(body.nextEntry).toBeObject();
expect(body.nextEntry.slug).toBe(miaNextEntrySlug);
expect(body.nextEntry.progress).toMatchObject({
percent: 0,
time: 0,
videoId: null,
playedDate: null,
});
[resp, body] = await getNextup("me", {});
expectStatus(resp, body).toBe(200);
expect(body.items).toBeArrayOfSize(1);
expect(body.items[0].slug).toBe(miaNextEntrySlug);
});
});