Files
openwork/evals/drivers/cloud-connect-services-mock.test.mjs

91 lines
4.0 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import {
createCloudConnectMockServer,
MOCK_MICROSOFT_ACCESS_TOKEN,
MOCK_WORKER_CLIENT_TOKEN,
MOCK_WORKER_HOST_TOKEN,
} from "./cloud-connect-services-mock.mjs";
async function json(response) {
return response.json();
}
test("Microsoft OAuth redirects with state and Graph serves deterministic mail, calendar, and files", async (context) => {
const mock = createCloudConnectMockServer();
const { origin } = await mock.start();
context.after(() => mock.stop());
const authorizeUrl = new URL(`${origin}/entra/organizations/oauth2/v2.0/authorize`);
authorizeUrl.searchParams.set("redirect_uri", `${origin}/callback`);
authorizeUrl.searchParams.set("state", "state-from-openwork");
const authorizeResponse = await fetch(authorizeUrl, { redirect: "manual" });
assert.equal(authorizeResponse.status, 302);
const callback = new URL(authorizeResponse.headers.get("location"));
assert.match(callback.searchParams.get("code"), /^mock-microsoft-authorization-code\./);
assert.equal(callback.searchParams.get("state"), "state-from-openwork");
const headers = { authorization: `Bearer ${MOCK_MICROSOFT_ACCESS_TOKEN}` };
const messages = await json(await fetch(`${origin}/graph/v1.0/me/messages?$top=3`, { headers }));
assert.deepEqual(messages.value.map((message) => message.subject), [
"Launch readiness",
"Q3 budget approved",
"Customer feedback summary",
]);
const events = await json(await fetch(`${origin}/graph/v1.0/me/calendarView`, { headers }));
assert.equal(events.value[0].subject, "Launch review");
const files = await json(await fetch(`${origin}/graph/v1.0/me/drive/root/search(q='Q3')`, { headers }));
assert.equal(files.value[0].name, "Q3 Plan.txt");
const content = await fetch(`${origin}/graph/v1.0/me/drive/items/file-q3-plan/content`, { headers });
assert.match(await content.text(), /Ship cloud connections/);
});
test("worker mock rejects partial credentials and completes a prompt through native session reads", async (context) => {
const mock = createCloudConnectMockServer();
const { origin } = await mock.start();
context.after(() => mock.stop());
const partial = await fetch(`${origin}/worker/workspaces`, {
headers: { "x-openwork-host-token": MOCK_WORKER_HOST_TOKEN },
});
assert.equal(partial.status, 401);
const headers = {
"x-openwork-host-token": MOCK_WORKER_HOST_TOKEN,
authorization: `Bearer ${MOCK_WORKER_CLIENT_TOKEN}`,
};
const workspaces = await json(await fetch(`${origin}/worker/workspaces`, { headers }));
assert.equal(workspaces.activeId, "ws_mock_cloud");
const session = await json(await fetch(`${origin}/worker/workspace/ws_mock_cloud/opencode/session`, {
method: "POST",
headers: { ...headers, "content-type": "application/json" },
body: JSON.stringify({ title: "Cloud connect session" }),
}));
const prompt = await fetch(`${origin}/worker/workspace/ws_mock_cloud/opencode/session/${session.id}/prompt_async`, {
method: "POST",
headers: { ...headers, "content-type": "application/json" },
body: JSON.stringify({ parts: [{ type: "text", text: "Summarize the launch notes" }] }),
});
assert.equal(prompt.status, 204);
const sessionBase = `${origin}/worker/workspace/ws_mock_cloud/opencode/session`;
const busyStatuses = await json(await fetch(`${sessionBase}/status`, { headers }));
assert.equal(busyStatuses[session.id].type, "busy");
const [detail, messages, todos, idleStatuses] = await Promise.all([
json(await fetch(`${sessionBase}/${session.id}`, { headers })),
json(await fetch(`${sessionBase}/${session.id}/message`, { headers })),
json(await fetch(`${sessionBase}/${session.id}/todo`, { headers })),
json(await fetch(`${sessionBase}/status`, { headers })),
]);
assert.equal(detail.id, session.id);
assert.deepEqual(todos, []);
assert.equal(idleStatuses[session.id].type, "idle");
assert.equal(messages.at(-1).info.role, "assistant");
assert.equal(messages.at(-1).parts[0].text, "OpenWork worker reply: Summarize the launch notes");
});