openclaw/src/browser/session-tab-registry.test.ts

115 lines
3.2 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import {
__countTrackedSessionBrowserTabsForTests,
__resetTrackedSessionBrowserTabsForTests,
closeTrackedBrowserTabsForSessions,
trackSessionBrowserTab,
untrackSessionBrowserTab,
} from "./session-tab-registry.js";
describe("session tab registry", () => {
beforeEach(() => {
__resetTrackedSessionBrowserTabsForTests();
});
afterEach(() => {
__resetTrackedSessionBrowserTabsForTests();
});
it("tracks and closes tabs for normalized session keys", async () => {
trackSessionBrowserTab({
sessionKey: "Agent:Main:Main",
targetId: "tab-a",
baseUrl: "http://127.0.0.1:9222",
profile: "OpenClaw",
});
trackSessionBrowserTab({
sessionKey: "agent:main:main",
targetId: "tab-b",
baseUrl: "http://127.0.0.1:9222",
profile: "OpenClaw",
});
expect(__countTrackedSessionBrowserTabsForTests("agent:main:main")).toBe(2);
const closeTab = vi.fn(async () => {});
const closed = await closeTrackedBrowserTabsForSessions({
sessionKeys: ["agent:main:main"],
closeTab,
});
expect(closed).toBe(2);
expect(closeTab).toHaveBeenCalledTimes(2);
expect(closeTab).toHaveBeenNthCalledWith(1, {
targetId: "tab-a",
baseUrl: "http://127.0.0.1:9222",
profile: "openclaw",
});
expect(closeTab).toHaveBeenNthCalledWith(2, {
targetId: "tab-b",
baseUrl: "http://127.0.0.1:9222",
profile: "openclaw",
});
expect(__countTrackedSessionBrowserTabsForTests()).toBe(0);
});
it("untracks specific tabs", async () => {
trackSessionBrowserTab({
sessionKey: "agent:main:main",
targetId: "tab-a",
});
trackSessionBrowserTab({
sessionKey: "agent:main:main",
targetId: "tab-b",
});
untrackSessionBrowserTab({
sessionKey: "agent:main:main",
targetId: "tab-a",
});
const closeTab = vi.fn(async () => {});
const closed = await closeTrackedBrowserTabsForSessions({
sessionKeys: ["agent:main:main"],
closeTab,
});
expect(closed).toBe(1);
expect(closeTab).toHaveBeenCalledTimes(1);
expect(closeTab).toHaveBeenCalledWith({
targetId: "tab-b",
baseUrl: undefined,
profile: undefined,
});
});
it("deduplicates tabs and ignores expected close errors", async () => {
trackSessionBrowserTab({
sessionKey: "agent:main:main",
targetId: "tab-a",
});
trackSessionBrowserTab({
sessionKey: "main",
targetId: "tab-a",
});
trackSessionBrowserTab({
sessionKey: "main",
targetId: "tab-b",
});
const warnings: string[] = [];
const closeTab = vi
.fn()
.mockRejectedValueOnce(new Error("target not found"))
.mockRejectedValueOnce(new Error("network down"));
const closed = await closeTrackedBrowserTabsForSessions({
sessionKeys: ["agent:main:main", "main"],
closeTab,
onWarn: (message) => warnings.push(message),
});
expect(closed).toBe(0);
expect(closeTab).toHaveBeenCalledTimes(2);
expect(warnings).toEqual([expect.stringContaining("network down")]);
expect(__countTrackedSessionBrowserTabsForTests()).toBe(0);
});
});