[verified] refactor: unify dashboard rate windows

This commit is contained in:
2026-05-09 16:54:32 +09:00
parent c763926b32
commit 1fb40fd5fe
6 changed files with 445 additions and 64 deletions

View File

@@ -0,0 +1,20 @@
import { describe, expect, test } from 'bun:test';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
const appSource = readFileSync(join(import.meta.dir, '../src/App.tsx'), 'utf8');
describe('dashboard unified capacity windows', () => {
test('shows primary and secondary windows inside unified capacity and removes usage metrics card', () => {
expect(appSource).toContain('<CardTitle>Unified capacity</CardTitle>');
expect(appSource).toContain('Primary window');
expect(appSource).toContain('Secondary window');
expect(appSource).toContain('const windowCards = [');
expect(appSource).toContain("} => item.window !== null,");
expect(appSource).toContain('item.window.limitWindowSeconds !== null ? (');
expect(appSource).not.toContain('<CardTitle>Usage metrics</CardTitle>');
expect(appSource).not.toContain('flattenNumericMetrics(summaryQuery.data?.aggregatedUsage).slice(0, 6)');
expect(appSource).not.toContain('const firstMetric = metricCards[0]?.value ?? 0;');
expect(appSource).not.toContain('const secondMetric = metricCards[1]?.value ?? 0;');
});
});

View File

@@ -7,8 +7,10 @@ const appSource = readFileSync(join(import.meta.dir, '../src/App.tsx'), 'utf8');
describe('dashboard card copy', () => {
test('removes verbose dashboard card descriptions and keeps concise labels', () => {
expect(appSource).toContain('<CardTitle>Unified capacity</CardTitle>');
expect(appSource).toContain('<CardTitle>Usage metrics</CardTitle>');
expect(appSource).toContain('<CardTitle>Connected OpenAI accounts</CardTitle>');
expect(appSource).toContain('Primary window');
expect(appSource).toContain('Secondary window');
expect(appSource).not.toContain('<CardTitle>Usage metrics</CardTitle>');
expect(appSource).toContain(">Merged by default. Inspect each account below.<");
expect(appSource).not.toContain(
'Fast glance card for the first two numeric metrics extracted from the merged usage payload.',

View File

@@ -5,11 +5,10 @@ import { join } from 'node:path';
const appSource = readFileSync(join(import.meta.dir, '../src/App.tsx'), 'utf8');
describe('mobile overflow guards', () => {
test('usage metrics cards allow long metric labels to wrap on mobile', () => {
expect(appSource).toContain('className="mt-6 min-w-0"');
expect(appSource).toContain('className="grid gap-3 sm:grid-cols-2"');
expect(appSource).toContain('className="min-w-0 rounded-2xl border border-white/10 bg-white/4 p-4"');
expect(appSource).toContain('className="text-sm text-slate-400 break-words"');
test('unified capacity window cards stay in a responsive two-column grid', () => {
expect(appSource).toContain('className="grid gap-4 md:grid-cols-2"');
expect(appSource).toContain('className="rounded-2xl border border-white/10 bg-white/4 p-4"');
expect(appSource).toContain('className="text-sm text-slate-400">{item.title}</div>');
});
test('connected account tabs no longer render a side-by-side payload column', () => {

View File

@@ -0,0 +1,175 @@
import { describe, expect, test } from 'bun:test';
import {
extractUsageWindows,
formatDurationSeconds,
summarizeUsageWindows,
} from '../src/lib/utils';
describe('usage window helpers', () => {
test('extracts primary and secondary windows from codex rate_limit payloads', () => {
const windows = extractUsageWindows({
rate_limit: {
primary_window: {
used_percent: 14,
limit_window_seconds: 18_000,
reset_at: '2026-05-09T12:00:00.000Z',
},
secondary_window: {
used_percent: 19,
limit_window_seconds: 604_800,
reset_at: '2026-05-16T12:00:00.000Z',
},
},
});
expect(windows).toEqual({
primary: {
usedPercent: 14,
limitWindowSeconds: 18_000,
resetAt: '2026-05-09T12:00:00.000Z',
},
secondary: {
usedPercent: 19,
limitWindowSeconds: 604_800,
resetAt: '2026-05-16T12:00:00.000Z',
},
});
});
test('formats canonical codex limit windows into readable labels', () => {
expect(formatDurationSeconds(18_000)).toBe('5h window');
expect(formatDurationSeconds(604_800)).toBe('7d window');
expect(formatDurationSeconds(null)).toBe('Unknown window');
});
test('summarizes windows across multiple account payloads without summing percentages', () => {
const windows = summarizeUsageWindows([
{
rate_limit: {
primary_window: {
used_percent: 20,
limit_window_seconds: 18_000,
reset_at: '2026-05-09T12:00:00.000Z',
},
secondary_window: {
used_percent: 40,
limit_window_seconds: 604_800,
reset_at: '2026-05-16T12:00:00.000Z',
},
},
},
{
rate_limit: {
primary_window: {
used_percent: 60,
limit_window_seconds: 18_000,
reset_at: '2026-05-09T10:00:00.000Z',
},
secondary_window: {
used_percent: 80,
limit_window_seconds: 604_800,
reset_at: '2026-05-15T10:00:00.000Z',
},
},
},
]);
expect(windows).toEqual({
primary: {
accountCount: 2,
usedPercent: 40,
limitWindowSeconds: 18_000,
resetAt: '2026-05-09T10:00:00.000Z',
},
secondary: {
accountCount: 2,
usedPercent: 60,
limitWindowSeconds: 604_800,
resetAt: '2026-05-15T10:00:00.000Z',
},
});
});
test('keeps window summaries null-safe for partial or inconsistent account data', () => {
const windows = summarizeUsageWindows([
{
rate_limit: {
primary_window: {
limit_window_seconds: 18_000,
reset_at: '2026-05-09T12:00:00.000Z',
},
},
},
{
rate_limit: {
primary_window: {
used_percent: 50,
reset_at: '2026-05-09T11:00:00.000Z',
},
secondary_window: {
used_percent: 22,
limit_window_seconds: 604_800,
reset_at: '2026-05-16T12:00:00.000Z',
},
},
},
{
rate_limit: {
secondary_window: {
used_percent: 44,
limit_window_seconds: 86_400,
reset_at: '2026-05-15T12:00:00.000Z',
},
},
},
]);
expect(windows).toEqual({
primary: {
accountCount: 2,
usedPercent: 50,
limitWindowSeconds: null,
resetAt: '2026-05-09T11:00:00.000Z',
},
secondary: {
accountCount: 2,
usedPercent: 33,
limitWindowSeconds: null,
resetAt: '2026-05-15T12:00:00.000Z',
},
});
});
test('ignores empty window shells with no meaningful values', () => {
expect(
extractUsageWindows({
rate_limit: {
primary_window: {},
secondary_window: null,
},
}),
).toEqual({ primary: null, secondary: null });
});
test('falls back to later candidate paths when earlier window shells are empty', () => {
expect(
extractUsageWindows({
rate_limit: {
primary_window: {},
},
primary_window: {
used_percent: 42,
limit_window_seconds: 18_000,
reset_at: '2026-05-09T12:00:00.000Z',
},
}),
).toEqual({
primary: {
usedPercent: 42,
limitWindowSeconds: 18_000,
resetAt: '2026-05-09T12:00:00.000Z',
},
secondary: null,
});
});
});