mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-31 20:24:27 -04:00
169 lines
4.7 KiB
TypeScript
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,
|
|
});
|
|
});
|
|
});
|