import { afterEach, expect, test } from "bun:test"; import { mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import * as Question from "@chopin/question"; import * as Questions from "./questions/service"; import * as Store from "./questions/store"; import * as room from "./plan/room"; import * as Service from "./plan/service"; import type { Server } from "bun"; import type { Plan } from "./plan/service"; import type { SocketData } from "./wire"; let directories: string[] = []; let plans: Plan[] = []; afterEach(async () => { for (let plan of plans) await Service.close(plan); plans = []; for (let directory of directories) await rm(directory, { recursive: true, force: true }); directories = []; }); async function opened(): Promise { let directory = await mkdtemp(join(tmpdir(), "chopin-question-service-")); directories.push(directory); let server = { publish() {} } as unknown as Server; let plan = await Service.open("test", directory, server); plans.push(plan); return plan; } test("a batched ask creates independently addressed decision records and nodes", async () => { let plan = await opened(); let definition = Questions.identify({ questions: [ { header: "Storage", question: "Where should room state live?", multiple: false, options: [{ label: "MDX on disk", description: "Readable." }], }, { header: "Scope", question: "What belongs in the first cut?", multiple: true, options: [{ label: "Anchors", description: "Link prose." }], }, ], }); let server = { publish() {} } as unknown as Server; let waiting = Questions.ask(plan, server, "test", definition); let records = [...plan.records.values()]; expect(records).toHaveLength(2); expect(records.map(record => record.definition.questions)).toEqual([ [definition.questions[0]], [definition.questions[1]], ]); expect(room.project(plan.document).match(/