Files
Agent-System/web/src/api/chatRetry.test.ts
T

46 lines
1.8 KiB
TypeScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
shouldAutoRetry,
shouldAutoRetryChat,
shouldAutoRetryTask,
autoRetryDelayMs,
fallbackErrorClass,
} from './chatRetry';
test('shouldAutoRetryChat: disabled until idempotency', () => {
assert.equal(shouldAutoRetryChat({ class: 'transient' }, 0), false);
assert.equal(shouldAutoRetryChat({ class: 'transient' }, 1), false);
});
test('shouldAutoRetryTask: transient only, max 2', () => {
assert.equal(shouldAutoRetryTask({ class: 'transient', code: 'NETWORK_ERROR' }, 0), true);
assert.equal(shouldAutoRetryTask({ class: 'transient', code: 'NETWORK_ERROR' }, 1), true);
assert.equal(shouldAutoRetryTask({ class: 'transient', code: 'NETWORK_ERROR' }, 2), false);
assert.equal(shouldAutoRetryTask({ class: 'fatal', code: 'INTERNAL_ERROR' }, 0), false);
assert.equal(shouldAutoRetryTask({ class: 'resumable', code: 'WORKSPACE' }, 0), false);
assert.equal(
shouldAutoRetryTask({ class: 'transient', code: 'DOC_TASK_NOT_IN_ACTIVE_STAGE' }, 0),
false,
);
});
test('shouldAutoRetryTask: document busy never retries', () => {
assert.equal(shouldAutoRetryTask({ class: 'transient', code: 'DOC_BUSY' }, 0), false);
});
test('shouldAutoRetry alias delegates to task path', () => {
assert.equal(shouldAutoRetry({ class: 'transient', code: 'NETWORK_ERROR' }, 0), true);
});
test('autoRetryDelayMs: 1s then 2s', () => {
assert.equal(autoRetryDelayMs(0), 1000);
assert.equal(autoRetryDelayMs(1), 2000);
});
test('fallbackErrorClass: network → transient, workspace → resumable', () => {
assert.equal(fallbackErrorClass({ network: true }), 'transient');
assert.equal(fallbackErrorClass({ workspaceId: 'research_1' }), 'resumable');
assert.equal(fallbackErrorClass({}), 'fatal');
});