import { EnvironmentId, ProviderInstanceId, USAGE_CONTRACT_VERSION } from "@t3tools/contracts";
import { mergeUsage } from "@t3tools/shared/usageMerge";
import { act } from "react";
import { create, type ReactTestRenderer } from "react-test-renderer";
import { afterEach, beforeEach, expect, it, vi } from "vite-plus/test";
const state = vi.hoisted(() => ({
presentations: new Map(),
refreshProviders: vi.fn(async () => undefined),
}));
vi.mock("@effect/atom-react", () => ({ useAtomValue: () => state.presentations }));
vi.mock("../../state/presentation", () => ({
environmentPresentations: { presentationsAtom: null },
}));
vi.mock("../../state/server", () => ({ serverEnvironment: { refreshProviders: null } }));
vi.mock("../../state/use-atom-command", () => ({ useAtomCommand: () => state.refreshProviders }));
vi.mock("../../env", () => ({ isElectron: false }));
vi.mock("../../hooks/useSettings", () => ({ usePrimarySettings: () => "24h" }));
vi.mock("../../state/usage", () => ({
useUsage: () => ({
merged: mergeUsage([], USAGE_CONTRACT_VERSION),
environments: [
{
environmentId: EnvironmentId.make("test"),
label: "Test",
isPending: false,
error: null,
summary: null,
},
],
selectedEnvironments: [
{
environmentId: EnvironmentId.make("test"),
label: "Test",
isPending: false,
error: null,
summary: null,
},
],
isPending: false,
isPartial: false,
refresh: async () => undefined,
}),
}));
vi.mock("./usagePagePreferences", () => ({
readUsagePagePreferences: () => ({ metric: "limits", windowDays: 30 }),
saveUsagePagePreferences: vi.fn(),
}));
vi.mock("../ui/button", () => ({ Button: "button" }));
vi.mock("../ui/scroll-area", () => ({ ScrollArea: "div" }));
vi.mock("../ui/select", () => ({
Select: "select",
SelectItem: "option",
SelectPopup: "div",
SelectTrigger: "div",
SelectValue: "span",
}));
vi.mock("../ui/sidebar", () => ({ SidebarInset: "div" }));
vi.mock("../ui/toggle-group", () => ({ Toggle: "button", ToggleGroup: "div" }));
vi.mock("../ui/tooltip", () => ({ Tooltip: "div", TooltipPopup: "div", TooltipTrigger: "div" }));
vi.mock("../ui/popover", () => ({ Popover: "div", PopoverPopup: "div", PopoverTrigger: "div" }));
vi.mock("../ui/menu", () => ({
Menu: "div",
MenuCheckboxItem: "div",
MenuItem: "div",
MenuPopup: "div",
MenuSeparator: "hr",
MenuTrigger: "div",
}));
vi.mock("../WorkspaceBreadcrumb", () => ({
WorkspaceBreadcrumb: "div",
WorkspaceBreadcrumbItem: "div",
WorkspaceBreadcrumbSeparator: "span",
}));
vi.mock("../WorkspacePageContainer", () => ({ WorkspacePageContainer: "main" }));
vi.mock("../WorkspacePageHeader", () => ({ WorkspacePageHeader: "header" }));
vi.mock("./UsageProviderChart", () => ({ UsageProviderChart: "div" }));
vi.mock("./UsagePriceOverrides", () => ({ UsagePriceOverrides: () => null }));
vi.mock("../chat/ProviderInstanceIcon", () => ({ ProviderInstanceIcon: () => null }));
vi.mock("../settings/RedactedSensitiveText", () => ({ RedactedSensitiveText: "span" }));
vi.mock("../settings/providerDriverMeta", () => ({ getDriverOption: () => ({ label: "Codex" }) }));
import { UsagePage } from "./UsagePage";
let renderer: ReactTestRenderer;
beforeEach(() => {
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-09-11T12:00:00Z"));
state.refreshProviders.mockClear();
state.presentations = new Map([
[
EnvironmentId.make("test"),
{
entry: { target: { label: "Test" } },
connection: { phase: "connected" },
serverConfig: {
providers: [
{
instanceId: ProviderInstanceId.make("codex"),
driver: "codex",
enabled: true,
installed: true,
version: null,
status: "ready",
auth: { status: "authenticated" },
checkedAt: "2026-09-11T12:00:00Z",
models: [],
slashCommands: [],
skills: [],
usageLimits: {
checkedAt: "2026-09-11T12:00:00Z",
windows: [
{
id: "five_hour",
kind: "session",
label: "Session",
usedPercent: 40,
windowDurationMins: 300,
resetsAt: "2026-09-11T14:00:00Z",
},
],
},
},
],
},
},
],
]);
});
afterEach(async () => {
await act(() => renderer?.unmount());
vi.restoreAllMocks();
vi.unstubAllGlobals();
});
it.each([0, 1])(
"refreshes the visible limits countdown with refresh button %i without switching tabs, even when quota is unchanged",
async (buttonIndex) => {
await act(() => {
renderer = create();
});
expect(
JSON.stringify(renderer.toJSON(), (key, value) => (key === "props" ? undefined : value)),
).toContain("in 2h 0m");
vi.mocked(Date.now).mockReturnValue(Date.parse("2026-09-11T12:30:00Z"));
await act(async () => {
renderer.root
.findAllByProps({ "aria-label": "Refresh limits" })
.filter((node) => node.type === "button")
.at(buttonIndex)!
.props.onClick();
});
expect(state.refreshProviders).toHaveBeenCalledWith({ environmentId: "test", input: {} });
expect(
JSON.stringify(renderer.toJSON(), (key, value) => (key === "props" ? undefined : value)),
).toContain("in 1h 30m");
expect(
JSON.stringify(renderer.toJSON(), (key, value) => (key === "props" ? undefined : value)),
).not.toContain("in 2h 0m");
},
);
it("uses the current time when returning to limits from tokens", async () => {
await act(() => {
renderer = create();
});
const selectMetric = (metric: string) => {
renderer.root
.findAll((node) => node.type === "div" && node.props["aria-label"] === "Usage metric")[0]!
.props.onValueChange([metric]);
};
await act(() => selectMetric("tokens"));
vi.mocked(Date.now).mockReturnValue(Date.parse("2026-09-11T13:00:00Z"));
await act(() => selectMetric("limits"));
expect(
JSON.stringify(renderer.toJSON(), (key, value) => (key === "props" ? undefined : value)),
).toContain("in 1h 0m");
expect(state.refreshProviders).not.toHaveBeenCalled();
});