From 16bf5520379acea1bc4be8b92a0b5b001b17ac24 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Mon, 4 May 2026 20:07:08 -0400 Subject: [PATCH] test: lock typed timeout no-fallback transport behavior --- sdk/src/gsd-transport.test.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/sdk/src/gsd-transport.test.ts b/sdk/src/gsd-transport.test.ts index d2eefcfb2..af5a71669 100644 --- a/sdk/src/gsd-transport.test.ts +++ b/sdk/src/gsd-transport.test.ts @@ -1,4 +1,5 @@ import { describe, it, expect, vi } from 'vitest'; +import { GSDToolsError } from './gsd-tools-error.js'; import { QueryRegistry } from './query/registry.js'; import { GSDTransport } from './gsd-transport.js'; @@ -119,6 +120,36 @@ describe('GSDTransport', () => { expect(adapters.execSubprocessJson).not.toHaveBeenCalled(); }); + it('does not fallback after typed timeout native error', async () => { + const registry = new QueryRegistry(); + registry.register('state.load', async () => ({ data: { ok: true } })); + + const timeoutError = GSDToolsError.timeout('native timed out', 'state', ['load'], '', 500); + const adapters = { + dispatchNative: vi.fn(async () => { + throw timeoutError; + }), + execSubprocessJson: vi.fn(async () => ({ ok: 'fallback' })), + execSubprocessRaw: vi.fn(async () => 'fallback-raw'), + }; + + const transport = new GSDTransport(registry, adapters); + + await expect(transport.run({ + legacyCommand: 'state', + legacyArgs: ['load'], + registryCommand: 'state.load', + registryArgs: [], + mode: 'json', + projectDir: '/tmp', + }, { + preferNative: true, + allowFallbackToSubprocess: true, + })).rejects.toBe(timeoutError); + + expect(adapters.execSubprocessJson).not.toHaveBeenCalled(); + }); + it('formats native raw output via formatNativeRaw when provided', async () => { const registry = new QueryRegistry(); registry.register('commit', async () => ({ data: { hash: 'abc123' } }));