Buckets:
| import { test, type TestOptions } from "bun:test" | |
| import { Cause, Effect, Exit, Layer } from "effect" | |
| import type * as Scope from "effect/Scope" | |
| import * as TestClock from "effect/testing/TestClock" | |
| import * as TestConsole from "effect/testing/TestConsole" | |
| type Body<A, E, R> = Effect.Effect<A, E, R> | (() => Effect.Effect<A, E, R>) | |
| const body = <A, E, R>(value: Body<A, E, R>) => Effect.suspend(() => (typeof value === "function" ? value() : value)) | |
| const run = <A, E, R, E2>(value: Body<A, E, R | Scope.Scope>, layer: Layer.Layer<R, E2>) => | |
| Effect.gen(function* () { | |
| const exit = yield* body(value).pipe(Effect.scoped, Effect.provide(layer), Effect.exit) | |
| if (Exit.isFailure(exit)) { | |
| for (const err of Cause.prettyErrors(exit.cause)) { | |
| yield* Effect.logError(err) | |
| } | |
| } | |
| return yield* exit | |
| }).pipe(Effect.runPromise) | |
| const make = <R, E>(testLayer: Layer.Layer<R, E>, liveLayer: Layer.Layer<R, E>) => { | |
| const effect = <A, E2>(name: string, value: Body<A, E2, R | Scope.Scope>, opts?: number | TestOptions) => | |
| test(name, () => run(value, testLayer), opts) | |
| effect.only = <A, E2>(name: string, value: Body<A, E2, R | Scope.Scope>, opts?: number | TestOptions) => | |
| test.only(name, () => run(value, testLayer), opts) | |
| effect.skip = <A, E2>(name: string, value: Body<A, E2, R | Scope.Scope>, opts?: number | TestOptions) => | |
| test.skip(name, () => run(value, testLayer), opts) | |
| const live = <A, E2>(name: string, value: Body<A, E2, R | Scope.Scope>, opts?: number | TestOptions) => | |
| test(name, () => run(value, liveLayer), opts) | |
| live.only = <A, E2>(name: string, value: Body<A, E2, R | Scope.Scope>, opts?: number | TestOptions) => | |
| test.only(name, () => run(value, liveLayer), opts) | |
| live.skip = <A, E2>(name: string, value: Body<A, E2, R | Scope.Scope>, opts?: number | TestOptions) => | |
| test.skip(name, () => run(value, liveLayer), opts) | |
| return { effect, live } | |
| } | |
| // Test environment with TestClock and TestConsole | |
| const testEnv = Layer.mergeAll(TestConsole.layer, TestClock.layer()) | |
| // Live environment - uses real clock, but keeps TestConsole for output capture | |
| const liveEnv = TestConsole.layer | |
| export const it = make(testEnv, liveEnv) | |
| export const testEffect = <R, E>(layer: Layer.Layer<R, E>) => | |
| make(Layer.provideMerge(layer, testEnv), Layer.provideMerge(layer, liveEnv)) | |
Xet Storage Details
- Size:
- 2.36 kB
- Xet hash:
- f1e19d3c3534fa77aca5b43f1daa9fb91934f0328470d5a8a267a89a600c6732
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.