diff options
Diffstat (limited to 'packages/throughput-store/src/store.test.ts')
| -rw-r--r-- | packages/throughput-store/src/store.test.ts | 108 |
1 files changed, 54 insertions, 54 deletions
diff --git a/packages/throughput-store/src/store.test.ts b/packages/throughput-store/src/store.test.ts index e81201a..fa8f9e5 100644 --- a/packages/throughput-store/src/store.test.ts +++ b/packages/throughput-store/src/store.test.ts @@ -4,69 +4,69 @@ import { dayKeyOf } from "./period.js"; import { createThroughputStore, ThroughputQueryError } from "./store.js"; function memStorage(): StorageNamespace { - const map = new Map<string, string>(); - return { - get: async (k) => map.get(k) ?? null, - set: async (k, v) => { - map.set(k, v); - }, - delete: async (k) => { - map.delete(k); - }, - has: async (k) => map.has(k), - keys: async (prefix) => - [...map.keys()].filter((k) => (prefix === undefined ? true : k.startsWith(prefix))), - }; + const map = new Map<string, string>(); + return { + get: async (k) => map.get(k) ?? null, + set: async (k, v) => { + map.set(k, v); + }, + delete: async (k) => { + map.delete(k); + }, + has: async (k) => map.has(k), + keys: async (prefix) => + [...map.keys()].filter((k) => (prefix === undefined ? true : k.startsWith(prefix))), + }; } let id = 0; const store = () => createThroughputStore({ storage: memStorage(), newId: () => `id${id++}` }); describe("ThroughputStore", () => { - it("records a sample and aggregates it for that day", async () => { - const s = store(); - const ts = new Date(2026, 5, 10, 12, 0, 0).getTime(); - await s.record({ model: "claude/haiku", ts, outputTokens: 300, genMs: 1500 }); + it("records a sample and aggregates it for that day", async () => { + const s = store(); + const ts = new Date(2026, 5, 10, 12, 0, 0).getTime(); + await s.record({ model: "claude/haiku", ts, outputTokens: 300, genMs: 1500 }); - const report = await s.aggregate({ period: "day", date: dayKeyOf(ts) }); - expect(report.models).toHaveLength(1); - expect(report.models[0]).toMatchObject({ - model: "claude/haiku", - totalOutputTokens: 300, - totalGenMs: 1500, - turns: 1, - tokensPerSecond: 200, // 300 / 1.5s - }); - }); + const report = await s.aggregate({ period: "day", date: dayKeyOf(ts) }); + expect(report.models).toHaveLength(1); + expect(report.models[0]).toMatchObject({ + model: "claude/haiku", + totalOutputTokens: 300, + totalGenMs: 1500, + turns: 1, + tokensPerSecond: 200, // 300 / 1.5s + }); + }); - it("does not lose concurrent samples (single-set writes)", async () => { - const s = store(); - const ts = new Date(2026, 5, 10, 9, 0, 0).getTime(); - await Promise.all([ - s.record({ model: "m", ts, outputTokens: 100, genMs: 1000 }), - s.record({ model: "m", ts, outputTokens: 100, genMs: 1000 }), - s.record({ model: "m", ts, outputTokens: 100, genMs: 1000 }), - ]); - const report = await s.aggregate({ period: "day", date: dayKeyOf(ts) }); - expect(report.models[0]?.turns).toBe(3); - expect(report.models[0]?.totalOutputTokens).toBe(300); - }); + it("does not lose concurrent samples (single-set writes)", async () => { + const s = store(); + const ts = new Date(2026, 5, 10, 9, 0, 0).getTime(); + await Promise.all([ + s.record({ model: "m", ts, outputTokens: 100, genMs: 1000 }), + s.record({ model: "m", ts, outputTokens: 100, genMs: 1000 }), + s.record({ model: "m", ts, outputTokens: 100, genMs: 1000 }), + ]); + const report = await s.aggregate({ period: "day", date: dayKeyOf(ts) }); + expect(report.models[0]?.turns).toBe(3); + expect(report.models[0]?.totalOutputTokens).toBe(300); + }); - it("aggregates multiple days within a week", async () => { - const s = store(); - const mon = new Date(2026, 5, 8, 10, 0, 0).getTime(); // Mon 2026-06-08 - const wed = new Date(2026, 5, 10, 10, 0, 0).getTime(); - await s.record({ model: "m", ts: mon, outputTokens: 100, genMs: 1000 }); - await s.record({ model: "m", ts: wed, outputTokens: 200, genMs: 1000 }); + it("aggregates multiple days within a week", async () => { + const s = store(); + const mon = new Date(2026, 5, 8, 10, 0, 0).getTime(); // Mon 2026-06-08 + const wed = new Date(2026, 5, 10, 10, 0, 0).getTime(); + await s.record({ model: "m", ts: mon, outputTokens: 100, genMs: 1000 }); + await s.record({ model: "m", ts: wed, outputTokens: 200, genMs: 1000 }); - const report = await s.aggregate({ period: "week", date: dayKeyOf(wed) }); - expect(report.models[0]?.turns).toBe(2); - expect(report.models[0]?.totalOutputTokens).toBe(300); - }); + const report = await s.aggregate({ period: "week", date: dayKeyOf(wed) }); + expect(report.models[0]?.turns).toBe(2); + expect(report.models[0]?.totalOutputTokens).toBe(300); + }); - it("throws ThroughputQueryError on a malformed date", async () => { - await expect(store().aggregate({ period: "day", date: "garbage" })).rejects.toBeInstanceOf( - ThroughputQueryError, - ); - }); + it("throws ThroughputQueryError on a malformed date", async () => { + await expect(store().aggregate({ period: "day", date: "garbage" })).rejects.toBeInstanceOf( + ThroughputQueryError, + ); + }); }); |
