1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
module Reactix.Test
( act
, render
, Rendered
, fireEvent, fireClick
, cleanup
) where
import Prelude (Unit, pure, unit, ($))
import Effect ( Effect )
import Effect.Uncurried (runEffectFn1)
import DOM.Simple as DOM
import Reactix.React (Element)
import FFI.Simple ( (..), (...), delay )
foreign import data TestUtils :: Type
foreign import testUtils :: TestUtils
foreign import data Testing :: Type
foreign import testingLibrary :: Testing
type Rendered =
{ getByText :: String -> Effect Element
, getByTestId :: String -> Effect Element
, container :: DOM.Element
, asFragment :: Effect DOM.Fragment }
render :: Element -> Effect Rendered
render e = pure $ raw { getByText=getByText, getByTestId=getByTestId }
where getByText = runEffectFn1 raw.getByText
getByTestId = runEffectFn1 raw.getByTestId
raw = testingLibrary ... "render" $ [e]
-- | Make react behave more predictably in tests
act :: forall t. (Unit -> Effect t) -> Effect t
act f = testUtils ... "act" $ [ delay unit f ]
fireClick :: DOM.Element -> Effect Unit
fireClick = fireEvent "click"
fireEvent :: String -> DOM.Element -> Effect Unit
fireEvent ev el = pure $ (testingLibrary .. "fireEvent") ... ev $ [el]
cleanup :: Effect Unit
cleanup = delay unit $ \_ -> pure $ testingLibrary ... "cleanup" $ []