import { render, screen } from "@testing-library/react";
import { afterEach, describe, expect, it, vi } from "vitest";
import type { BrowserNodeHostApi } from "@tutti-os/browser-node";
import type { BrowserNodeWorkbenchHeaderProps } from "@tutti-os/browser-node/react";
import type { I18nRuntime } from "@tutti-os/ui-i18n-runtime";
import {
AgentToolBrowserPanel,
type AgentToolBrowserController
} from "./AgentToolBrowserPanel.tsx";
const browserNodeMocks = vi.hoisted(() => ({
headerProps: null as BrowserNodeWorkbenchHeaderProps | null
}));
vi.mock("@tutti-os/browser-node/react", () => ({
BrowserNode: () =>
,
BrowserNodeWorkbenchHeader: (props: BrowserNodeWorkbenchHeaderProps) => {
browserNodeMocks.headerProps = props;
return (
{props.defaultActions}
{props.navigationActions}
);
}
}));
describe("AgentToolBrowserPanel header composition", () => {
afterEach(() => {
browserNodeMocks.headerProps = null;
});
it("composes host window actions into the browser tab header", async () => {
render(
Window actions}
dragHandleProps={{ "aria-label": "Browser drag handle" }}
hidden={false}
i18n={{ t: (key) => key } as I18nRuntime}
navigationActions={}
/>
);
await vi.dynamicImportSettled();
expect(
await screen.findByLabelText("Browser drag handle")
).toBeInTheDocument();
expect(screen.getByText("Window actions")).toBeInTheDocument();
expect(screen.getByText("Navigation action")).toBeInTheDocument();
expect(browserNodeMocks.headerProps?.defaultActions).not.toBeNull();
expect(
document.querySelectorAll('[data-browser-node-header="true"]')
).toHaveLength(1);
});
it("activates an existing page by URL through the host controller", async () => {
let controller: AgentToolBrowserController | null = null;
render(
key } as I18nRuntime}
onControllerReady={(value) => {
controller = value;
}}
/>
);
await vi.dynamicImportSettled();
await screen.findByLabelText("Browser drag handle");
expect(controller).not.toBeNull();
const secondPageNodeId = controller!.createPage("https://second.test");
expect(controller!.selectPage(secondPageNodeId)).toBe(true);
const firstPageNodeId = controller!.activatePageByUrl(
"https://first.test/"
);
expect(firstPageNodeId).not.toBeNull();
expect(firstPageNodeId).not.toBe(secondPageNodeId);
expect(controller!.ownsPage(firstPageNodeId!)).toBe(true);
});
});
function createBrowserApi(): BrowserNodeHostApi {
return {
activate: async () => undefined,
close: async () => undefined,
goBack: async () => undefined,
goForward: async () => undefined,
navigate: async () => undefined,
onEvent: () => () => undefined,
prepareSession: async () => undefined,
registerGuest: async () => undefined,
reload: async () => undefined,
unregisterGuest: async () => undefined
};
}