import { describe, expect, test } from "bun:test"; import { sortDetailBreakdown } from "./detail-sort"; describe("sortDetailBreakdown", () => { const rows = [ { name: "beta", calls: 2, total_tokens: 100, quota: 500 }, { name: "alpha", calls: 5, total_tokens: 100, quota: 300 }, { name: "gamma", calls: 1, total_tokens: 300, quota: 100 }, ]; test("sorts by the selected numeric field without mutating the source rows", () => { const sorted = sortDetailBreakdown(rows, "quota", false); expect(sorted.map((row) => row.name)).toEqual(["beta", "alpha", "gamma"]); expect(rows.map((row) => row.name)).toEqual(["beta", "alpha", "gamma"]); }); test("uses name as a stable tie-breaker", () => { const sorted = sortDetailBreakdown(rows, "total_tokens", false); expect(sorted.map((row) => row.name)).toEqual(["gamma", "alpha", "beta"]); }); test("preserves subtype fields while sorting breakdown rows", () => { const rows = [ { name: "beta", calls: 2, total_tokens: 100, quota: 500, models: [{ name: "m2", calls: 1, total_tokens: 20, quota: 10 }] }, { name: "alpha", calls: 5, total_tokens: 200, quota: 300, models: [{ name: "m1", calls: 1, total_tokens: 30, quota: 20 }] }, ]; const sorted = sortDetailBreakdown(rows, "total_tokens", false); expect(sorted[0].models[0].name).toBe("m1"); expect(rows[0].models[0].name).toBe("m2"); }); });