| 1 | import { assert, it } from "@effect/vitest" |
| 2 | import { Effect } from "effect" |
| 3 | import { EntityAddress, EntityId, EntityType, ShardId } from "effect/cluster" |
| 4 | import { acquireEntity, aroundEntityType, isActive, releaseEntity } from "effect/cluster/internal/interruptors" |
| 5 | |
| 6 | const address = EntityAddress.make({ |
| 7 | shardId: ShardId.make("active-teardown-unit", 1), |
| 8 | entityType: EntityType.make("ActiveTeardownUnit"), |
| 9 | entityId: EntityId.make("1") |
| 10 | }) |
| 11 | |
| 12 | it("releases entity keys so membership returns to baseline", () => { |
| 13 | acquireEntity(address) |
| 14 | assert.isTrue(isActive(address)) |
| 15 | releaseEntity(address) |
| 16 | assert.isFalse(isActive(address)) |
| 17 | }) |
| 18 | |
| 19 | it("refcounts overlapping acquires", () => { |
| 20 | acquireEntity(address) |
| 21 | acquireEntity(address) |
| 22 | releaseEntity(address) |
| 23 | assert.isTrue(isActive(address)) |
| 24 | releaseEntity(address) |
| 25 | assert.isFalse(isActive(address)) |
| 26 | }) |
| 27 | |
| 28 | it.effect("aroundEntityType restores the key after the effect", () => |
| 29 | Effect.gen(function*() { |
| 30 | yield* aroundEntityType( |
| 31 | "ActiveTeardownUnit", |
| 32 | Effect.sync(() => { |
| 33 | assert.isTrue(isActive(address)) |
| 34 | }) |
| 35 | ) |
| 36 | assert.isFalse(isActive(address)) |
| 37 | })) |