polysemy-hasql-0.0.1.0: integration/Polysemy/Hasql/Test/SimpleQueryTest.hs
{-# options_ghc -Wno-partial-type-signatures #-}
module Polysemy.Hasql.Test.SimpleQueryTest where
import Lens.Micro.Extras (view)
import Polysemy.Db.Data.DbError (DbError)
import qualified Polysemy.Db.Effect.Query as Query
import Polysemy.Db.Effect.Query (Query (Query))
import qualified Polysemy.Db.Effect.Store as Store
import Polysemy.Db.Effect.Store (Store)
import Polysemy.Test (UnitTest, (===))
import Prelude hiding (sum)
import Sqel.Data.Dd (Dd, (:>) ((:>)))
import Sqel.Data.QuerySchema (QuerySchema)
import Sqel.Data.TableSchema (TableSchema)
import Sqel.Data.Uid (Uid (Uid))
import Sqel.PgType (tableSchema, toFullProjection)
import Sqel.Prim (prim, primAs, prims)
import Sqel.Product (prod)
import Sqel.Query (checkQuery)
import Sqel.Statement (selectWhere)
import Sqel.Uid (uid)
import qualified Polysemy.Hasql.Effect.Database as Database
import Polysemy.Hasql.Effect.Database (Database)
import Polysemy.Hasql.Interpreter.DbTable (interpretTable)
import Polysemy.Hasql.Interpreter.Store (interpretStoreDb)
import Polysemy.Hasql.Test.RunIntegration (integrationTest)
data Q =
Q {
name :: Text,
number :: Int
}
deriving stock (Eq, Show, Generic)
data Dat =
Dat {
name :: Text,
number :: Int,
count :: Int
}
deriving stock (Eq, Show, Generic)
td :: Dd _
td = uid prim (prod prims)
ts :: TableSchema (Uid Int Dat)
ts = tableSchema td
idSchema :: QuerySchema Int (Uid Int Dat)
idSchema =
checkQuery (primAs @"id") td
interpretQuery ::
Member (Database !! DbError) r =>
InterpreterFor (Query Q [Uid Int Dat] !! DbError) r
interpretQuery =
interpretResumable \case
Query params ->
restop (Database.statement params stm)
where
stm = selectWhere (checkQuery (prod (prim :> prim)) td) (toFullProjection ts)
test_simpleQuery :: UnitTest
test_simpleQuery =
integrationTest do
interpretTable ts $ interpretStoreDb ts idSchema $ interpretQuery do
restop @DbError @(Query _ _) $ restop @DbError @(Store _ _) do
for_ @[] [1..10] \ i ->
Store.insert (Uid i (Dat "name" i 12))
r <- fmap (view #id) <$> Query.query (Q "name" 5)
[5] === r