Kyoo/api/tests/movies/get-all-movies-with-null.test.ts

149 lines
3.7 KiB
TypeScript

import { beforeAll, describe, expect, it } from "bun:test";
import { getJwtHeaders } from "tests/helpers/jwt";
import { expectStatus } from "tests/utils";
import { db } from "~/db";
import { shows } from "~/db/schema";
import { bubble } from "~/models/examples";
import { dune1984 } from "~/models/examples/dune-1984";
import { dune } from "~/models/examples/dune-2021";
import { createMovie, getMovies, handlers } from "../helpers";
beforeAll(async () => {
await db.delete(shows);
for (const movie of [bubble, dune1984, dune]) {
const [ret, body] = await createMovie(movie);
expectStatus(ret, body).toBe(201);
}
});
describe("with a null value", () => {
// Those before/after hooks are NOT scoped to the describe due to a bun bug
// instead we just make a new file for those /shrug
// see: https://github.com/oven-sh/bun/issues/5738
beforeAll(async () => {
const [ret, body] = await createMovie({
slug: "no-air-date",
translations: {
en: {
name: "no air date",
description: null,
aliases: [],
banner: null,
logo: null,
poster: null,
tagline: null,
tags: [],
thumbnail: null,
trailer: null,
},
},
genres: [],
status: "unknown",
rating: null,
runtime: null,
airDate: null,
originalLanguage: "en",
externalId: {},
studios: [],
});
expectStatus(ret, body).toBe(201);
});
it("sort by dates desc with a null value", async () => {
let [resp, body] = await getMovies({
limit: 2,
sort: "-airDate",
langs: "en",
});
expectStatus(resp, body).toBe(200);
expect(body.items.map((x: any) => x.slug)).toMatchObject([
bubble.slug,
dune.slug,
]);
// we copy this due to https://github.com/oven-sh/bun/issues/3521
const next = body.next;
expect(body).toMatchObject({
items: [
expect.objectContaining({ slug: bubble.slug, airDate: bubble.airDate }),
expect.objectContaining({ slug: dune.slug, airDate: dune.airDate }),
],
this: "http://localhost/movies?limit=2&sort=-airDate",
next: expect.stringContaining(
"http://localhost/movies?limit=2&sort=-airDate&after=WyIyMDIxLTEwLTIyIiw",
),
});
resp = await handlers.handle(
new Request(next, { headers: await getJwtHeaders() }),
);
body = await resp.json();
expectStatus(resp, body).toBe(200);
expect(body.items.map((x: any) => x.slug)).toMatchObject([
dune1984.slug,
"no-air-date",
]);
expect(body).toMatchObject({
items: [
expect.objectContaining({
slug: dune1984.slug,
airDate: dune1984.airDate,
}),
expect.objectContaining({
slug: "no-air-date",
airDate: null,
}),
],
this: next,
next: expect.anything(),
});
});
it("sort by dates asc with a null value", async () => {
let [resp, body] = await getMovies({
limit: 2,
sort: "airDate",
langs: "en",
});
expectStatus(resp, body).toBe(200);
// we copy this due to https://github.com/oven-sh/bun/issues/3521
const next = body.next;
expect(body).toMatchObject({
items: [
expect.objectContaining({
slug: dune1984.slug,
airDate: dune1984.airDate,
}),
expect.objectContaining({ slug: dune.slug, airDate: dune.airDate }),
],
this: "http://localhost/movies?limit=2&sort=airDate",
next: expect.stringContaining(
"http://localhost/movies?limit=2&sort=airDate&after=WyIyMDIxLTEwLTIyIiw",
),
});
resp = await handlers.handle(
new Request(next, { headers: await getJwtHeaders() }),
);
body = await resp.json();
expectStatus(resp, body).toBe(200);
expect(body).toMatchObject({
items: [
expect.objectContaining({
slug: bubble.slug,
airDate: bubble.airDate,
}),
expect.objectContaining({
slug: "no-air-date",
airDate: null,
}),
],
this: next,
next: expect.anything(),
});
});
});