1import { assert, describe, it } from "@effect/vitest"
2import { Effect, Exit, Fiber, Scheduler } from "effect"
3import { Workflow } from "effect/workflow"
4import { WorkflowInstance } from "effect/workflow/WorkflowEngine"
5
6describe("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})