| 1 | import { assert, describe, it } from "@effect/vitest" |
| 2 | import * as Duration from "effect/Duration" |
| 3 | import * as Effect from "effect/Effect" |
| 4 | import { identity, pipe } from "effect/Function" |
| 5 | import * as Ref from "effect/Ref" |
| 6 | import * as Resource from "effect/Resource" |
| 7 | import * as Schedule from "effect/Schedule" |
| 8 | import * as TestClock from "effect/testing/TestClock" |
| 9 | |
| 10 | describe("Resource", () => { |
| 11 | it.effect("isResource", () => |
| 12 | Effect.gen(function*() { |
| 13 | const resource = yield* Resource.manual(Effect.succeed(0)) |
| 14 | assert.isTrue(Resource.isResource(resource)) |
| 15 | assert.isFalse(Resource.isResource(new Set([0]))) |
| 16 | })) |
| 17 | |
| 18 | it.effect("manual refresh updates the cached value", () => |
| 19 | Effect.gen(function*() { |
| 20 | const ref = yield* Ref.make(0) |
| 21 | const resource = yield* Resource.manual(Ref.get(ref)) |
| 22 | const result1 = yield* Resource.get(resource) |
| 23 | const result2 = yield* pipe( |
| 24 | Ref.set(ref, 1), |
| 25 | Effect.andThen(Resource.refresh(resource)), |
| 26 | Effect.andThen(Resource.get(resource)) |
| 27 | ) |
| 28 | assert.strictEqual(result1, 0) |
| 29 | assert.strictEqual(result2, 1) |
| 30 | })) |
| 31 | |
| 32 | it.effect("manual refresh releases the previous scoped acquisition", () => |
| 33 | Effect.gen(function*() { |
| 34 | const ref = yield* Ref.make(0) |
| 35 | const resource = yield* Resource.auto(Ref.get(ref), Schedule.spaced(Duration.millis(4))) |
| 36 | const result1 = yield* Resource.get(resource) |
| 37 | const result2 = yield* pipe( |
| 38 | Ref.set(ref, 1), |
| 39 | Effect.andThen(TestClock.adjust(Duration.millis(5))), |
| 40 | Effect.andThen(Resource.get(resource)) |
| 41 | ) |
| 42 | assert.strictEqual(result1, 0) |
| 43 | assert.strictEqual(result2, 1) |
| 44 | })) |
| 45 | |
| 46 | it.effect("failed refresh doesn't affect cached value", () => |
| 47 | Effect.gen(function*() { |
| 48 | const ref = yield* Ref.make<Effect.Effect<number, string>>(Effect.succeed(0)) |
| 49 | const resource = yield* Resource.auto(Effect.flatMap(Ref.get(ref), identity), Schedule.spaced(Duration.millis(4))) |
| 50 | const result1 = yield* Resource.get(resource) |
| 51 | const result2 = yield* pipe( |
| 52 | Ref.set(ref, Effect.fail("Uh oh!")), |
| 53 | Effect.andThen(TestClock.adjust(Duration.millis(5))), |
| 54 | Effect.andThen(Resource.get(resource)) |
| 55 | ) |
| 56 | assert.strictEqual(result1, 0) |
| 57 | assert.strictEqual(result2, 0) |
| 58 | })) |
| 59 | }) |