import { expect, test } from "bun:test"; import { mkdir, symlink, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { importCodeRepo } from "../src/jobs/code-repo"; import { importPdfDeck } from "../src/jobs/pdf-deck"; import { importVideoFolder } from "../src/jobs/video-folder"; import { importPacktVideo } from "../src/jobs/packt-video"; import { makeEnv } from "./harness"; import { makePdf, tmp } from "./fixtures"; test("every job re-checks its path against the roots", async () => { const inbox = await tmp("stc-inbox-"); const outside = await tmp("stc-outside-"); await makePdf(join(outside, "a.pdf")); await symlink(outside, join(inbox, "link")); const env = await makeEnv({ STC_IMPORT_ROOTS: inbox }); const msg = /outside the allowed import folders/; await expect(importVideoFolder(env.deps, { path: outside }, env.jc)).rejects.toThrow(msg); await expect(importVideoFolder(env.deps, { path: join(inbox, "link") }, env.jc)).rejects.toThrow(msg); await expect(importPacktVideo(env.deps, { path: join(outside, "x.zip") }, env.jc)).rejects.toThrow(msg); await expect(importPdfDeck(env.deps, { path: join(outside, "a.pdf"), options: {} }, env.jc)).rejects.toThrow(msg); await expect(importCodeRepo(env.deps, { path: outside, options: { courseId: "x" } }, env.jc)).rejects.toThrow(/created|outside/); await mkdir(join(inbox, "empty")); await writeFile(join(inbox, "empty", "n.txt"), ""); await expect(importVideoFolder(env.deps, { path: join(inbox, "empty") }, env.jc)).rejects.toThrow(/no video files/); // allowed, then fails on content });