import { render, screen, waitFor } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { TokenUsageAdminService } from "../../data/TokenUsageAdminService";
import { TokenUsageAdminProvider, useTokenUsageAdmin } from "../TokenUsageAdminContext";
vi.mock("../../data/TokenUsageAdminService", () => ({
TokenUsageAdminService: {
getSummary: vi.fn(async () => []),
getTimeline: vi.fn(async () => []),
getBreakdown: vi.fn(async () => []),
},
}));
function Probe() {
const ctx = useTokenUsageAdmin();
return {String(ctx.singleCustomerMode)};
}
describe("TokenUsageAdminContext", () => {
// The mocked service is module-level, so its call counts survive across tests.
// Without this reset the per-test `toHaveBeenCalledTimes` assertions would
// measure the whole file rather than one render.
beforeEach(() => {
vi.clearAllMocks();
});
it("throws when used outside its provider", () => {
expect(() => render()).toThrow();
});
it("requests every panel on mount and reports not-single-customer by default", async () => {
render(
,
);
await waitFor(() => expect(TokenUsageAdminService.getSummary).toHaveBeenCalled());
// Four ranked panels: company, user, customer-by-operation, platform-by-operation.
// Asserted by dimension+scope rather than by count alone, so a wrong pairing
// fails here instead of silently rendering the wrong data.
const calls = (TokenUsageAdminService.getBreakdown as ReturnType).mock.calls.map(([args]) => [
args.dimension,
args.scope,
]);
expect(calls).toEqual(
expect.arrayContaining([
["company", "customer"],
["user", "customer"],
["operation", "customer"],
["operation", "platform"],
]),
);
expect(calls).toHaveLength(4);
expect(screen.getByTestId("mode")).toHaveTextContent("false");
});
it("skips only the PLATFORM operation breakdown once a company filter is applied", async () => {
render(
,
);
await waitFor(() => expect(TokenUsageAdminService.getSummary).toHaveBeenCalled());
const calls = (TokenUsageAdminService.getBreakdown as ReturnType).mock.calls.map(([args]) => [
args.dimension,
args.scope,
]);
// Platform spend has no owning company, so filtering it is meaningless and
// the call is skipped. The CUSTOMER operation panel is still meaningful and
// must survive — that distinction is the point of this test.
expect(calls).toContainEqual(["operation", "customer"]);
expect(calls).not.toContainEqual(["operation", "platform"]);
expect(calls).toHaveLength(3);
expect(screen.getByTestId("mode")).toHaveTextContent("true");
});
});