70 lines
3.2 KiB
TypeScript
70 lines
3.2 KiB
TypeScript
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
import { tmpdir } from "node:os";
|
|
|
|
import { expect, test } from "bun:test";
|
|
|
|
import { createProjectManagementApp } from "./server.ts";
|
|
import { createProjectManagementStore } from "./store.ts";
|
|
|
|
test("project management app exposes MDTODO read model and Workbench link writes", async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "hwlab-project-management-"));
|
|
try {
|
|
await writeFile(join(root, "MDTODO.md"), "# Demo\n\n- [ ] Launch project nav\n- [x] Wire read model\n", "utf8");
|
|
const app = createProjectManagementApp({
|
|
env: {},
|
|
store: createProjectManagementStore({ kind: "memory" }),
|
|
sourceRoot: root,
|
|
sourceId: "test-mdtodo",
|
|
projectId: "project_test"
|
|
});
|
|
|
|
const ready = await app.fetch(new Request("http://service/health/ready"));
|
|
expect(ready.status).toBe(200);
|
|
|
|
const navigation = await json(app, "/v1/project-management/navigation");
|
|
expect(navigation.navigation.id).toBe("project-management");
|
|
|
|
const sources = await json(app, "/v1/project-management/mdtodo/sources");
|
|
expect(sources.sources[0].sourceId).toBe("test-mdtodo");
|
|
|
|
const files = await json(app, "/v1/project-management/mdtodo/files?sourceId=test-mdtodo");
|
|
expect(files.files[0].taskCount).toBe(2);
|
|
|
|
const tasks = await json(app, "/v1/project-management/mdtodo/tasks?sourceId=test-mdtodo");
|
|
expect(tasks.tasks.map((task) => task.status)).toEqual(["open", "done"]);
|
|
expect(tasks.tasks.every((task) => task.projectId === "project_test")).toBe(true);
|
|
|
|
const links = await json(app, "/v1/project-management/workbench-links?projectId=project_test");
|
|
expect(links.links).toEqual([]);
|
|
|
|
const linkResponse = await app.fetch(new Request("http://service/v1/project-management/workbench-links", {
|
|
method: "POST",
|
|
headers: { "content-type": "application/json", "x-hwlab-actor-id": "usr_test" },
|
|
body: JSON.stringify({ projectId: "project_test", taskRef: tasks.tasks[0].taskRef, sessionId: "ses_project_test", role: "launch", link: { workbenchUrl: "/workbench/sessions/ses_project_test", launchContext: { projectId: "project_test", taskRef: tasks.tasks[0].taskRef, title: tasks.tasks[0].title } } })
|
|
}));
|
|
expect(linkResponse.status).toBe(201);
|
|
const createdLink = await linkResponse.json();
|
|
expect(createdLink.link.sessionId).toBe("ses_project_test");
|
|
|
|
const linkedTasks = await json(app, "/v1/project-management/mdtodo/tasks?sourceId=test-mdtodo");
|
|
expect(linkedTasks.tasks[0].linkCount).toBe(1);
|
|
|
|
const taskLinks = await json(app, `/v1/project-management/workbench-links?taskRef=${encodeURIComponent(tasks.tasks[0].taskRef)}`);
|
|
expect(taskLinks.links[0].sessionId).toBe("ses_project_test");
|
|
|
|
const rejected = await app.fetch(new Request("http://service/v1/project-management/mdtodo/tasks", { method: "POST" }));
|
|
expect(rejected.status).toBe(405);
|
|
|
|
await app.close();
|
|
} finally {
|
|
await rm(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
async function json(app, path) {
|
|
const response = await app.fetch(new Request(`http://service${path}`, { headers: { "x-hwlab-actor-id": "usr_test" } }));
|
|
expect(response.status).toBe(200);
|
|
return response.json();
|
|
}
|