48 lines
1.8 KiB
JavaScript
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');
|
|
});
|
|
});
|