test(headless): update v2 migration tests for fatal-by-default fallback policy

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Mikael Hugo 2026-05-15 20:00:02 +02:00
parent 5b831e587b
commit ced90e84a8

View file

@ -66,6 +66,7 @@ class MockRpcClient {
sendUICalls: SendUICall[] = [];
initCalled = false;
initShouldFail = false;
stopCalled = false;
sendUIResponse(
id: string,
@ -88,6 +89,26 @@ class MockRpcClient {
}
return { protocolVersion: 2 };
}
async stop(): Promise<void> {
this.stopCalled = true;
}
}
async function negotiateV2ForTest(
client: MockRpcClient,
allowLegacyFallback = false,
): Promise<"v2" | "legacy" | "fatal"> {
try {
await client.init({ clientId: "sf-headless" });
return "v2";
} catch {
if (!allowLegacyFallback) {
await client.stop();
return "fatal";
}
return "legacy";
}
}
// ─── Extracted handleExtensionUIRequest (mirrors headless-ui.ts) ────────────
@ -512,19 +533,24 @@ test("v2 init success sets v2Enabled", async () => {
assert.equal(v2Enabled, true);
});
test("v2 init failure falls back gracefully (v1 mode)", async () => {
test("v2 init failure is fatal by default", async () => {
const client = new MockRpcClient();
client.initShouldFail = true;
let v2Enabled = false;
try {
await client.init({ clientId: "sf-headless" });
v2Enabled = true;
} catch {
// fall back to v1 — this is expected
}
const mode = await negotiateV2ForTest(client);
assert.equal(client.initCalled, true);
assert.equal(v2Enabled, false);
assert.equal(client.stopCalled, true);
assert.equal(mode, "fatal");
});
test("v2 init failure uses v1 only with explicit legacy fallback opt-in", async () => {
const client = new MockRpcClient();
client.initShouldFail = true;
const mode = await negotiateV2ForTest(client, true);
assert.equal(client.initCalled, true);
assert.equal(client.stopCalled, false);
assert.equal(mode, "legacy");
});
// ─── injector adapter ───────────────────────────────────────────────────────