Files
EasyCLIProxyAPI/tests/authFileQuotaDense.test.tsx
T
lzt404 3b11361f1b feat: refine management UI and enhance credential and plugin OAuth support
- Adopt a compact seven-column credential layout with visible quotas, request stats, and actions
- Display cooldown scope, countdowns, and model details with accessible reset controls
- Fix cooldown misassignment when merging same-named credentials from different accounts
- Add client visibility management with search, auto-detection, and persisted preferences
- Integrate plugin OAuth providers with deduplication and change synchronization
- Refine dashboard typography and spacing, and streamline usage history controls
- Add translations, unit tests, and responsive interaction coverage
2026-10-04 17:31:52 +08:00

60 lines
3.2 KiB
TypeScript

import { expect, it } from 'bun:test';
import { renderToStaticMarkup } from 'react-dom/server';
import { AuthFileQuotaPanel } from '../src/components/AuthFileQuotaPanel';
import { I18nProvider } from '../src/i18n';
import type { AuthFile, QuotaState } from '../src/services/quotaService';
const renderDense = (quota: QuotaState, file: AuthFile = { name: 'test.json', provider: 'codex' }, busy = false) =>
renderToStaticMarkup(<I18nProvider><AuthFileQuotaPanel file={file} quota={quota}
compact dense disabled={busy || file.disabled === true} onRefresh={() => {}} onReset={() => {}} /></I18nProvider>);
it('keeps window percentages, reset times and additional windows available in dense mode', () => {
const html = renderDense({ status: 'success', rows: [
{ label: '5h', remainingPercent: 140, reset: '10:30', detail: 'Window detail' },
{ label: 'weekly', remainingPercent: null, reset: 'Friday' },
{ label: 'extra', remainingPercent: 0, reset: 'Monday' },
] });
expect(html).toContain('credential-quota-dense');
expect(html).toContain('aria-valuenow="100"');
expect(html).not.toContain('140%');
expect(html).toContain('credential-quota-row unknown');
expect(html).toContain('title="10:30">10:30</small>');
expect(html).toContain('Window detail');
expect(html).toContain('<details class="credential-quota-more">');
expect(html).toContain('extra');
});
it('shows reset credits in the button while preserving applicability and expiry', () => {
const html = renderDense({ status: 'success', rows: [{ label: '5h', remainingPercent: 0 }],
resetCredits: 2, resetCreditsApplicable: 0, subscriptionActiveUntil: '2030-01-01T00:00:00Z',
});
const resetButton = html.match(/<button[^>]*credential-quota-reset[^>]*>[\s\S]*?<\/button>/)?.[0];
expect(resetButton).toContain('2');
expect(resetButton).not.toContain('disabled=""');
expect(html).toContain('Currently applicable: 0');
expect(html).toContain('Subscription expires');
});
it('does not confuse a busy list with a disabled credential or discard cached quota', () => {
const idle = renderDense({ status: 'idle', rows: [] }, undefined, true);
expect(idle).toContain('Quota has not been fetched');
expect(idle).not.toContain('Disabled');
const disabled = renderDense({ status: 'idle', rows: [] }, { name: 'test.json', disabled: true });
expect(disabled).toContain('Disabled');
const cached = renderDense({ status: 'success', rows: [{ label: '5h', remainingPercent: 75 }] },
{ name: 'test.json', disabled: true }, true);
expect(cached).toContain('aria-valuenow="75"');
});
it('keeps raw failures accessible without manufacturing progress in dense error and loading states', () => {
const failed = renderDense({ status: 'error', rows: [], error: 'upstream diagnostic details' });
expect(failed).toContain('<details class="credential-quota-error-details">');
expect(failed).toContain('title="upstream diagnostic details"');
expect(failed).toContain('<small>upstream diagnostic details</small>');
expect(failed).not.toContain('role="progressbar"');
const pending = renderDense({ status: 'loading', rows: [], pendingAction: 'reset' });
expect(pending).toContain('aria-busy="true"');
expect(pending).toContain('indeterminate');
expect(pending).not.toContain('aria-valuenow');
});