test: cover tools error mapping and unify timeout fallback check

This commit is contained in:
Tom Boucher
2026-05-04 19:58:45 -04:00
parent 7298a76b20
commit 1ca7f58831
2 changed files with 23 additions and 2 deletions

View File

@@ -1,7 +1,7 @@
import type { QueryResult } from './query/utils.js';
import type { QueryRegistry } from './query/registry.js';
import type { TransportMode } from './gsd-transport-policy.js';
import { isTimeoutLikeError } from './query-failure-classification.js';
import { toFailureSignal } from './query-failure-classification.js';
export interface TransportRequest {
legacyCommand: string;
@@ -49,7 +49,7 @@ export class GSDTransport {
// Do not subprocess-fallback after a timed-out native dispatch:
// the timeout does not cancel the native handler, so falling through
// would run the same command twice (double-execution race).
if (isTimeoutLikeError(error)) throw error;
if (toFailureSignal(error).kind === 'timeout') throw error;
}
}

View File

@@ -0,0 +1,21 @@
import { describe, expect, it } from 'vitest';
import { ErrorClassification, GSDError } from './errors.js';
import { toGSDToolsError } from './query-tools-error-mapper.js';
describe('query tools error mapper', () => {
it('maps GSDError to GSDToolsError exit code', () => {
const err = toGSDToolsError('state', ['load'], new GSDError('bad input', ErrorClassification.Validation));
expect(err.exitCode).toBe(10);
expect(err.message).toBe('bad input');
});
it('attaches timeout classification when message indicates timeout', () => {
const err = toGSDToolsError('state', ['load'], new Error('gsd-tools timed out after 1234ms: state load'));
expect(err.classification).toEqual({ kind: 'timeout', timeoutMs: 1234 });
});
it('does not attach timeout classification for non-timeout failures', () => {
const err = toGSDToolsError('state', ['load'], new Error('boom'));
expect(err.classification).toBeUndefined();
});
});