Files
openwork/apps/server/src/desktop-cloud-sync-preserves-imports.e2e.test.ts
T

131 lines
4.8 KiB
TypeScript

import { afterEach, describe, expect, test } from "bun:test";
import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { startServer } from "./server.js";
import type { ServerConfig } from "./types.js";
const stops: Array<() => void | Promise<void>> = [];
const roots: string[] = [];
afterEach(async () => {
while (stops.length) await stops.pop()?.();
while (roots.length) {
const root = roots.pop();
if (root) await rm(root, { recursive: true, force: true });
}
});
function isRecord(value: unknown): value is Record<string, unknown> {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
function expectRecord(value: unknown, label: string): Record<string, unknown> {
if (!isRecord(value)) throw new Error(`Expected ${label}`);
return value;
}
function auth(token: string) {
return { authorization: `Bearer ${token}`, "content-type": "application/json" };
}
async function createWorkspaceRoot() {
const root = await mkdtemp(join(tmpdir(), "openwork-desktop-cloud-sync-"));
roots.push(root);
return root;
}
async function startOpenworkServer(workspaceRoot: string) {
const config = {
host: "127.0.0.1",
port: 0,
configPath: join(workspaceRoot, "server.json"),
token: "owt_test_token",
hostToken: "owt_host_token",
approval: { mode: "auto", timeoutMs: 1000 },
corsOrigins: ["*"],
workspaces: [{ id: "ws_1", name: "Workspace", path: workspaceRoot, preset: "starter", workspaceType: "local" }],
authorizedRoots: [workspaceRoot],
readOnly: false,
startedAt: Date.now(),
tokenSource: "cli",
hostTokenSource: "cli",
logFormat: "pretty",
logRequests: false,
} satisfies ServerConfig;
const server = await startServer(config);
stops.push(() => server.stop());
return { base: `http://127.0.0.1:${server.port}`, token: config.token };
}
describe("desktop cloud sync provider imports", () => {
test("preserves workspace provider import baseline while recording sync state", async () => {
const root = await createWorkspaceRoot();
const { base, token } = await startOpenworkServer(root);
const providerImport = {
cloudProviderId: "lpr_test",
providerId: "ow_lpr_test",
sourceProviderId: "openai",
name: "Test Provider",
source: "org",
updatedAt: "2026-06-01T00:00:00.000Z",
modelIds: ["model-a"],
importedAt: 1780442400000,
};
const patchResponse = await fetch(`${base}/workspace/ws_1/config`, {
method: "PATCH",
headers: auth(token),
body: JSON.stringify({
openwork: {
cloudImports: {
providers: { lpr_test: providerImport },
},
},
}),
});
expect(patchResponse.status).toBe(200);
const syncResponse = await fetch(`${base}/workspace/ws_1/desktop-cloud-sync`, {
method: "POST",
headers: auth(token),
body: JSON.stringify({
snapshot: {
organizationId: "org_1",
orgMemberId: "member_1",
teamIds: ["team_1"],
resources: {
llmProviders: { lpr_test: "2026-06-02T00:00:00.000Z" },
marketplaces: {},
},
},
}),
});
expect(syncResponse.status).toBe(200);
const syncBody = expectRecord(await syncResponse.json(), "desktop cloud sync response");
const responseState = expectRecord(syncBody.state, "desktop cloud sync response state");
expect(Object.keys(expectRecord(responseState.entries, "desktop cloud sync response entries"))).toContain(
"org_1::member_1",
);
const configResponse = await fetch(`${base}/workspace/ws_1/config`, { headers: auth(token) });
expect(configResponse.status).toBe(200);
const configBody = expectRecord(await configResponse.json(), "workspace config response");
const openwork = expectRecord(configBody.openwork, "workspace openwork config");
const cloudImports = expectRecord(openwork.cloudImports, "workspace cloud imports");
const providers = expectRecord(cloudImports.providers, "workspace imported providers");
const preservedProvider = expectRecord(providers.lpr_test, "preserved provider import baseline");
expect(preservedProvider).toEqual(providerImport);
const stateResponse = await fetch(`${base}/workspace/ws_1/desktop-cloud-sync`, { headers: auth(token) });
expect(stateResponse.status).toBe(200);
const stateBody = expectRecord(await stateResponse.json(), "desktop cloud sync state");
const entries = expectRecord(stateBody.entries, "desktop cloud sync entries");
const entry = expectRecord(entries["org_1::member_1"], "recorded desktop cloud sync entry");
expect(entry.organizationId).toBe("org_1");
expect(entry.orgMemberId).toBe("member_1");
expect(Array.isArray(entry.pendingChanges) ? entry.pendingChanges : []).toHaveLength(1);
});
});