import { describe, expect, it } from 'vitest'; import { getOpencodeErrorKind, isOpencodeTokenBalanceExhausted, } from '../../shared/opencode-error-kind'; describe('getOpencodeErrorKind', () => { it('classifies a generic Works Square gateway authorization failure as invalid authentication', () => { expect(getOpencodeErrorKind('works_square_gateway_authorize_failed')).toBe('authentication_invalid'); }); it.each([ 'token_balance_exhausted', 'Token balance exhausted', 'Token quota exhausted for rolling 5-hour window', 'works_square_gateway_authorize_failed: Token balance exhausted', ])('classifies explicit quota evidence as exhausted: %s', (message) => { expect(getOpencodeErrorKind(message)).toBe('quota_exhausted'); }); it.each([ 'token_balance_exhausted', 'Token balance exhausted (request id: req-1)', 'works_square_gateway_authorize_failed: balance exhausted', ])('identifies authoritative token-balance exhaustion: %s', (message) => { expect(isOpencodeTokenBalanceExhausted(message)).toBe(true); }); it.each([ 'Token quota exhausted for rolling 5-hour window', 'user quota is not enough', 'works_square_gateway_authorize_failed', ])('does not mistake other failures for token-balance exhaustion: %s', (message) => { expect(isOpencodeTokenBalanceExhausted(message)).toBe(false); }); });