test: use Effect test helper for run-service (#25048)

This commit is contained in:
Kit Langton
2026-04-30 17:05:10 +00:00
committed by GitHub
parent ec3ab4a00c
commit f384675c01
@@ -1,46 +1,49 @@
import { expect, test } from "bun:test" import { expect } from "bun:test"
import { Effect, Layer, Context } from "effect" import { Effect, Layer, Context } from "effect"
import { makeRuntime } from "../../src/effect/run-service" import { makeRuntime } from "../../src/effect/run-service"
import { it } from "../lib/effect"
class Shared extends Context.Service<Shared, { readonly id: number }>()("@test/Shared") {} class Shared extends Context.Service<Shared, { readonly id: number }>()("@test/Shared") {}
test("makeRuntime shares dependent layers through the shared memo map", async () => { it.live("makeRuntime shares dependent layers through the shared memo map", () =>
let n = 0 Effect.gen(function* () {
let n = 0
const shared = Layer.effect( const shared = Layer.effect(
Shared, Shared,
Effect.sync(() => { Effect.sync(() => {
n += 1 n += 1
return Shared.of({ id: n }) return Shared.of({ id: n })
}), }),
) )
class One extends Context.Service<One, { readonly get: () => Effect.Effect<number> }>()("@test/One") {} class One extends Context.Service<One, { readonly get: () => Effect.Effect<number> }>()("@test/One") {}
const one = Layer.effect( const one = Layer.effect(
One, One,
Effect.gen(function* () { Effect.gen(function* () {
const svc = yield* Shared const svc = yield* Shared
return One.of({ return One.of({
get: Effect.fn("One.get")(() => Effect.succeed(svc.id)), get: Effect.fn("One.get")(() => Effect.succeed(svc.id)),
}) })
}), }),
).pipe(Layer.provide(shared)) ).pipe(Layer.provide(shared))
class Two extends Context.Service<Two, { readonly get: () => Effect.Effect<number> }>()("@test/Two") {} class Two extends Context.Service<Two, { readonly get: () => Effect.Effect<number> }>()("@test/Two") {}
const two = Layer.effect( const two = Layer.effect(
Two, Two,
Effect.gen(function* () { Effect.gen(function* () {
const svc = yield* Shared const svc = yield* Shared
return Two.of({ return Two.of({
get: Effect.fn("Two.get")(() => Effect.succeed(svc.id)), get: Effect.fn("Two.get")(() => Effect.succeed(svc.id)),
}) })
}), }),
).pipe(Layer.provide(shared)) ).pipe(Layer.provide(shared))
const { runPromise: runOne } = makeRuntime(One, one) const { runPromise: runOne } = makeRuntime(One, one)
const { runPromise: runTwo } = makeRuntime(Two, two) const { runPromise: runTwo } = makeRuntime(Two, two)
expect(await runOne((svc) => svc.get())).toBe(1) expect(yield* Effect.promise(() => runOne((svc) => svc.get()))).toBe(1)
expect(await runTwo((svc) => svc.get())).toBe(1) expect(yield* Effect.promise(() => runTwo((svc) => svc.get()))).toBe(1)
expect(n).toBe(1) expect(n).toBe(1)
}) }),
)