Test POST /videos

This commit is contained in:
Zoe Roux 2025-04-29 00:49:33 +02:00
parent 1369da1845
commit 39dcfb4418
No known key found for this signature in database
4 changed files with 94 additions and 38 deletions

View File

@ -7,11 +7,10 @@ import {
conflictUpdateAllExcept, conflictUpdateAllExcept,
jsonbBuildObject, jsonbBuildObject,
jsonbObjectAgg, jsonbObjectAgg,
sqlarr,
values, values,
} from "~/db/utils"; } from "~/db/utils";
import { bubbleVideo } from "~/models/examples"; import { bubbleVideo } from "~/models/examples";
import { Page, isUuid } from "~/models/utils"; import { isUuid } from "~/models/utils";
import { Guesses, SeedVideo, Video } from "~/models/video"; import { Guesses, SeedVideo, Video } from "~/models/video";
import { comment } from "~/utils"; import { comment } from "~/utils";
import { computeVideoSlug } from "./seed/insert/entries"; import { computeVideoSlug } from "./seed/insert/entries";
@ -138,10 +137,11 @@ export const videosH = new Elysia({ prefix: "/videos", tags: ["videos"] })
}) })
.from( .from(
values( values(
body.flatMap((x) => body.flatMap((x) => {
x.for.map((e) => ({ if (!x.for) return [];
return x.for.map((e) => ({
path: x.path, path: x.path,
needRendering: x.for.length > 1, needRendering: x.for!.length > 1,
entry: { entry: {
...e, ...e,
movie: movie:
@ -157,8 +157,8 @@ export const videosH = new Elysia({ prefix: "/videos", tags: ["videos"] })
: { slug: e.serie } : { slug: e.serie }
: undefined, : undefined,
}, },
})), }));
), }),
).as("j"), ).as("j"),
) )
.innerJoin(vidsI, eq(vidsI.path, sql`j.path`)) .innerJoin(vidsI, eq(vidsI.path, sql`j.path`))

View File

@ -103,7 +103,10 @@ export const nullif = <T>(val: SQL<T> | Column, eq: SQL<T>) => {
return sql<T>`nullif(${val}, ${eq})`; return sql<T>`nullif(${val}, ${eq})`;
}; };
export const jsonbObjectAgg = <T>(key: SQLWrapper, value: SQL<T> | SQLWrapper) => { export const jsonbObjectAgg = <T>(
key: SQLWrapper,
value: SQL<T> | SQLWrapper,
) => {
return sql< return sql<
Record<string, T> Record<string, T>
>`jsonb_object_agg(${sql.join([key, value], sql.raw(","))})`; >`jsonb_object_agg(${sql.join([key, value], sql.raw(","))})`;

View File

@ -68,7 +68,8 @@ export const SeedVideo = t.Object({
guess: Guess, guess: Guess,
for: t.Array( for: t.Optional(
t.Array(
t.Union([ t.Union([
t.Object({ t.Object({
slug: t.String({ slug: t.String({
@ -106,6 +107,8 @@ export const SeedVideo = t.Object({
]), ]),
]), ]),
]), ]),
{ default: [] },
),
), ),
}); });
export type SeedVideo = Prettify<typeof SeedVideo.static>; export type SeedVideo = Prettify<typeof SeedVideo.static>;

View File

@ -0,0 +1,50 @@
import { beforeAll, describe, expect, it } from "bun:test";
import { eq } from "drizzle-orm";
import { createVideo } from "tests/helpers";
import { expectStatus } from "tests/utils";
import { db } from "~/db";
import { entries, shows, videos } from "~/db/schema";
beforeAll(async () => {
await db.delete(shows);
await db.delete(entries);
await db.delete(videos);
});
describe("Video seeding", () => {
it("Can create a video without entry", async () => {
const [resp, body] = await createVideo({
guess: { title: "mia", from: "test" },
part: null,
path: "/video/mia s1e13.mkv",
rendering: "sha",
version: 1,
});
expectStatus(resp, body).toBe(201);
expect(body).toBeArrayOfSize(1);
expect(body[0].id).toBeString();
const vid = await db.query.videos.findFirst({
where: eq(videos.id, body[0].id),
with: {
evj: { with: { entry: true } },
},
});
expect(vid).not.toBeNil();
expect(vid!.path).toBe("/video/mia s1e13.mkv");
expect(vid!.guess).toBe({ title: "mia", from: "test" });
expect(body[0].slug).toBe("mia");
// videos created without entries should create an /unknown entry.
expect(vid!.evj).toBeArrayOfSize(1);
expect(vid!.evj[0].slug).toBe("mia");
expect(vid!.evj[0].entry).toMatchObject({
kind: "unknown",
name: "mia",
// should we store the video path in the unknown entry?
// in db it would be the `description` field
});
});
});