Files

48 lines
1.8 KiB
JavaScript

import { describe, expect, it } from 'bun:test';
import { fetchExeDevUsage, parseExeDevUsage } from './exe-dev.js';
const payload = {
allowance_spend_usd: 0.11,
extra_spend_usd: 0,
group: 'day',
month: '2026-09',
monthly_allowance_usd: 20,
period_end: '2026-10-01T00:00:00Z',
period_start: '2026-09-01T00:00:00Z',
total_cost_usd: 0.11,
total_requests: 17,
};
describe('exe.dev quota provider', () => {
it('parses monthly credit usage', () => {
const windows = parseExeDevUsage(payload);
expect(windows?.monthly.usedPercent).toBeCloseTo(0.55);
expect(windows?.monthly.valueLabel).toBe('$0.11 / $20.00');
expect(windows?.monthly.resetAt).toBe(Date.parse('2026-10-01T00:00:00Z'));
});
it('sends the scoped billing command without exposing the token elsewhere', async () => {
const requests = [];
const windows = await fetchExeDevUsage({ usageToken: 'test-token' }, async (url, init) => {
requests.push({ url, init });
return Response.json(payload);
});
expect(windows.monthly.valueLabel).toBe('$0.11 / $20.00');
expect(requests).toHaveLength(1);
expect(requests[0].url).toBe('https://exe.dev/exec');
expect(requests[0].init.method).toBe('POST');
expect(requests[0].init.body).toBe('billing credits usage --group=day --json');
expect(requests[0].init.headers.Authorization).toBe('Bearer test-token');
});
it('rejects malformed successful responses', async () => {
await expect(fetchExeDevUsage({ usageToken: 'test-token' }, async () => Response.json({})))
.rejects.toThrow('could not be parsed');
});
it('reports authentication failure without including the token', async () => {
await expect(fetchExeDevUsage({ usageToken: 'test-token' }, async () => new Response('', { status: 401 })))
.rejects.toThrow('exe.dev authentication failed');
});
});