| 1 | import { assert, describe, it } from "@effect/vitest" |
| 2 | import { Effect, Exit, Fiber, Scheduler } from "effect" |
| 3 | import { Workflow } from "effect/workflow" |
| 4 | import { WorkflowInstance } from "effect/workflow/WorkflowEngine" |
| 5 | |
| 6 | describe("Workflow.wrapActivityResult", () => { |
| 7 | it.effect("releases acquisition interrupted before the body starts", () => |
| 8 | Effect.gen(function*() { |
| 9 | const workflow = Workflow.make("ActivityInterruption", { |
| 10 | payload: {}, |
| 11 | idempotencyKey: () => "activity-interruption" |
| 12 | }) |
| 13 | const instance = WorkflowInstance.initial(workflow, "acquisition") |
| 14 | const scheduler = new class extends Scheduler.MixedScheduler { |
| 15 | yielded = false |
| 16 | override shouldYield(fiber: Fiber.Fiber<unknown, unknown>): boolean { |
| 17 | if (this.yielded || instance.activityState.count !== 1) return super.shouldYield(fiber) |
| 18 | this.yielded = true |
| 19 | return true |
| 20 | } |
| 21 | }() |
| 22 | let entered = false |
| 23 | const fiber = yield* Workflow.wrapActivityResult( |
| 24 | Effect.sync(() => { |
| 25 | entered = true |
| 26 | }), |
| 27 | () => false |
| 28 | ).pipe( |
| 29 | Effect.provideService(WorkflowInstance, instance), |
| 30 | Effect.provideService(Scheduler.Scheduler, scheduler), |
| 31 | Effect.forkChild({ startImmediately: true }) |
| 32 | ) |
| 33 | assert.isTrue(scheduler.yielded) |
| 34 | yield* Fiber.interrupt(fiber) |
| 35 | assert.isTrue(Exit.hasInterrupts(yield* Fiber.await(fiber))) |
| 36 | assert.isFalse(entered) |
| 37 | assert.strictEqual(instance.activityState.count, 0) |
| 38 | yield* instance.activityState.latch.await |
| 39 | })) |
| 40 | }) |