Files
openwork/apps/desktop/electron/workspace-store.test.mjs

645 lines
26 KiB
JavaScript

import assert from "node:assert/strict";
import { mkdtemp, mkdir, readFile, realpath, utimes, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import path from "node:path";
import { test } from "node:test";
import { createWorkspaceStore } from "./workspace-store.mjs";
function restoreEnv(name, value) {
if (value === undefined) delete process.env[name];
else process.env[name] = value;
}
async function writeBootstrapConfig(targetPath, config) {
await mkdir(path.dirname(targetPath), { recursive: true });
await writeFile(targetPath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
}
async function withIsolatedBootstrapStore(callback) {
const root = await mkdtemp(path.join(tmpdir(), "openwork-bootstrap-store-"));
const home = path.join(root, "home");
const xdg = path.join(root, "xdg");
const previousHome = process.env.HOME;
const previousXdg = process.env.XDG_CONFIG_HOME;
const previousOverride = process.env.OPENWORK_DESKTOP_BOOTSTRAP_PATH;
const previousDevMode = process.env.OPENWORK_DEV_MODE;
process.env.HOME = home;
process.env.XDG_CONFIG_HOME = xdg;
delete process.env.OPENWORK_DESKTOP_BOOTSTRAP_PATH;
delete process.env.OPENWORK_DEV_MODE;
try {
const module = await import(`./workspace-store.mjs?bootstrap-test=${Date.now()}-${Math.random()}`);
const createStore = (overrides = {}) => module.createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? path.join(root, "userData") : root },
defaultDenBaseUrl: "https://default.example.com",
defaultRequireSignin: false,
forceRequireSignin: false,
...overrides,
});
const store = createStore();
return await callback({
store,
createStore,
canonicalPath: path.join(xdg, "openwork", "desktop-bootstrap.json"),
legacyPath: path.join(home, ".config", "openwork", "desktop-bootstrap.json"),
root,
userDataPath: path.join(root, "userData"),
});
} finally {
restoreEnv("HOME", previousHome);
restoreEnv("XDG_CONFIG_HOME", previousXdg);
restoreEnv("OPENWORK_DESKTOP_BOOTSTRAP_PATH", previousOverride);
restoreEnv("OPENWORK_DEV_MODE", previousDevMode);
}
}
test("recovers missing desktop workspace state from token store paths", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-"));
const userData = path.join(root, "userData");
const oldWorkspace = path.join(root, "old-workspace");
await mkdir(oldWorkspace, { recursive: true });
const oldWorkspaceReal = await realpath(oldWorkspace);
await mkdir(userData, { recursive: true });
await writeFile(
path.join(userData, "openwork-server-tokens.json"),
JSON.stringify({
version: 1,
workspaces: {
"": { updatedAt: 3 },
[oldWorkspace]: { updatedAt: 2 },
[path.join(root, "missing")]: { updatedAt: 4 },
},
}),
"utf8",
);
const previous = process.env.OPENWORK_SERVER_CONFIG;
process.env.OPENWORK_SERVER_CONFIG = path.join(root, "missing-server.json");
try {
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? userData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.readWorkspaceState();
assert.equal(state.workspaces.length, 1);
assert.equal(state.workspaces[0].path, oldWorkspaceReal);
assert.equal(state.selectedId, state.workspaces[0].id);
assert.equal(state.watchedId, state.workspaces[0].id);
const persisted = JSON.parse(await readFile(path.join(userData, "openwork-workspaces.json"), "utf8"));
assert.equal(persisted.workspaces.length, 1);
assert.equal(persisted.selectedWorkspaceId, state.workspaces[0].id);
} finally {
if (previous === undefined) delete process.env.OPENWORK_SERVER_CONFIG;
else process.env.OPENWORK_SERVER_CONFIG = previous;
}
});
test("reads live shared workspace state from the explicit production path", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-shared-"));
const isolatedUserData = path.join(root, "isolated-userData");
const workspace = path.join(root, "production-workspace");
const sharedState = path.join(root, "production-userData", "openwork-workspaces.json");
await mkdir(isolatedUserData, { recursive: true });
await mkdir(workspace, { recursive: true });
await mkdir(path.dirname(sharedState), { recursive: true });
await writeFile(sharedState, JSON.stringify({
selectedId: "ws_production",
watchedId: "ws_production",
activeId: "ws_production",
workspaces: [{ id: "ws_production", name: "Production", path: workspace, workspaceType: "local" }],
}), "utf8");
const previousStatePath = process.env.OPENWORK_DESKTOP_WORKSPACE_STATE_PATH;
const previousRecovery = process.env.OPENWORK_DESKTOP_DISABLE_WORKSPACE_RECOVERY;
process.env.OPENWORK_DESKTOP_WORKSPACE_STATE_PATH = sharedState;
process.env.OPENWORK_DESKTOP_DISABLE_WORKSPACE_RECOVERY = "1";
try {
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? isolatedUserData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.readWorkspaceState();
assert.equal(state.selectedId, "ws_production");
assert.equal(state.workspaces.length, 1);
assert.equal(state.workspaces[0].path, workspace);
await assert.rejects(readFile(path.join(isolatedUserData, "openwork-workspaces.json"), "utf8"));
} finally {
restoreEnv("OPENWORK_DESKTOP_WORKSPACE_STATE_PATH", previousStatePath);
restoreEnv("OPENWORK_DESKTOP_DISABLE_WORKSPACE_RECOVERY", previousRecovery);
}
});
test("keeps persisted empty desktop workspace state authoritative", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-"));
const userData = path.join(root, "userData");
const oldWorkspace = path.join(root, "old-workspace");
await mkdir(oldWorkspace, { recursive: true });
await mkdir(userData, { recursive: true });
await writeFile(
path.join(userData, "openwork-workspaces.json"),
JSON.stringify({ selectedId: "", activeId: null, watchedId: null, workspaces: [] }),
"utf8",
);
await writeFile(
path.join(userData, "openwork-server-tokens.json"),
JSON.stringify({ version: 1, workspaces: { [oldWorkspace]: { updatedAt: 2 } } }),
"utf8",
);
const previous = process.env.OPENWORK_SERVER_CONFIG;
process.env.OPENWORK_SERVER_CONFIG = path.join(root, "missing-server.json");
try {
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? userData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.readWorkspaceState();
assert.deepEqual(state.workspaces, []);
assert.equal(state.selectedId, "");
} finally {
restoreEnv("OPENWORK_SERVER_CONFIG", previous);
}
});
test("prefers server config workspaces when desktop state is missing", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-"));
const userData = path.join(root, "userData");
const oldWorkspace = path.join(root, "server-workspace");
const serverConfig = path.join(root, "server.json");
await mkdir(oldWorkspace, { recursive: true });
await mkdir(userData, { recursive: true });
const oldWorkspaceReal = await realpath(oldWorkspace);
await writeFile(
serverConfig,
JSON.stringify({ workspaces: [{ path: oldWorkspace, name: "From Server" }] }),
"utf8",
);
await writeFile(
path.join(userData, "openwork-server-tokens.json"),
JSON.stringify({ version: 1, workspaces: { [path.join(root, "other")]: { updatedAt: 9 } } }),
"utf8",
);
const previous = process.env.OPENWORK_SERVER_CONFIG;
process.env.OPENWORK_SERVER_CONFIG = serverConfig;
try {
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? userData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.readWorkspaceState();
assert.equal(state.workspaces.length, 1);
assert.equal(state.workspaces[0].path, oldWorkspaceReal);
assert.equal(state.workspaces[0].name, "From Server");
} finally {
if (previous === undefined) delete process.env.OPENWORK_SERVER_CONFIG;
else process.env.OPENWORK_SERVER_CONFIG = previous;
}
});
test("does not create a default workspace when desktop state is absent", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-"));
const userData = path.join(root, "userData");
const previousDevMode = process.env.OPENWORK_DEV_MODE;
const previousServerConfig = process.env.OPENWORK_SERVER_CONFIG;
process.env.OPENWORK_DEV_MODE = "1";
process.env.OPENWORK_SERVER_CONFIG = path.join(root, "missing-server.json");
try {
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? userData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.readWorkspaceState();
assert.equal(state.workspaces.length, 0);
await assert.rejects(readFile(path.join(userData, "openwork-dev-data", "home", "OpenWork", ".opencode", "openwork.json"), "utf8"));
} finally {
restoreEnv("OPENWORK_DEV_MODE", previousDevMode);
restoreEnv("OPENWORK_SERVER_CONFIG", previousServerConfig);
}
});
test("normalizes recovered remote OpenWork entries before persisting", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-"));
const userData = path.join(root, "userData");
const serverConfig = path.join(root, "server.json");
await mkdir(userData, { recursive: true });
await writeFile(
serverConfig,
JSON.stringify({
workspaces: [
{
id: "legacy_one",
path: "/workspace",
workspaceType: "remote",
remoteType: "openwork",
baseUrl: "https://worker.example.com/workspace/ws_remote",
},
{
id: "legacy_two",
path: "/workspace",
workspaceType: "remote",
remoteType: "openwork",
baseUrl: "https://worker.example.com/w/ws_remote",
},
],
}),
"utf8",
);
const previous = process.env.OPENWORK_SERVER_CONFIG;
process.env.OPENWORK_SERVER_CONFIG = serverConfig;
try {
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? userData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.readWorkspaceState();
assert.equal(state.workspaces.length, 1);
assert.equal(state.workspaces[0].id, "rem_ws_remote");
assert.equal(state.workspaces[0].baseUrl, "https://worker.example.com");
assert.equal(state.workspaces[0].openworkWorkspaceId, "ws_remote");
assert.equal(state.selectedId, "rem_ws_remote");
} finally {
if (previous === undefined) delete process.env.OPENWORK_SERVER_CONFIG;
else process.env.OPENWORK_SERVER_CONFIG = previous;
}
});
test("forgetting a local workspace removes its recovery token", async () => {
const root = await mkdtemp(path.join(tmpdir(), "openwork-workspace-store-"));
const userData = path.join(root, "userData");
const forgottenWorkspace = path.join(root, "forgotten-workspace");
const retainedWorkspace = path.join(root, "retained-workspace");
await mkdir(forgottenWorkspace, { recursive: true });
await mkdir(retainedWorkspace, { recursive: true });
await mkdir(userData, { recursive: true });
await writeFile(
path.join(userData, "openwork-workspaces.json"),
JSON.stringify({
selectedId: "ws_forgotten",
activeId: "ws_forgotten",
watchedId: "ws_forgotten",
workspaces: [
{ id: "ws_forgotten", path: forgottenWorkspace, workspaceType: "local" },
{ id: "ws_retained", path: retainedWorkspace, workspaceType: "local" },
],
}),
"utf8",
);
await writeFile(
path.join(userData, "openwork-server-tokens.json"),
JSON.stringify({
version: 1,
workspaces: {
[forgottenWorkspace]: { token: "forgotten", updatedAt: 2 },
[retainedWorkspace]: { token: "retained", updatedAt: 1 },
},
}),
"utf8",
);
const store = createWorkspaceStore({
app: { getPath: (name) => name === "userData" ? userData : root },
defaultDenBaseUrl: "https://example.test",
defaultRequireSignin: false,
forceRequireSignin: false,
});
const state = await store.forgetWorkspace("ws_forgotten");
assert.deepEqual(state.workspaces.map((workspace) => workspace.id), ["ws_retained"]);
assert.equal(state.selectedId, "");
assert.equal(state.activeId, null);
assert.equal(state.watchedId, null);
const tokens = JSON.parse(await readFile(path.join(userData, "openwork-server-tokens.json"), "utf8"));
assert.deepEqual(Object.keys(tokens.workspaces), [retainedWorkspace]);
assert.equal(tokens.workspaces[retainedWorkspace].token, "retained");
});
test("desktop bootstrap prefers a newer canonical writtenAt over stale legacy", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath }) => {
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://canonical.example.com",
requireSignin: false,
writtenAt: "2026-01-02T00:00:00.000Z",
});
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://legacy.example.com",
requireSignin: true,
writtenAt: "2026-01-01T00:00:00.000Z",
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://canonical.example.com");
assert.equal(config.fromFile, true);
const persisted = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(persisted.baseUrl, "https://canonical.example.com");
});
});
test("desktop bootstrap migrates a newer legacy writtenAt to canonical", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath }) => {
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://canonical.example.com",
requireSignin: false,
writtenAt: "2026-01-01T00:00:00.000Z",
});
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://legacy.example.com",
requireSignin: true,
writtenAt: "2026-01-02T00:00:00.000Z",
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://legacy.example.com");
assert.equal(config.requireSignin, true);
assert.equal(config.fromFile, true);
const migrated = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(migrated.baseUrl, "https://legacy.example.com");
});
});
test("explicit desktop bootstrap path never inherits legacy activation state", async () => {
await withIsolatedBootstrapStore(async ({ store, legacyPath, root }) => {
const explicitPath = path.join(root, "isolated", "desktop-bootstrap.json");
process.env.OPENWORK_DESKTOP_BOOTSTRAP_PATH = explicitPath;
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://app.openworklabs.com",
requireSignin: true,
enterpriseActivation: {
activatedAt: "2026-07-27T13:30:23.342Z",
denBaseUrl: "https://app.openworklabs.com/api/den",
},
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.fromFile, false);
assert.equal(config.enterpriseActivation, undefined);
await assert.rejects(readFile(explicitPath, "utf8"));
});
});
test("explicit desktop bootstrap path still reads its configured bootstrap", async () => {
await withIsolatedBootstrapStore(async ({ store, root }) => {
const explicitPath = path.join(root, "isolated", "desktop-bootstrap.json");
process.env.OPENWORK_DESKTOP_BOOTSTRAP_PATH = explicitPath;
await writeBootstrapConfig(explicitPath, {
baseUrl: "https://enterprise.example.com",
requireSignin: true,
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.fromFile, true);
assert.equal(config.baseUrl, "https://enterprise.example.com");
assert.equal("requireActivation" in config, false);
});
});
test("desktop bootstrap prefers an older legacy organization config over a newer canonical hosted default", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath }) => {
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://app.openworklabs.com/api/den/",
apiBaseUrl: "https://api.unrelated.example",
requireSignin: false,
writtenAt: "2026-07-10T13:00:00.000Z",
});
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://openwork.organization.internal.example",
apiBaseUrl: "https://api.organization.internal.example",
requireSignin: true,
writtenAt: "2026-07-09T12:00:00.000Z",
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://openwork.organization.internal.example");
assert.equal(config.fromFile, true);
const migrated = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(migrated.baseUrl, "https://openwork.organization.internal.example");
});
});
test("desktop bootstrap keeps an older canonical organization config over a newer legacy hosted default", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath }) => {
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://openwork.organization.internal.example",
apiBaseUrl: "https://api.organization.internal.example",
requireSignin: true,
writtenAt: "2026-07-09T12:00:00.000Z",
});
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://api.openworklabs.com/v1/",
apiBaseUrl: "https://api.unrelated.example",
requireSignin: false,
writtenAt: "2026-07-10T13:00:00.000Z",
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://openwork.organization.internal.example");
assert.equal(config.fromFile, true);
const persisted = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(persisted.baseUrl, "https://openwork.organization.internal.example");
});
});
test("desktop bootstrap ignores a newer malformed canonical config when legacy is valid", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath }) => {
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://legacy.organization.internal.example",
requireSignin: true,
});
await mkdir(path.dirname(canonicalPath), { recursive: true });
await writeFile(canonicalPath, "{ malformed", "utf8");
const older = new Date("2026-07-09T12:00:00.000Z");
const newer = new Date("2026-07-10T12:00:00.000Z");
await utimes(legacyPath, older, older);
await utimes(canonicalPath, newer, newer);
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://legacy.organization.internal.example");
assert.equal(config.fromFile, true);
const migrated = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(migrated.baseUrl, "https://legacy.organization.internal.example");
});
});
test("desktop bootstrap falls back to mtime when writtenAt is missing", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath }) => {
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://canonical.example.com",
requireSignin: false,
});
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://legacy.example.com",
requireSignin: true,
});
const older = new Date("2026-01-01T00:00:00.000Z");
const newer = new Date("2026-01-02T00:00:00.000Z");
await utimes(canonicalPath, older, older);
await utimes(legacyPath, newer, newer);
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://legacy.example.com");
assert.equal(config.fromFile, true);
});
});
test("sync desktop bootstrap reader matches async reader for canonical, legacy, and missing configs", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath }) => {
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://canonical.example.com",
requireSignin: false,
writtenAt: "2026-01-02T00:00:00.000Z",
});
assert.deepEqual(store.readDesktopBootstrapConfigSync(), await store.getDesktopBootstrapConfig());
});
await withIsolatedBootstrapStore(async ({ store, legacyPath }) => {
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://legacy.example.com",
requireSignin: true,
writtenAt: "2026-01-02T00:00:00.000Z",
});
const syncConfig = store.readDesktopBootstrapConfigSync();
const asyncConfig = await store.getDesktopBootstrapConfig();
assert.deepEqual(syncConfig, asyncConfig);
assert.equal(syncConfig.fromFile, true);
});
await withIsolatedBootstrapStore(async ({ store }) => {
const syncConfig = store.readDesktopBootstrapConfigSync();
const asyncConfig = await store.getDesktopBootstrapConfig();
assert.deepEqual(syncConfig, asyncConfig);
assert.equal(syncConfig.fromFile, false);
});
});
test("desktop bootstrap fallback marks fromFile false only when no parseable file is available", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath }) => {
await mkdir(path.dirname(canonicalPath), { recursive: true });
await writeFile(canonicalPath, "{ malformed", "utf8");
const syncConfig = store.readDesktopBootstrapConfigSync();
const asyncConfig = await store.getDesktopBootstrapConfig();
assert.deepEqual(syncConfig, asyncConfig);
assert.equal(syncConfig.baseUrl, "https://default.example.com");
assert.equal(syncConfig.fromFile, false);
});
});
test("desktop bootstrap writes include a fresh writtenAt stamp", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath }) => {
const config = await store.setDesktopBootstrapConfig({
baseUrl: "https://canonical.example.com",
requireSignin: true,
});
assert.equal(Number.isFinite(Date.parse(config.writtenAt)), true);
const persisted = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(persisted.baseUrl, "https://canonical.example.com");
assert.equal(Number.isFinite(Date.parse(persisted.writtenAt)), true);
});
});
test("enterprise activation is preserved, required activation is overrideable, and forced sign-in cannot be disabled", async () => {
await withIsolatedBootstrapStore(async ({ createStore, canonicalPath }) => {
const store = createStore({
defaultRequireSignin: true,
forceRequireSignin: true,
});
await store.setDesktopBootstrapConfig({
baseUrl: "https://app.openworklabs.com",
requireSignin: false,
requireActivation: false,
enterpriseActivation: {
activatedAt: "2026-07-27T12:00:00.000Z",
denBaseUrl: "https://app.openworklabs.com",
},
});
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.requireSignin, true);
assert.equal(config.requireActivation, false);
assert.deepEqual(config.enterpriseActivation, {
activatedAt: "2026-07-27T12:00:00.000Z",
denBaseUrl: "https://app.openworklabs.com",
});
const persisted = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal(persisted.requireSignin, true);
assert.equal(persisted.requireActivation, false);
});
});
// Both flavors share one application identifier, so they share this file. An
// omitted policy must stay omitted: writing the enterprise build default here
// would gate the public artifact on the same machine.
test("an omitted requireActivation is never materialized into the shared bootstrap file", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath }) => {
await store.setDesktopBootstrapConfig({
baseUrl: "https://app.openworklabs.com",
requireSignin: true,
});
const persisted = JSON.parse(await readFile(canonicalPath, "utf8"));
assert.equal("requireActivation" in persisted, false);
assert.equal("requireActivation" in await store.getDesktopBootstrapConfig(), false);
});
});
test("clearDesktopBootstrapConfig removes bootstrap files without deleting workspace state", async () => {
await withIsolatedBootstrapStore(async ({ store, canonicalPath, legacyPath, userDataPath }) => {
const workspaceStatePath = path.join(userDataPath, "openwork-workspaces.json");
await writeBootstrapConfig(canonicalPath, {
baseUrl: "https://canonical.example.com",
requireSignin: false,
writtenAt: "2026-01-02T00:00:00.000Z",
});
await writeBootstrapConfig(legacyPath, {
baseUrl: "https://legacy.example.com",
requireSignin: true,
writtenAt: "2026-01-01T00:00:00.000Z",
});
await mkdir(userDataPath, { recursive: true });
await writeFile(workspaceStatePath, JSON.stringify({ selectedId: "ws_keep", workspaces: [] }), "utf8");
await store.clearDesktopBootstrapConfig();
await assert.rejects(readFile(canonicalPath, "utf8"));
await assert.rejects(readFile(legacyPath, "utf8"));
const workspaceState = JSON.parse(await readFile(workspaceStatePath, "utf8"));
assert.equal(workspaceState.selectedId, "ws_keep");
const config = await store.getDesktopBootstrapConfig();
assert.equal(config.baseUrl, "https://default.example.com");
assert.equal(config.requireSignin, false);
assert.equal(config.fromFile, false);
});
});