test: tighten browser playwright tab assertions

This commit is contained in:
Peter Steinberger
2026-05-11 02:20:44 +01:00
parent a375039aeb
commit da7624e32e

View File

@@ -17,6 +17,17 @@ function page(targetId: string, url = `https://${targetId.toLowerCase()}.example
};
}
async function expectBlockedCdpEndpoint(promise: Promise<unknown>) {
try {
await promise;
} catch (error) {
expect((error as { name?: unknown }).name).toBe("BrowserCdpEndpointBlockedError");
expect((error as { status?: unknown }).status).toBe(400);
return;
}
throw new Error("expected blocked browser CDP endpoint");
}
describe("browser remote profile tab ops via Playwright", () => {
it("uses Playwright tab operations when available", async () => {
const listPagesViaPlaywright = vi.fn(async () => [
@@ -81,17 +92,16 @@ describe("browser remote profile tab ops via Playwright", () => {
expect(tabs.map((tab) => tab.suggestedTargetId)).toEqual(["t1", "t2"]);
const labeled = await remote.labelTab("t2", "docs");
expect(labeled).toMatchObject({
targetId: "B",
suggestedTargetId: "docs",
tabId: "t2",
label: "docs",
});
expect(labeled.targetId).toBe("B");
expect(labeled.suggestedTargetId).toBe("docs");
expect(labeled.tabId).toBe("t2");
expect(labeled.label).toBe("docs");
await remote.focusTab("docs");
expect(focusPageByTargetIdViaPlaywright).toHaveBeenCalledWith(
expect.objectContaining({ targetId: "B" }),
);
const focusCall = (focusPageByTargetIdViaPlaywright.mock.calls as unknown[][])[0]?.[0] as
| { targetId?: unknown }
| undefined;
expect(focusCall?.targetId).toBe("B");
});
it("transfers stable aliases across a high-confidence target replacement", async () => {
@@ -105,24 +115,30 @@ describe("browser remote profile tab ops via Playwright", () => {
const { state, remote } = deps.createRemoteRouteHarness();
const first = await remote.listTabs();
expect(first).toMatchObject([{ targetId: "A", tabId: "t1", suggestedTargetId: "t1" }]);
expect(first).toHaveLength(1);
expect(first[0]?.targetId).toBe("A");
expect(first[0]?.tabId).toBe("t1");
expect(first[0]?.suggestedTargetId).toBe("t1");
const labeled = await remote.labelTab("t1", "form");
expect(labeled).toMatchObject({ targetId: "A", tabId: "t1", label: "form" });
expect(labeled.targetId).toBe("A");
expect(labeled.tabId).toBe("t1");
expect(labeled.label).toBe("form");
state.profiles.get("remote")!.lastTargetId = "A";
currentPages = [page("B", "https://app.example/submitted")];
const afterSwap = await remote.listTabs();
expect(afterSwap).toMatchObject([
{ targetId: "B", tabId: "t1", suggestedTargetId: "form", label: "form" },
]);
expect(afterSwap).toHaveLength(1);
expect(afterSwap[0]?.targetId).toBe("B");
expect(afterSwap[0]?.tabId).toBe("t1");
expect(afterSwap[0]?.suggestedTargetId).toBe("form");
expect(afterSwap[0]?.label).toBe("form");
expect(state.profiles.get("remote")?.lastTargetId).toBe("B");
await expect(remote.ensureTabAvailable("A")).rejects.toThrow(/tab not found/i);
await expect(remote.ensureTabAvailable("form")).resolves.toMatchObject({
targetId: "B",
tabId: "t1",
label: "form",
});
const formTab = await remote.ensureTabAvailable("form");
expect(formTab.targetId).toBe("B");
expect(formTab.tabId).toBe("t1");
expect(formTab.label).toBe("form");
});
it("does not transfer aliases when target replacement is ambiguous", async () => {
@@ -265,18 +281,9 @@ describe("browser remote profile tab ops via Playwright", () => {
const ctx = deps.createBrowserRouteContext({ getState: () => state });
const remote = ctx.forProfile("remote");
await expect(remote.listTabs()).rejects.toMatchObject({
name: "BrowserCdpEndpointBlockedError",
status: 400,
});
await expect(remote.focusTab("T1")).rejects.toMatchObject({
name: "BrowserCdpEndpointBlockedError",
status: 400,
});
await expect(remote.closeTab("T1")).rejects.toMatchObject({
name: "BrowserCdpEndpointBlockedError",
status: 400,
});
await expectBlockedCdpEndpoint(remote.listTabs());
await expectBlockedCdpEndpoint(remote.focusTab("T1"));
await expectBlockedCdpEndpoint(remote.closeTab("T1"));
expect(listPagesViaPlaywright).not.toHaveBeenCalled();
expect(focusPageByTargetIdViaPlaywright).not.toHaveBeenCalled();
expect(closePageByTargetIdViaPlaywright).not.toHaveBeenCalled();