33 lines
1.6 KiB
TypeScript
33 lines
1.6 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|||
|
|
import { getRecentSessionErrors, recordSessionError, summarizeOpenCodeError } from './session-error-log';
|
||
|
|
|
||
|
|
describe('summarizeOpenCodeError', () => {
|
||
|
|
test('reads the OpenCode shape: name plus data.message', () => {
|
||
|
|
expect(summarizeOpenCodeError({ name: 'ProviderAuthError', data: { providerID: 'openai', message: 'Invalid API key' } }))
|
||
|
|
.toEqual({ name: 'ProviderAuthError', message: 'Invalid API key' });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('falls back to a top-level message and reports missing details as null', () => {
|
||
|
|
expect(summarizeOpenCodeError({ message: 'socket hang up' })).toEqual({ name: null, message: 'socket hang up' });
|
||
|
|
expect(summarizeOpenCodeError({ name: 'UnknownError', data: { message: ' ' } })).toEqual({ name: 'UnknownError', message: null });
|
||
|
|
expect(summarizeOpenCodeError(undefined)).toEqual({ name: null, message: null });
|
||
|
|
});
|
||
|
|
|
||
|
|
test('bounds the message length', () => {
|
||
|
|
const summary = summarizeOpenCodeError({ name: 'UnknownError', data: { message: 'x'.repeat(1000) } });
|
||
|
|
expect(summary.message?.length).toBe(400);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('recordSessionError', () => {
|
||
|
|
test('keeps the newest records first and caps the buffer', () => {
|
||
|
|
for (let index = 0; index < 25; index += 1) {
|
||
|
|
recordSessionError({ sessionId: `ses_${index}`, directory: null, name: 'UnknownError', message: `error ${index}` });
|
||
|
|
}
|
||
|
|
const records = getRecentSessionErrors();
|
||
|
|
expect(records.length).toBe(20);
|
||
|
|
expect(records[0]?.sessionId).toBe('ses_24');
|
||
|
|
expect(records[19]?.sessionId).toBe('ses_5');
|
||
|
|
});
|
||
|
|
});
|