Files
openclaw/extensions/bonjour/index.test.ts
Peter Steinberger ae55a4090c refactor(canvas): make the panel a widget presenter (#126030)
* refactor(canvas): retire legacy host and commands

* refactor(apple): narrow shared Canvas contracts

* refactor(macos): keep Canvas as widget presenter

* refactor(ios): remove Canvas client

* refactor(android): remove Canvas client

* refactor(linux): remove Canvas client

* fix(ci): isolate native locale artifacts

* fix(linux): regenerate companion lockfile

* fix(canvas): refresh native tool display metadata

* test(canvas): align coverage with presenter surface

* test(canvas): remove obsolete asset root seam

* test(canvas): stabilize retirement CI coverage

* refactor(swift): remove orphaned resource wrapper

* test(ios): remove retired canvas layout assertion

* fix(macos): reserve retired canvas command namespace

* refactor(macos): isolate canvas command policy

* fix(canvas): select only eligible macOS panels

* fix(canvas): keep panel selection plugin-owned
2026-08-19 08:21:07 -07:00

106 lines
3.3 KiB
TypeScript

// Bonjour tests cover index plugin behavior.
import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api";
import { afterAll, describe, expect, it, vi } from "vitest";
const mocks = vi.hoisted(() => ({
advertiserModuleLoaded: vi.fn(),
runtimeModuleLoaded: vi.fn(),
startGatewayBonjourAdvertiser: vi.fn(async () => ({ stop: vi.fn() })),
registerUncaughtExceptionHandler: vi.fn(),
registerUnhandledRejectionHandler: vi.fn(),
}));
vi.mock("./src/advertiser.js", () => {
mocks.advertiserModuleLoaded();
return {
startGatewayBonjourAdvertiser: mocks.startGatewayBonjourAdvertiser,
};
});
vi.mock("openclaw/plugin-sdk/runtime", () => {
mocks.runtimeModuleLoaded();
return {
registerUncaughtExceptionHandler: mocks.registerUncaughtExceptionHandler,
registerUnhandledRejectionHandler: mocks.registerUnhandledRejectionHandler,
};
});
const { default: bonjourPlugin } = await import("./index.js");
afterAll(() => {
vi.doUnmock("./src/advertiser.js");
vi.doUnmock("openclaw/plugin-sdk/runtime");
vi.resetModules();
});
describe("bonjour plugin entry", () => {
it("lazy-loads advertiser runtime when gateway discovery advertises", async () => {
let discoveryService:
| Parameters<ReturnType<typeof createTestPluginApi>["registerGatewayDiscoveryService"]>[0]
| undefined;
const logger = {
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
debug: vi.fn(),
};
const api = createTestPluginApi({
logger,
registerGatewayDiscoveryService(service) {
discoveryService = service;
},
});
expect(mocks.advertiserModuleLoaded).not.toHaveBeenCalled();
expect(mocks.runtimeModuleLoaded).not.toHaveBeenCalled();
bonjourPlugin.register(api);
expect(discoveryService?.id).toBe("bonjour");
expect(mocks.advertiserModuleLoaded).not.toHaveBeenCalled();
expect(mocks.runtimeModuleLoaded).not.toHaveBeenCalled();
if (!discoveryService) {
throw new Error("expected bonjour plugin to register a discovery service");
}
const stop = vi.fn();
mocks.startGatewayBonjourAdvertiser.mockResolvedValueOnce({ stop });
await expect(
discoveryService.advertise({
machineDisplayName: "Dev Box",
gatewayPort: 3210,
gatewayTlsEnabled: true,
gatewayTlsFingerprintSha256: "abc123",
gatewayDirectReachable: true,
sshPort: 22,
tailnetDns: "dev.tailnet.ts.net",
cliPath: "/usr/local/bin/openclaw",
minimal: false,
}),
).resolves.toEqual({ stop });
expect(mocks.advertiserModuleLoaded).toHaveBeenCalledTimes(1);
expect(mocks.runtimeModuleLoaded).toHaveBeenCalledTimes(1);
expect(mocks.startGatewayBonjourAdvertiser).toHaveBeenCalledWith(
{
instanceName: "Dev Box (OpenClaw)",
gatewayPort: 3210,
gatewayTlsEnabled: true,
gatewayTlsFingerprintSha256: "abc123",
gatewayDirectReachable: true,
sshPort: 22,
tailnetDns: "dev.tailnet.ts.net",
cliPath: "/usr/local/bin/openclaw",
minimal: false,
},
{
logger,
registerUncaughtExceptionHandler: mocks.registerUncaughtExceptionHandler,
registerUnhandledRejectionHandler: mocks.registerUnhandledRejectionHandler,
},
);
});
});