Files
projectbrain-Public/backend/test/operatingSystemRoutes.test.ts
T

66 lines
2.1 KiB
TypeScript

import Fastify from "fastify";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { loadEnv } from "../src/config/env.js";
import { registerOperatingSystemRoutes } from "../src/routes/operatingSystem.js";
const mocks = vi.hoisted(() => ({ updateWorkDependencies: vi.fn() }));
vi.mock("../src/services/workGraph.js", () => ({
claimReadyWork: vi.fn(),
getProjectWorkGraph: vi.fn(),
listWorkGraphHistory: vi.fn(),
recordWorkCompletion: vi.fn(),
reclaimExpiredWork: vi.fn(),
releaseWork: vi.fn(),
updateWorkDependencies: mocks.updateWorkDependencies,
}));
const env = loadEnv({
NODE_ENV: "test",
PROJECTBRAIN_DATA_SOURCE: "database",
DATABASE_URL: "postgresql://fixture:fixture@localhost:5432/projectbrain_fixture",
PROJECTBRAIN_OWNER_USERNAME: "fixture-owner",
PROJECTBRAIN_OWNER_PASSWORD: "fixture-only-owner-password",
PROJECTBRAIN_AUTH_SECRET: "fixture-only-auth-secret-with-at-least-32-characters",
});
describe("operating-system work-graph routes", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("maps an active work-graph lease conflict to 409 with the authenticated actor", async () => {
mocks.updateWorkDependencies.mockRejectedValue(new Error("WORK_GRAPH_ACTIVE_LEASE"));
const app = Fastify();
app.decorateRequest("authUser", null);
app.addHook("onRequest", async (request) => {
request.authUser = {
id: "member-id",
username: "authenticated-member",
role: "member",
credentialVersion: 1,
};
});
await registerOperatingSystemRoutes(app, { env });
try {
const response = await app.inject({
method: "PUT",
url: "/api/projects/project-1/work-graph/node-1/dependencies",
payload: { dependencyNodeIds: ["node-2"], actor: "forged-caller" },
});
expect(response.statusCode).toBe(409);
expect(response.json().error.code).toBe("WORK_GRAPH_ACTIVE_LEASE");
expect(mocks.updateWorkDependencies).toHaveBeenCalledWith(
"project-1",
"node-1",
["node-2"],
"authenticated-member",
);
} finally {
await app.close();
}
});
});