purescript-pg/test/Test.Common.purs

77 lines
2.3 KiB
Haskell
Raw Normal View History

module Test.Common where
import Prelude
import Data.Either (Either(..))
import Data.String.Regex (Regex)
import Data.String.Regex as Regex
2024-06-25 18:53:09 +00:00
import Data.String.Regex.Flags (RegexFlags)
2024-04-01 20:20:59 +00:00
import Data.Tuple.Nested (type (/\), (/\))
import Effect (Effect)
2024-04-01 20:20:59 +00:00
import Effect.Aff (Aff, bracket, makeAff)
2024-03-31 01:38:52 +00:00
import Effect.Aff.Postgres.Client (Client)
import Effect.Aff.Postgres.Client as Client
import Effect.Aff.Postgres.Pool (Pool)
import Effect.Aff.Postgres.Pool as Pool
import Effect.Class (liftEffect)
2024-06-25 18:53:09 +00:00
import Effect.Postgres.Error.Except as X
2024-03-31 01:38:52 +00:00
import Effect.Unsafe (unsafePerformEffect)
2024-06-25 18:53:09 +00:00
import Node.EventEmitter (EventHandle)
2024-04-01 20:20:59 +00:00
import Node.EventEmitter as EE
import Node.Path as Path
import Node.Process (cwd)
import Partial.Unsafe (unsafePartial)
type Config =
{ database :: String
, host :: String
, password :: String
, user :: String
, max :: Int
}
config :: Effect Config
config = do
cwd' <- liftEffect cwd
host <- liftEffect $ Path.resolve [ cwd' ] "./pg"
2024-04-01 18:46:33 +00:00
pure { host, user: "postgres", password: "password", database: "postgres", max: 3 }
withConfig :: (Config -> Aff Unit) -> Aff Unit
withConfig f = f =<< liftEffect config
withClient :: (Client -> Aff Unit) -> Aff Unit
2024-06-25 18:53:09 +00:00
withClient = bracket (X.run $ Client.connected =<< liftEffect config) (X.run <<< Client.end)
2024-03-31 01:38:52 +00:00
pool :: Pool
pool = unsafePerformEffect $ Pool.make =<< liftEffect config
2024-04-01 18:46:33 +00:00
withPool :: (Pool -> Aff Unit) -> Aff Unit
2024-06-25 18:53:09 +00:00
withPool = bracket (liftEffect $ Pool.make =<< config) (X.run <<< Pool.end)
2024-04-01 18:46:33 +00:00
2024-03-31 01:38:52 +00:00
withPoolClient :: (Client -> Aff Unit) -> Aff Unit
2024-06-25 18:53:09 +00:00
withPoolClient = bracket (X.run $ Pool.connect pool) (liftEffect <<< X.run <<< Pool.release pool)
unsafeFromRight :: forall a b. Either a b -> b
unsafeFromRight e = unsafePartial $ case e of Right b -> b
re :: String -> RegexFlags -> Regex
re s f = unsafeFromRight $ Regex.regex s f
2024-04-01 20:20:59 +00:00
class Curried a b | a -> b where
curried :: (b -> Effect Unit) -> a
instance Curried (Effect Unit) Unit where
curried f = f unit
instance Curried (a -> Effect Unit) a where
curried = identity
instance Curried (a -> b -> Effect Unit) (a /\ b) where
curried f = \a b -> f $ a /\ b
instance Curried (a -> b -> c -> Effect Unit) (a /\ b /\ c) where
curried f = \a b c -> f $ a /\ b /\ c
onceAff :: forall psCb jsCb emitter r. Curried psCb r => EventHandle emitter psCb jsCb -> emitter -> Aff r
onceAff ev em = makeAff \res -> mempty <* EE.once ev (curried (res <<< Right)) em