diff --git a/src/gateway/control-ui.http.test.ts b/src/gateway/control-ui.http.test.ts
index a63bb1590e2..54cf972e79c 100644
--- a/src/gateway/control-ui.http.test.ts
+++ b/src/gateway/control-ui.http.test.ts
@@ -40,6 +40,25 @@ describe("handleControlUiHttpRequest", () => {
expect(params.end).toHaveBeenCalledWith("Not Found");
}
+ function expectUnhandledRoutes(params: {
+ urls: string[];
+ method: "GET" | "POST";
+ rootPath: string;
+ basePath?: string;
+ expectationLabel: string;
+ }) {
+ for (const url of params.urls) {
+ const { handled, end } = runControlUiRequest({
+ url,
+ method: params.method,
+ rootPath: params.rootPath,
+ ...(params.basePath ? { basePath: params.basePath } : {}),
+ });
+ expect(handled, `${params.expectationLabel}: ${url}`).toBe(false);
+ expect(end, `${params.expectationLabel}: ${url}`).not.toHaveBeenCalled();
+ }
+ }
+
function runControlUiRequest(params: {
url: string;
method: "GET" | "HEAD" | "POST";
@@ -147,53 +166,80 @@ describe("handleControlUiHttpRequest", () => {
});
});
- it("serves bootstrap config JSON", async () => {
+ it.each([
+ {
+ name: "at root",
+ url: CONTROL_UI_BOOTSTRAP_CONFIG_PATH,
+ expectedBasePath: "",
+ assistantName: ".png",
+ expectedAvatarUrl: "/avatar/main",
+ },
+ {
+ name: "under basePath",
+ url: `/openclaw${CONTROL_UI_BOOTSTRAP_CONFIG_PATH}`,
+ basePath: "/openclaw",
+ expectedBasePath: "/openclaw",
+ assistantName: "Ops",
+ assistantAvatar: "ops.png",
+ expectedAvatarUrl: "/openclaw/avatar/main",
+ },
+ ])("serves bootstrap config JSON $name", async (testCase) => {
await withControlUiRoot({
fn: async (tmp) => {
const { res, end } = makeMockHttpResponse();
const handled = handleControlUiHttpRequest(
- { url: CONTROL_UI_BOOTSTRAP_CONFIG_PATH, method: "GET" } as IncomingMessage,
+ { url: testCase.url, method: "GET" } as IncomingMessage,
res,
{
+ ...(testCase.basePath ? { basePath: testCase.basePath } : {}),
root: { kind: "resolved", path: tmp },
config: {
agents: { defaults: { workspace: tmp } },
- ui: { assistant: { name: ".png" } },
+ ui: {
+ assistant: {
+ name: testCase.assistantName,
+ avatar: testCase.assistantAvatar,
+ },
+ },
},
},
);
expect(handled).toBe(true);
const parsed = parseBootstrapPayload(end);
- expect(parsed.basePath).toBe("");
- expect(parsed.assistantName).toBe("