import { assert, it } from "@effect/vitest"; import { ProjectId } from "@t3tools/contracts"; import * as Effect from "effect/Effect"; import { ProjectConflictError, ProjectNotEmptyError, ProjectNotFoundError, ProjectOperationError, } from "./ProjectService.ts"; import { ServerRuntimeStartupError } from "../serverRuntimeStartup.ts"; import { failProjectMutation } from "./http.ts"; const projectId = ProjectId.make("project:http-mutation"); it.effect.each([ new ProjectNotFoundError({ projectId }), new ProjectNotEmptyError({ projectId }), new ProjectConflictError({ projectId, workspaceRoot: "/workspace/project", conflictingProjectId: ProjectId.make("project:http-mutation-conflict"), }), ])("maps expected project mutation failures to invalid requests", (cause) => Effect.gen(function* () { const error = yield* failProjectMutation(cause).pipe(Effect.flip); assert.equal(error._tag, "EnvironmentRequestInvalidError"); assert.equal(error.code, "invalid_request"); assert.equal(error.reason, "invalid_command"); }), ); it.effect.each([ new ProjectOperationError({ operation: "dispatch-project-command", projectId, cause: "database unavailable", }), new ServerRuntimeStartupError({ mode: "web", host: null, port: 0, cause: "startup unavailable", }), ])("keeps operational and startup failures internal", (cause) => Effect.gen(function* () { const error = yield* failProjectMutation(cause).pipe(Effect.flip); assert.equal(error._tag, "EnvironmentInternalError"); assert.equal(error.code, "internal_error"); assert.equal(error.reason, "project_mutation_failed"); }), );