114 lines · 3.3 KB · TypeScript
RawDownload
import { assert, it } from "@effect/vitest";import { Effect, Schema } from "effect"; import { ORCHESTRATION_WS_CHANNELS, ORCHESTRATION_WS_METHODS } from "./orchestration";import { WebSocketRequest, WsResponse, WS_CHANNELS, WS_METHODS } from "./ws"; const decodeWebSocketRequest = Schema.decodeUnknownEffect(WebSocketRequest);const decodeWsResponse = Schema.decodeUnknownEffect(WsResponse); it.effect("accepts getTurnDiff requests when fromTurnCount <= toTurnCount", () =>  Effect.gen(function* () {    const parsed = yield* decodeWebSocketRequest({      id: "req-1",      body: {        _tag: ORCHESTRATION_WS_METHODS.getTurnDiff,        threadId: "thread-1",        fromTurnCount: 1,        toTurnCount: 2,      },    });    assert.strictEqual(parsed.body._tag, ORCHESTRATION_WS_METHODS.getTurnDiff);  }),); it.effect("rejects getTurnDiff requests when fromTurnCount > toTurnCount", () =>  Effect.gen(function* () {    const result = yield* Effect.exit(      decodeWebSocketRequest({        id: "req-1",        body: {          _tag: ORCHESTRATION_WS_METHODS.getTurnDiff,          threadId: "thread-1",          fromTurnCount: 3,          toTurnCount: 2,        },      }),    );    assert.strictEqual(result._tag, "Failure");  }),); it.effect("trims websocket request id and nested orchestration ids", () =>  Effect.gen(function* () {    const parsed = yield* decodeWebSocketRequest({      id: " req-1 ",      body: {        _tag: ORCHESTRATION_WS_METHODS.getTurnDiff,        threadId: " thread-1 ",        fromTurnCount: 0,        toTurnCount: 0,      },    });    assert.strictEqual(parsed.id, "req-1");    assert.strictEqual(parsed.body._tag, ORCHESTRATION_WS_METHODS.getTurnDiff);    if (parsed.body._tag === ORCHESTRATION_WS_METHODS.getTurnDiff) {      assert.strictEqual(parsed.body.threadId, "thread-1");    }  }),); it.effect("accepts git.preparePullRequestThread requests", () =>  Effect.gen(function* () {    const parsed = yield* decodeWebSocketRequest({      id: "req-pr-1",      body: {        _tag: WS_METHODS.gitPreparePullRequestThread,        cwd: "/repo",        reference: "#42",        mode: "worktree",      },    });    assert.strictEqual(parsed.body._tag, WS_METHODS.gitPreparePullRequestThread);  }),); it.effect("accepts typed websocket push envelopes with sequence", () =>  Effect.gen(function* () {    const parsed = yield* decodeWsResponse({      type: "push",      sequence: 1,      channel: WS_CHANNELS.serverWelcome,      data: {        cwd: "/tmp/workspace",        projectName: "workspace",      },    });     if (!("type" in parsed) || parsed.type !== "push") {      assert.fail("expected websocket response to decode as a push envelope");    }     assert.strictEqual(parsed.type, "push");    assert.strictEqual(parsed.sequence, 1);    assert.strictEqual(parsed.channel, WS_CHANNELS.serverWelcome);  }),); it.effect("rejects push envelopes when channel payload does not match the channel schema", () =>  Effect.gen(function* () {    const result = yield* Effect.exit(      decodeWsResponse({        type: "push",        sequence: 2,        channel: ORCHESTRATION_WS_CHANNELS.domainEvent,        data: {          cwd: "/tmp/workspace",          projectName: "workspace",        },      }),    );     assert.strictEqual(result._tag, "Failure");  }),);