66 lines
2.1 KiB
TypeScript
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();
|
|
}
|
|
});
|
|
});
|