test: fix merge gate regressions

This commit is contained in:
Val Alexander 2026-03-13 16:53:44 -05:00
parent 1708043ffb
commit aab43448ef
No known key found for this signature in database
6 changed files with 38 additions and 20 deletions

View File

@ -13,6 +13,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- Dashboard/agents and chat: scope the Agents > Skills view to the selected agent, restore clean sidebar status and log rendering, and keep oversized inline markdown images from expanding across the chat UI. (#45451) Thanks @BunsDev.
- Browser/existing-session: accept text-only `list_pages` and `new_page` responses from Chrome DevTools MCP so live-session tab discovery and new-tab open flows keep working when the server omits structured page metadata.
- Ollama/reasoning visibility: stop promoting native `thinking` and `reasoning` fields into final assistant text so local reasoning models no longer leak internal thoughts in normal replies. (#45330) Thanks @xi7ang.
- Cron/isolated sessions: route nested cron-triggered embedded runner work onto the nested lane so isolated cron jobs no longer deadlock when compaction or other queued inner work runs. Thanks @vincentkoc.

View File

@ -328,11 +328,13 @@ describe("BlueBubbles webhook monitor", () => {
}
function createHangingWebhookRequest(url = "/bluebubbles-webhook?password=test-password") {
const req = new EventEmitter() as IncomingMessage & { destroy: ReturnType<typeof vi.fn> };
const req = new EventEmitter() as IncomingMessage & {
destroy: (error?: Error) => IncomingMessage;
};
req.method = "POST";
req.url = url;
req.headers = {};
req.destroy = vi.fn();
req.destroy = vi.fn((_: Error | undefined) => req) as typeof req.destroy;
setRequestRemoteAddress(req, "127.0.0.1");
return req;
}

View File

@ -14,6 +14,17 @@ vi.mock("../send.js", () => ({
describe("registerMatrixMonitorEvents", () => {
const roomId = "!room:example.org";
function createRoomEvent(event: Partial<MatrixRawEvent>): MatrixRawEvent {
return {
event_id: "$default",
sender: "@bot:example.org",
type: "m.room.message",
origin_server_ts: 0,
content: {},
...event,
} as MatrixRawEvent;
}
beforeEach(() => {
sendReadReceiptMatrixMock.mockClear();
});
@ -67,10 +78,10 @@ describe("registerMatrixMonitorEvents", () => {
it("sends read receipt immediately for non-self messages", async () => {
const { client, onRoomMessage, roomMessageHandler } = createHarness();
const event = {
const event = createRoomEvent({
event_id: "$e1",
sender: "@alice:example.org",
} as MatrixRawEvent;
});
roomMessageHandler("!room:example.org", event);
@ -81,22 +92,26 @@ describe("registerMatrixMonitorEvents", () => {
});
it("does not send read receipts for self messages", async () => {
await expectForwardedWithoutReadReceipt({
event_id: "$e2",
sender: "@bot:example.org",
});
await expectForwardedWithoutReadReceipt(
createRoomEvent({
event_id: "$e2",
sender: "@bot:example.org",
}),
);
});
it("skips receipt when message lacks sender or event id", async () => {
await expectForwardedWithoutReadReceipt({
sender: "@alice:example.org",
});
await expectForwardedWithoutReadReceipt(
createRoomEvent({
sender: "@alice:example.org",
}),
);
});
it("caches self user id across messages", async () => {
const { getUserId, roomMessageHandler } = createHarness();
const first = { event_id: "$e3", sender: "@alice:example.org" } as MatrixRawEvent;
const second = { event_id: "$e4", sender: "@bob:example.org" } as MatrixRawEvent;
const first = createRoomEvent({ event_id: "$e3", sender: "@alice:example.org" });
const second = createRoomEvent({ event_id: "$e4", sender: "@bob:example.org" });
roomMessageHandler("!room:example.org", first);
roomMessageHandler("!room:example.org", second);
@ -110,7 +125,7 @@ describe("registerMatrixMonitorEvents", () => {
it("logs and continues when sending read receipt fails", async () => {
sendReadReceiptMatrixMock.mockRejectedValueOnce(new Error("network boom"));
const { roomMessageHandler, onRoomMessage, logVerboseMessage } = createHarness();
const event = { event_id: "$e5", sender: "@alice:example.org" } as MatrixRawEvent;
const event = createRoomEvent({ event_id: "$e5", sender: "@alice:example.org" });
roomMessageHandler("!room:example.org", event);
@ -126,7 +141,7 @@ describe("registerMatrixMonitorEvents", () => {
const { roomMessageHandler, onRoomMessage, getUserId } = createHarness({
getUserId: vi.fn().mockRejectedValue(new Error("cannot resolve self")),
});
const event = { event_id: "$e6", sender: "@alice:example.org" } as MatrixRawEvent;
const event = createRoomEvent({ event_id: "$e6", sender: "@alice:example.org" });
roomMessageHandler("!room:example.org", event);

View File

@ -409,10 +409,10 @@ describe("onboard (non-interactive): gateway and remote auth", () => {
let capturedError = "";
const runtimeWithCapture = {
log: () => {},
error: (message: string) => {
capturedError = message;
throw new Error(message);
log: (..._args: unknown[]) => {},
error: (...args: unknown[]) => {
capturedError = args.map(String).join(" ");
throw new Error(capturedError);
},
exit: (_code: number) => {
throw new Error("exit should not be reached after runtime.error");

View File

@ -35,6 +35,7 @@ import {
import type {
ExecEventPayload,
ExecFinishedEventParams,
ExecFinishedResult,
RunResult,
SkillBinsProvider,
SystemRunParams,

View File

@ -17,7 +17,6 @@ vi.mock("../../../pairing/pairing-store.js", () => ({
}));
type MessageHandler = (args: { event: Record<string, unknown>; body: unknown }) => Promise<void>;
type AppMentionHandler = MessageHandler;
type RegisteredEventName = "message" | "app_mention";
type MessageCase = {