Kyoo/api/tests/movies/get-movie.test.ts
2025-05-04 15:35:37 +02:00

169 lines
4.7 KiB
TypeScript

import { beforeAll, describe, expect, it } from "bun:test";
import { expectStatus } from "tests/utils";
import { db } from "~/db";
import { shows, videos } from "~/db/schema";
import { bubble, bubbleVideo } from "~/models/examples";
import { createMovie, getMovie } from "../helpers";
let bubbleId = "";
beforeAll(async () => {
await db.delete(shows);
await db.insert(videos).values(bubbleVideo);
const [ret, body] = await createMovie(bubble);
expect(ret.status).toBe(201);
bubbleId = body.id;
});
describe("Get movie", () => {
it("Invalid slug", async () => {
const [resp, body] = await getMovie("sotneuhn", { langs: "en" });
expectStatus(resp, body).toBe(404);
expect(body).toMatchObject({
status: 404,
message: expect.any(String),
});
});
it("Retrive by slug", async () => {
const [resp, body] = await getMovie(bubble.slug, { langs: "en" });
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
slug: bubble.slug,
name: bubble.translations.en.name,
});
});
it("Retrive by id", async () => {
const [resp, body] = await getMovie(bubbleId, { langs: "en" });
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
id: bubbleId,
slug: bubble.slug,
name: bubble.translations.en.name,
});
});
it("Get non available translation", async () => {
const [resp, body] = await getMovie(bubble.slug, { langs: "fr" });
expectStatus(resp, body).toBe(422);
expect(body).toMatchObject({
status: 422,
});
});
it("Get first available language", async () => {
const [resp, body] = await getMovie(bubble.slug, { langs: "fr,en" });
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
slug: bubble.slug,
name: bubble.translations.en.name,
});
expect(resp.headers.get("Content-Language")).toBe("en");
});
it("Use language fallback", async () => {
const [resp, body] = await getMovie(bubble.slug, { langs: "fr,pr,*" });
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
slug: bubble.slug,
name: bubble.translations.en.name,
});
expect(resp.headers.get("Content-Language")).toBe("en");
});
it("Works without accept-language header", async () => {
const [resp, body] = await getMovie(bubble.slug, { langs: undefined });
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
slug: bubble.slug,
name: bubble.translations.en.name,
});
expect(resp.headers.get("Content-Language")).toBe("en");
});
it("Fallback if translations does not exist", async () => {
const [resp, body] = await getMovie(bubble.slug, { langs: "en-au" });
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
slug: bubble.slug,
name: bubble.translations.en.name,
});
expect(resp.headers.get("Content-Language")).toBe("en");
});
it("Prefer original", async () => {
expect(bubble.translations.ja.logo).toBe(null);
expect(bubble.translations.en.logo).not.toBe(null);
const [resp, body] = await getMovie(bubble.slug, {
langs: "en-au",
preferOriginal: true,
});
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
slug: bubble.slug,
name: bubble.translations.en.name,
poster: {
source: bubble.translations.ja.poster,
},
thumbnail: {
source: bubble.translations.ja.thumbnail,
},
banner: null,
// we fallback to the translated value when the original is null.
logo: { source: bubble.translations.en.logo },
});
expect(resp.headers.get("Content-Language")).toBe("en");
});
it("With isAvailable", async () => {
const [resp, body] = await getMovie(bubble.slug, {});
expectStatus(resp, body).toBe(200);
expect(body.isAvailable).toBe(true);
});
it("With isAvailable=false", async () => {
await createMovie({
...bubble,
slug: "no-video",
videos: [],
});
const [resp, body] = await getMovie("no-video", {});
expectStatus(resp, body).toBe(200);
expect(body.isAvailable).toBe(false);
});
it("with=translations", async () => {
const [resp, body] = await getMovie(bubble.slug, {
with: ["translations"],
});
expectStatus(resp, body).toBe(200);
expect(body.translations).toMatchObject({
en: { name: bubble.translations.en.name },
ja: { name: bubble.translations.ja.name },
});
});
it("with=translations,videos", async () => {
const [resp, body] = await getMovie(bubble.slug, {
with: ["translations", "videos"],
});
expectStatus(resp, body).toBe(200);
expect(body.translations).toMatchObject({
en: { name: bubble.translations.en.name },
ja: { name: bubble.translations.ja.name },
});
expect(body.videos).toBeArrayOfSize(bubble.videos!.length);
expect(body.videos[0]).toMatchObject({
path: bubbleVideo.path,
slug: bubble.slug,
version: bubbleVideo.version,
rendering: bubbleVideo.rendering,
part: bubbleVideo.part,
});
});
});