






















@@ -57,6 +57,10 @@ function makeSessionWithQuarterHourly(
5757} as unknown as UsageSessionEntry;
5858}
595960+function peakErrorSummaries(result: ReturnType<typeof buildPeakErrorHours>) {
61+return result.map(({ value, sub }) => ({ value, sub }));
62+}
63+6064describe("buildPeakErrorHours", () => {
6165afterEach(() => {
6266vi.restoreAllMocks();
@@ -77,7 +81,7 @@ describe("buildPeakErrorHours", () => {
7781const result = buildPeakErrorHours([session], "utc");
78827983// hour 0: 5/10 = 50%, hour 23: 4/8 = 50%, hour 9: 3/15 = 20%, hour 1: 2/20 = 10%
80-expect(result.map(({ value, sub }) => ({ value, sub }))).toStrictEqual([
84+expect(peakErrorSummaries(result)).toStrictEqual([
8185{ value: "50.00%", sub: "5 errors · 10 msgs" },
8286{ value: "50.00%", sub: "4 errors · 8 msgs" },
8387{ value: "20.00%", sub: "3 errors · 15 msgs" },
@@ -93,10 +97,10 @@ describe("buildPeakErrorHours", () => {
9397]);
94989599const result = buildPeakErrorHours([session], "utc");
96-expect(result.length).toBe(1);
97100// Aggregated: 5 errors / 15 total = 33.33%
98-expect(result[0].value).toBe("33.33%");
99-expect(result[0].sub).toBe("5 errors · 15 msgs");
101+expect(peakErrorSummaries(result)).toStrictEqual([
102+{ value: "33.33%", sub: "5 errors · 15 msgs" },
103+]);
100104});
101105102106it("shifts UTC quarter-hour buckets to local timezone in local mode", () => {
@@ -113,9 +117,8 @@ describe("buildPeakErrorHours", () => {
113117]);
114118115119const result = buildPeakErrorHours([session], "local");
116-expect(result.length).toBe(2);
117120118-expect(result.map(({ value, sub }) => ({ value, sub }))).toStrictEqual([
121+expect(peakErrorSummaries(result)).toStrictEqual([
119122{ value: "30.00%", sub: "3 errors · 10 msgs" }, // local hour 5
120123{ value: "20.00%", sub: "4 errors · 20 msgs" }, // local hour 15
121124]);
@@ -133,9 +136,9 @@ describe("buildPeakErrorHours", () => {
133136]);
134137135138const result = buildPeakErrorHours([session], "local");
136-expect(result.length).toBe(1);
137-expect(result[0].value).toBe("50.00%");
138-expect(result[0].sub).toBe("5 errors · 10 msgs");
139+expect(peakErrorSummaries(result)).toStrictEqual([
140+ { value: "50.00%", sub: "5 errors · 10 msgs" },
141+]);
139142});
140143141144it("wraps correctly for positive local timezone near midnight (UTC+8, late quarter)", () => {
@@ -150,9 +153,9 @@ describe("buildPeakErrorHours", () => {
150153]);
151154152155const result = buildPeakErrorHours([session], "local");
153-expect(result.length).toBe(1);
154-expect(result[0].value).toBe("50.00%");
155-expect(result[0].sub).toBe("6 errors · 12 msgs");
156+expect(peakErrorSummaries(result)).toStrictEqual([
157+ { value: "50.00%", sub: "6 errors · 12 msgs" },
158+]);
156159});
157160158161it("returns empty array when no sessions have errors", () => {
@@ -198,15 +201,14 @@ describe("buildPeakErrorHours", () => {
198201const session = makeSessionWithQuarterHourly(buckets);
199202200203const result = buildPeakErrorHours([session], "utc");
201-expect(result.length).toBe(5);
202204203205// Should be sorted by rate descending — highest rate first
204-expect(result.map((r) => r.value)).toStrictEqual([
205-"16.00%",
206-"14.00%",
207-"12.00%",
208-"10.00%",
209-"8.00%",
206+expect(peakErrorSummaries(result)).toStrictEqual([
207+{ value: "16.00%", sub: "16 errors · 100 msgs" },
208+{ value: "14.00%", sub: "14 errors · 100 msgs" },
209+{ value: "12.00%", sub: "12 errors · 100 msgs" },
210+{ value: "10.00%", sub: "10 errors · 100 msgs" },
211+{ value: "8.00%", sub: "8 errors · 100 msgs" },
210212]);
211213});
212214@@ -219,10 +221,10 @@ describe("buildPeakErrorHours", () => {
219221]);
220222221223const result = buildPeakErrorHours([session1, session2], "utc");
222-expect(result.length).toBe(1);
223224// quarterIndex 20 → hour 5: aggregated 10 errors / 30 msgs = 33.33%
224-expect(result[0].value).toBe("33.33%");
225-expect(result[0].sub).toBe("10 errors · 30 msgs");
225+expect(peakErrorSummaries(result)).toStrictEqual([
226+{ value: "33.33%", sub: "10 errors · 30 msgs" },
227+]);
226228});
227229228230it("falls back to proportional allocation when utcQuarterHourMessageCounts is absent", () => {
@@ -257,7 +259,7 @@ describe("buildPeakErrorHours", () => {
257259} as unknown as UsageSessionEntry;
258260259261const result = buildPeakErrorHours([session], "utc");
260-expect(result.map(({ value, sub }) => ({ value, sub }))).toStrictEqual([
262+expect(peakErrorSummaries(result)).toStrictEqual([
261263{ value: "30.00%", sub: "3 errors · 10 msgs" },
262264]);
263265});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。