





























@@ -147,6 +147,34 @@ function createHost() {
147147};
148148}
149149150+type BufferedPerformanceEvent = {
151+event?: string;
152+payload?: Record<string, unknown>;
153+};
154+155+function expectBufferedPerformanceEvent(
156+host: { eventLogBuffer: unknown[] },
157+event: string,
158+expectedPayload: Record<string, unknown>,
159+) {
160+const entry = host.eventLogBuffer.find((value): value is BufferedPerformanceEvent => {
161+if (!value || typeof value !== "object") {
162+return false;
163+}
164+const candidate = value as BufferedPerformanceEvent;
165+if (candidate.event !== event || !candidate.payload || typeof candidate.payload !== "object") {
166+return false;
167+}
168+return Object.entries(expectedPayload).every(([key, expected]) => {
169+return candidate.payload?.[key] === expected;
170+});
171+});
172+expect(entry).toBeDefined();
173+expect(entry?.payload).toMatchObject(expectedPayload);
174+expect(entry?.payload?.durationMs).toBeTypeOf("number");
175+return entry?.payload;
176+}
177+150178describe("refreshActiveTab", () => {
151179beforeEach(() => {
152180for (const fn of Object.values(mocks)) {
@@ -230,18 +258,10 @@ describe("refreshActiveTab", () => {
230258231259expect(host.requestUpdate).toHaveBeenCalled();
232260await vi.waitFor(() => {
233-expect(host.eventLogBuffer).toEqual(
234-expect.arrayContaining([
235-expect.objectContaining({
236-event: "control-ui.tab.visible",
237-payload: expect.objectContaining({
238-previousTab: "chat",
239-tab: "sessions",
240-durationMs: expect.any(Number),
241-}),
242-}),
243-]),
244-);
261+expectBufferedPerformanceEvent(host, "control-ui.tab.visible", {
262+previousTab: "chat",
263+tab: "sessions",
264+});
245265});
246266247267sessions.resolve();
@@ -321,18 +341,10 @@ describe("refreshActiveTab", () => {
321341usage.resolve();
322342323343await vi.waitFor(() => {
324-expect(host.eventLogBuffer).toEqual(
325-expect.arrayContaining([
326-expect.objectContaining({
327-event: "control-ui.overview.secondary",
328-payload: expect.objectContaining({
329-phase: "end",
330-status: "error",
331-durationMs: expect.any(Number),
332-}),
333-}),
334-]),
335-);
344+expectBufferedPerformanceEvent(host, "control-ui.overview.secondary", {
345+phase: "end",
346+status: "error",
347+});
336348});
337349});
338350@@ -359,18 +371,10 @@ describe("refreshActiveTab", () => {
359371await expect(refreshActiveTab(host as never)).resolves.toBeUndefined();
360372await Promise.resolve();
361373362-expect(host.eventLogBuffer).toEqual(
363-expect.arrayContaining([
364-expect.objectContaining({
365-event: "control-ui.cron.runs",
366-payload: expect.objectContaining({
367-phase: "end",
368-status: "error",
369-durationMs: expect.any(Number),
370-}),
371-}),
372-]),
373-);
374+expectBufferedPerformanceEvent(host, "control-ui.cron.runs", {
375+phase: "end",
376+status: "error",
377+});
374378});
375379376380it("contains rejected cron runs refreshes without failing the primary cron tab refresh", async () => {
@@ -381,18 +385,10 @@ describe("refreshActiveTab", () => {
381385await expect(refreshActiveTab(host as never)).resolves.toBeUndefined();
382386await Promise.resolve();
383387384-expect(host.eventLogBuffer).toEqual(
385-expect.arrayContaining([
386-expect.objectContaining({
387-event: "control-ui.cron.runs",
388-payload: expect.objectContaining({
389-phase: "end",
390-status: "error",
391-durationMs: expect.any(Number),
392-}),
393-}),
394-]),
395-);
388+expectBufferedPerformanceEvent(host, "control-ui.cron.runs", {
389+phase: "end",
390+status: "error",
391+});
396392});
397393398394it("does not record stale cron run timing after leaving the cron tab", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。