diff options
| author | Adam Malczewski <[email protected]> | 2026-06-27 01:12:40 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-27 01:12:40 +0900 |
| commit | 98b0638838a8e754927d8c030ce8bded18d63e7d (patch) | |
| tree | 0d4e21c3d4792fcd77e1040373b260e38efa34ce /packages/exec-backend/src/extension.test.ts | |
| parent | d92a4af6191d7d20acf861adf605ad0227b6b287 (diff) | |
| parent | 61e45e60d699ed1ca46f94a8f181c92a940317c6 (diff) | |
| download | dispatch-98b0638838a8e754927d8c030ce8bded18d63e7d.tar.gz dispatch-98b0638838a8e754927d8c030ce8bded18d63e7d.zip | |
Merge branch 'dev' into feature/heartbeat
# Conflicts:
# packages/host-bin/package.json
# packages/host-bin/src/main.ts
# packages/session-orchestrator/src/orchestrator.ts
# packages/system-prompt/src/service.test.ts
# packages/system-prompt/src/service.ts
# packages/system-prompt/src/types.ts
# packages/transport-contract/package.json
# packages/transport-http/package.json
# packages/transport-http/src/app.test.ts
# packages/transport-http/src/app.ts
# packages/transport-http/src/extension.ts
# packages/transport-http/tsconfig.json
# tsconfig.json
Diffstat (limited to 'packages/exec-backend/src/extension.test.ts')
| -rw-r--r-- | packages/exec-backend/src/extension.test.ts | 166 |
1 files changed, 83 insertions, 83 deletions
diff --git a/packages/exec-backend/src/extension.test.ts b/packages/exec-backend/src/extension.test.ts index 57161a5..f32901b 100644 --- a/packages/exec-backend/src/extension.test.ts +++ b/packages/exec-backend/src/extension.test.ts @@ -28,94 +28,94 @@ import { execBackendHandle, remoteExecBackendFactoryHandle } from "./service.js" * against behavior-equivalent input. */ function createFakeHost(services: Map<string, unknown>): HostAPI { - const api = { - provideService<T>(handle: ServiceHandle<T>, impl: T): void { - services.set(handle.id, impl); - }, - getService<T>(handle: ServiceHandle<T>): T { - const impl = services.get(handle.id); - if (impl === undefined) { - throw new Error( - `Service "${handle.id}" has no provider. Call provideService before getService.`, - ); - } - return impl as T; - }, - }; - // The resolver only calls getService; the rest of HostAPI is unused here. - return api as unknown as HostAPI; + const api = { + provideService<T>(handle: ServiceHandle<T>, impl: T): void { + services.set(handle.id, impl); + }, + getService<T>(handle: ServiceHandle<T>): T { + const impl = services.get(handle.id); + if (impl === undefined) { + throw new Error( + `Service "${handle.id}" has no provider. Call provideService before getService.`, + ); + } + return impl as T; + }, + }; + // The resolver only calls getService; the rest of HostAPI is unused here. + return api as unknown as HostAPI; } /** A fake remote backend — identifiable so we can assert it's the one returned. */ function createFakeRemoteBackend(marker: string): ExecBackend { - const fail = (): never => { - throw new Error(`fake remote backend (${marker}) should not be called in this test`); - }; - return { - spawn: fail, - readFile: fail, - writeFile: fail, - stat: fail, - readdir: fail, - exists: fail, - }; + const fail = (): never => { + throw new Error(`fake remote backend (${marker}) should not be called in this test`); + }; + return { + spawn: fail, + readFile: fail, + writeFile: fail, + stat: fail, + readdir: fail, + exists: fail, + }; } describe("ExecBackend resolver", () => { - it("returns localExecBackend for computerId === undefined (local path unchanged)", () => { - const services = new Map<string, unknown>(); - const host = createFakeHost(services); - - // Activate the extension so it registers its resolver, then retrieve it. - createExecBackendExtension().activate(host); - const resolver = host.getService(execBackendHandle); - - expect(resolver(undefined)).toBe(localExecBackend); - expect(resolver()).toBe(localExecBackend); - }); - - it("returns the factory's backend for a set computerId when the factory is provided", () => { - const services = new Map<string, unknown>(); - const host = createFakeHost(services); - - // The `ssh` extension (not built yet) would do this: - const remoteBackend = createFakeRemoteBackend("ssh-alias"); - const factory = (computerId: string): ExecBackend => { - // Confirm the alias is threaded through to the factory. - expect(computerId).toBe("ssh-alias"); - return remoteBackend; - }; - host.provideService(remoteExecBackendFactoryHandle, factory); - - createExecBackendExtension().activate(host); - const resolver = host.getService(execBackendHandle); - - expect(resolver("ssh-alias")).toBe(remoteBackend); - }); - - it("throws a clear 'not configured' error when the factory is NOT provided (ssh not loaded)", () => { - const services = new Map<string, unknown>(); - const host = createFakeHost(services); - - // No remoteExecBackendFactoryHandle provided → simulates ssh not loaded. - createExecBackendExtension().activate(host); - const resolver = host.getService(execBackendHandle); - - // Not a crash: a clear, actionable error mentioning computerId + ssh. - expect(() => resolver("some-host")).toThrow(/SSH remote execution is not configured/); - expect(() => resolver("some-host")).toThrow(/ssh extension is not loaded/); - expect(() => resolver("some-host")).toThrow(/some-host/); - }); - - it("local path is unaffected by whether the factory is provided", () => { - // Even with a factory present, computerId === undefined still returns local. - const services = new Map<string, unknown>(); - const host = createFakeHost(services); - host.provideService(remoteExecBackendFactoryHandle, () => createFakeRemoteBackend("unused")); - - createExecBackendExtension().activate(host); - const resolver = host.getService(execBackendHandle); - - expect(resolver(undefined)).toBe(localExecBackend); - }); + it("returns localExecBackend for computerId === undefined (local path unchanged)", () => { + const services = new Map<string, unknown>(); + const host = createFakeHost(services); + + // Activate the extension so it registers its resolver, then retrieve it. + createExecBackendExtension().activate(host); + const resolver = host.getService(execBackendHandle); + + expect(resolver(undefined)).toBe(localExecBackend); + expect(resolver()).toBe(localExecBackend); + }); + + it("returns the factory's backend for a set computerId when the factory is provided", () => { + const services = new Map<string, unknown>(); + const host = createFakeHost(services); + + // The `ssh` extension (not built yet) would do this: + const remoteBackend = createFakeRemoteBackend("ssh-alias"); + const factory = (computerId: string): ExecBackend => { + // Confirm the alias is threaded through to the factory. + expect(computerId).toBe("ssh-alias"); + return remoteBackend; + }; + host.provideService(remoteExecBackendFactoryHandle, factory); + + createExecBackendExtension().activate(host); + const resolver = host.getService(execBackendHandle); + + expect(resolver("ssh-alias")).toBe(remoteBackend); + }); + + it("throws a clear 'not configured' error when the factory is NOT provided (ssh not loaded)", () => { + const services = new Map<string, unknown>(); + const host = createFakeHost(services); + + // No remoteExecBackendFactoryHandle provided → simulates ssh not loaded. + createExecBackendExtension().activate(host); + const resolver = host.getService(execBackendHandle); + + // Not a crash: a clear, actionable error mentioning computerId + ssh. + expect(() => resolver("some-host")).toThrow(/SSH remote execution is not configured/); + expect(() => resolver("some-host")).toThrow(/ssh extension is not loaded/); + expect(() => resolver("some-host")).toThrow(/some-host/); + }); + + it("local path is unaffected by whether the factory is provided", () => { + // Even with a factory present, computerId === undefined still returns local. + const services = new Map<string, unknown>(); + const host = createFakeHost(services); + host.provideService(remoteExecBackendFactoryHandle, () => createFakeRemoteBackend("unused")); + + createExecBackendExtension().activate(host); + const resolver = host.getService(execBackendHandle); + + expect(resolver(undefined)).toBe(localExecBackend); + }); }); |
