Skip to content

Commit 5f8300a

Browse files
committed
test: stabilize channel mocks under load
1 parent 41cad1a commit 5f8300a

2 files changed

Lines changed: 38 additions & 8 deletions

File tree

extensions/matrix/src/approval-reactions.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ import {
1010
} from "./approval-reactions.js";
1111
import { setMatrixRuntime } from "./runtime.js";
1212

13+
function createRuntimeLogger(overrides: { warn?: ReturnType<typeof vi.fn> } = {}) {
14+
// Runtime state survives no-isolate workers, so expose every logger method later files may call.
15+
return {
16+
debug: vi.fn(),
17+
info: vi.fn(),
18+
warn: overrides.warn ?? vi.fn(),
19+
error: vi.fn(),
20+
};
21+
}
22+
1323
afterEach(() => {
1424
clearMatrixApprovalReactionTargetsForTest();
1525
vi.restoreAllMocks();
@@ -124,7 +134,7 @@ describe("matrix approval reactions", () => {
124134
}));
125135
setMatrixRuntime({
126136
state: { openKeyedStore },
127-
logging: { getChildLogger: () => ({ warn: vi.fn() }) },
137+
logging: { getChildLogger: () => createRuntimeLogger() },
128138
} as never);
129139

130140
registerMatrixApprovalReactionTarget({
@@ -165,7 +175,7 @@ describe("matrix approval reactions", () => {
165175
throw new Error("sqlite unavailable");
166176
}),
167177
},
168-
logging: { getChildLogger: () => ({ warn }) },
178+
logging: { getChildLogger: () => createRuntimeLogger({ warn }) },
169179
} as never);
170180

171181
registerMatrixApprovalReactionTarget({

extensions/whatsapp/src/monitor-inbox.captures-media-path-image-messages.test-support.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import {
88
getSock,
99
installWebMonitorInboxUnitTestHooks,
1010
mockLoadConfig,
11-
settleInboundWork,
12-
waitForMessageCalls,
1311
} from "./monitor-inbox.test-harness.js";
1412
let monitorWebInbox: typeof import("./inbound.js").monitorWebInbox;
1513
const inboundLoggerInfoMock = vi.hoisted(() => vi.fn());
@@ -37,23 +35,45 @@ describe("web monitor inbox", () => {
3735
monitorWebInbox = getMonitorWebInbox();
3836
});
3937

40-
async function openMonitor(onMessage = vi.fn()) {
38+
async function openMonitor(
39+
onMessage = vi.fn(),
40+
extraOptions: Partial<Parameters<typeof monitorWebInbox>[0]> = {},
41+
) {
4142
return await monitorWebInbox({
4243
cfg: mockLoadConfig() as never,
4344
verbose: false,
4445
accountId: DEFAULT_ACCOUNT_ID,
4546
authDir: getAuthDir(),
4647
onMessage,
48+
...extraOptions,
4749
});
4850
}
4951

5052
async function runSingleUpsertAndCapture(upsert: unknown) {
5153
const onMessage = vi.fn();
52-
const listener = await openMonitor(onMessage);
54+
let armed = false;
55+
let observedPendingWork = false;
56+
let resolvePendingWorkDrained!: () => void;
57+
const pendingWorkDrained = new Promise<void>((resolve) => {
58+
resolvePendingWorkDrained = resolve;
59+
});
60+
const listener = await openMonitor(onMessage, {
61+
onPendingWorkChanged: (pendingWorkCount) => {
62+
if (!armed) {
63+
return;
64+
}
65+
if (pendingWorkCount > 0) {
66+
observedPendingWork = true;
67+
} else if (observedPendingWork) {
68+
resolvePendingWorkDrained();
69+
}
70+
},
71+
});
5372
const sock = getSock();
73+
// The monitor owns async media and delivery work; wait for its drain signal instead of polling.
74+
armed = true;
5475
sock.ev.emit("messages.upsert", upsert);
55-
await waitForMessageCalls(onMessage, 1);
56-
await settleInboundWork();
76+
await pendingWorkDrained;
5777
return { onMessage, listener, sock };
5878
}
5979

0 commit comments

Comments
 (0)