import { assert, it } from "@effect/vitest";import { Effect, Schema } from "effect"; import { OrchestrationGetTurnDiffInput, ProjectCreateCommand, ThreadTurnDiff,} from "./orchestration"; const decodeTurnDiffInput = Schema.decodeUnknownEffect(OrchestrationGetTurnDiffInput);const decodeThreadTurnDiff = Schema.decodeUnknownEffect(ThreadTurnDiff);const decodeProjectCreateCommand = Schema.decodeUnknownEffect(ProjectCreateCommand); it.effect("parses turn diff input when fromTurnCount <= toTurnCount", () => Effect.gen(function* () { const parsed = yield* decodeTurnDiffInput({ threadId: "thread-1", fromTurnCount: 1, toTurnCount: 2, }); assert.strictEqual(parsed.fromTurnCount, 1); assert.strictEqual(parsed.toTurnCount, 2); }),); it.effect("rejects turn diff input when fromTurnCount > toTurnCount", () => Effect.gen(function* () { const result = yield* Effect.exit( decodeTurnDiffInput({ threadId: "thread-1", fromTurnCount: 3, toTurnCount: 2, }), ); assert.strictEqual(result._tag, "Failure"); }),); it.effect("rejects thread turn diff when fromTurnCount > toTurnCount", () => Effect.gen(function* () { const result = yield* Effect.exit( decodeThreadTurnDiff({ threadId: "thread-1", fromTurnCount: 3, toTurnCount: 2, diff: "patch", }), ); assert.strictEqual(result._tag, "Failure"); }),); it.effect("trims branded ids and command string fields at decode boundaries", () => Effect.gen(function* () { const parsed = yield* decodeProjectCreateCommand({ type: "project.create", commandId: " cmd-1 ", projectId: " project-1 ", title: " Project Title ", workspaceRoot: " /tmp/workspace ", defaultModel: " gpt-5.2 ", createdAt: "2026-01-01T00:00:00.000Z", }); assert.strictEqual(parsed.commandId, "cmd-1"); assert.strictEqual(parsed.projectId, "project-1"); assert.strictEqual(parsed.title, "Project Title"); assert.strictEqual(parsed.workspaceRoot, "/tmp/workspace"); assert.strictEqual(parsed.defaultModel, "gpt-5.2"); }),); it.effect("rejects command fields that become empty after trim", () => Effect.gen(function* () { const result = yield* Effect.exit( decodeProjectCreateCommand({ type: "project.create", commandId: "cmd-1", projectId: "project-1", title: " ", workspaceRoot: "/tmp/workspace", createdAt: "2026-01-01T00:00:00.000Z", }), ); assert.strictEqual(result._tag, "Failure"); }),);
import { assert, it } from "@effect/vitest";
import { Effect, Schema } from "effect";
import {
OrchestrationGetTurnDiffInput,
ProjectCreateCommand,
ThreadTurnDiff,
} from "./orchestration";
const decodeTurnDiffInput = Schema.decodeUnknownEffect(OrchestrationGetTurnDiffInput);
const decodeThreadTurnDiff = Schema.decodeUnknownEffect(ThreadTurnDiff);
const decodeProjectCreateCommand = Schema.decodeUnknownEffect(ProjectCreateCommand);
it.effect("parses turn diff input when fromTurnCount <= toTurnCount", () =>
Effect.gen(function* () {
const parsed = yield* decodeTurnDiffInput({
threadId: "thread-1",
fromTurnCount: 1,
toTurnCount: 2,
});
assert.strictEqual(parsed.fromTurnCount, 1);
assert.strictEqual(parsed.toTurnCount, 2);
}),
);
it.effect("rejects turn diff input when fromTurnCount > toTurnCount", () =>
Effect.gen(function* () {
const result = yield* Effect.exit(
decodeTurnDiffInput({
threadId: "thread-1",
fromTurnCount: 3,
toTurnCount: 2,
}),
);
assert.strictEqual(result._tag, "Failure");
}),
);
it.effect("rejects thread turn diff when fromTurnCount > toTurnCount", () =>
Effect.gen(function* () {
const result = yield* Effect.exit(
decodeThreadTurnDiff({
threadId: "thread-1",
fromTurnCount: 3,
toTurnCount: 2,
diff: "patch",
}),
);
assert.strictEqual(result._tag, "Failure");
}),
);
it.effect("trims branded ids and command string fields at decode boundaries", () =>
Effect.gen(function* () {
const parsed = yield* decodeProjectCreateCommand({
type: "project.create",
commandId: " cmd-1 ",
projectId: " project-1 ",
title: " Project Title ",
workspaceRoot: " /tmp/workspace ",
defaultModel: " gpt-5.2 ",
createdAt: "2026-01-01T00:00:00.000Z",
});
assert.strictEqual(parsed.commandId, "cmd-1");
assert.strictEqual(parsed.projectId, "project-1");
assert.strictEqual(parsed.title, "Project Title");
assert.strictEqual(parsed.workspaceRoot, "/tmp/workspace");
assert.strictEqual(parsed.defaultModel, "gpt-5.2");
}),
);
it.effect("rejects command fields that become empty after trim", () =>
Effect.gen(function* () {
const result = yield* Effect.exit(
decodeProjectCreateCommand({
type: "project.create",
commandId: "cmd-1",
projectId: "project-1",
title: " ",
workspaceRoot: "/tmp/workspace",
createdAt: "2026-01-01T00:00:00.000Z",
}),
);
assert.strictEqual(result._tag, "Failure");
}),
);