import { tmpdir } from "node:os"; import { join } from "node:path"; import type { JobContext, ServerContext } from "@stc/contracts"; import { createCourseRepository } from "@stc/course-format"; import { resolveConfig } from "@stc/core"; import type { Deps } from "../src/context"; import { PYTHON, tmp } from "./fixtures"; export interface TestEnv { deps: Deps; dataDir: string; queued: { kind: string; payload: unknown }[]; jc: JobContext; progress: [number, string | undefined][] } export async function makeEnv(env: Record = {}): Promise { const dataDir = await tmp("stc-data-"); const courses = await createCourseRepository([join(dataDir, "courses")]); const queued: TestEnv["queued"] = []; const progress: TestEnv["progress"] = []; const ctx = { config: resolveConfig({ databaseUrl: "sqlite://:memory:", dataDir, courseDirs: [join(dataDir, "courses")], secret: "t", publicUrl: "http://x" }), courses, jobs: { enqueue: async (kind: string, payload: unknown) => { queued.push({ kind, payload }); return "j1"; }, get: async () => null, list: async () => [] }, } as unknown as ServerContext; const jc: JobContext = { signal: new AbortController().signal, reportProgress: async (f, m) => { progress.push([f, m]); } }; const deps: Deps = { ctx, env, tools: { ffmpeg: "ffmpeg", ffprobe: "ffprobe" }, python: PYTHON, importRoots: (env.STC_IMPORT_ROOTS ?? tmpdir()).split(":"), transcribeUrl: env.STC_TRANSCRIBE_URL ?? null, }; return { deps, dataDir, queued, jc, progress }; }