summaryrefslogtreecommitdiffhomepage
path: root/packages/exec-backend/src/extension.test.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-27 01:12:40 +0900
committerAdam Malczewski <[email protected]>2026-06-27 01:12:40 +0900
commit98b0638838a8e754927d8c030ce8bded18d63e7d (patch)
tree0d4e21c3d4792fcd77e1040373b260e38efa34ce /packages/exec-backend/src/extension.test.ts
parentd92a4af6191d7d20acf861adf605ad0227b6b287 (diff)
parent61e45e60d699ed1ca46f94a8f181c92a940317c6 (diff)
downloaddispatch-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.ts166
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);
+ });
});