From 1ca7f588312305f00842f4e2e01032d1d15f4064 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 4 May 2026 19:58:45 -0400 Subject: [PATCH] test: cover tools error mapping and unify timeout fallback check --- sdk/src/gsd-transport.ts | 4 ++-- sdk/src/query-tools-error-mapper.test.ts | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 sdk/src/query-tools-error-mapper.test.ts diff --git a/sdk/src/gsd-transport.ts b/sdk/src/gsd-transport.ts index 67164310d..69be7b680 100644 --- a/sdk/src/gsd-transport.ts +++ b/sdk/src/gsd-transport.ts @@ -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; } } diff --git a/sdk/src/query-tools-error-mapper.test.ts b/sdk/src/query-tools-error-mapper.test.ts new file mode 100644 index 000000000..c4c0dd0e6 --- /dev/null +++ b/sdk/src/query-tools-error-mapper.test.ts @@ -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(); + }); +});