11import * as Atom from "@effect-atom/atom/Atom"
22import * as Registry from "@effect-atom/atom/Registry"
33import { act , render , screen , waitFor } from "@testing-library/react"
4- import { Effect , Schema } from "effect"
4+ import { Effect , Layer , Schema } from "effect"
55import { Suspense } from "react"
66import { renderToString } from "react-dom/server"
77import { ErrorBoundary } from "react-error-boundary"
88import { beforeEach , describe , expect , it , test , vi } from "vitest"
9- import { Hydration , RegistryContext , Result , useAtomSuspense , useAtomValue } from "../src/index.js"
9+ import { Hydration , RegistryContext , RegistryProvider , Result , useAtomSuspense , useAtomValue } from "../src/index.js"
1010import { HydrationBoundary } from "../src/ReactHydration.js"
1111
1212describe ( "atom-react" , ( ) => {
@@ -16,6 +16,36 @@ describe("atom-react", () => {
1616 registry = Registry . make ( )
1717 } )
1818
19+ describe ( "runtime" , ( ) => {
20+ test ( "can inject test layers" , ( ) => {
21+ class TheNumber extends Effect . Service < TheNumber > ( ) ( "TheNumber" , {
22+ succeed : { n : 42 as number }
23+ } ) { }
24+ const runtime = Atom . runtime ( TheNumber . Default )
25+ const numberAtom = runtime . atom ( TheNumber . use ( ( _ ) => Effect . succeed ( _ . n ) ) )
26+
27+ function TestComponent ( ) {
28+ const value = useAtomValue ( numberAtom , Result . getOrThrow )
29+ return < div data-testid = "value" > { value } </ div >
30+ }
31+
32+ render (
33+ < RegistryProvider
34+ initialValues = { [
35+ Atom . initialValue (
36+ runtime . layer ,
37+ Layer . succeed ( TheNumber , new TheNumber ( { n : 69 } ) )
38+ )
39+ ] }
40+ >
41+ < TestComponent />
42+ </ RegistryProvider >
43+ )
44+
45+ expect ( screen . getByTestId ( "value" ) ) . toHaveTextContent ( "69" )
46+ } )
47+ } )
48+
1949 describe ( "useAtomValue" , ( ) => {
2050 test ( "should read value from simple Atom" , ( ) => {
2151 const atom = Atom . make ( 42 )
0 commit comments