polysemy-hasql-0.0.1.0: integration/Polysemy/Hasql/Test/SumTest.hs
{-# options_ghc -Wno-partial-type-signatures -fconstraint-solver-iterations=10 #-}
module Polysemy.Hasql.Test.SumTest where
import Hasql.Statement (Statement)
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 (Sqel, type (:>) ((:>)))
import Sqel.Data.QuerySchema (QuerySchema)
import Sqel.Data.TableSchema (TableSchema)
import Sqel.Data.Uid (Uid (Uid))
import Sqel.Names (typeAs)
import Sqel.PgType (fullProjection, tableSchema)
import Sqel.Prim (prim, primAs, prims)
import Sqel.Product (prod)
import Sqel.Query (checkQuery)
import Sqel.Statement (selectWhere)
import Sqel.Sum (con, conAs, sum)
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 Pord =
Pord {
p1 :: Int,
p2 :: Text
}
deriving stock (Eq, Show, Generic)
data Sumbo =
Glorpf { g1 :: Int, g2 :: Text }
|
Vnarp { v1 :: Int, v2 :: Text }
|
Shwank { s1 :: Text, s2 :: Pord }
deriving stock (Eq, Show, Generic)
data Dat =
Dat {
name :: Text,
sumb :: Sumbo
}
deriving stock (Eq, Show, Generic)
data SumboQ =
GlorpfQ { g1 :: Int }
|
ShwankQ { s1 :: Text }
deriving stock (Eq, Show, Generic)
data Q =
Q {
n :: Text,
sumb :: SumboQ
}
deriving stock (Eq, Show, Generic)
td :: Sqel (Uid Int64 Dat) _
td =
uid prim (prod (
prim :>
typeAs @"sombo" (sum (
con prims :>
con prims :>
con (prim :> prod prims)
))
))
ts :: TableSchema (Uid Int64 Dat)
ts = tableSchema td
idSchema :: QuerySchema Int64 (Uid Int64 Dat)
idSchema =
checkQuery (primAs @"id") td
stm :: Statement Q [Uid Int64 Dat]
stm =
selectWhere (checkQuery qd td) (fullProjection td)
where
qd =
prod (
primAs @"name" :>
sum (
conAs @"Glorpf" prim :>
conAs @"Shwank" prim
)
)
interpretQuery ::
Member (Database !! DbError) r =>
InterpreterFor (Query Q [Uid Int64 Dat] !! DbError) r
interpretQuery =
interpretResumable \case
Query params ->
restop (Database.statement params stm)
test_sum :: UnitTest
test_sum =
integrationTest do
interpretTable ts $ interpretStoreDb ts idSchema $ interpretQuery do
restop @DbError @(Query _ _) $ restop @DbError @(Store _ _) do
Store.insert (Uid 1 (Dat "ellow" (Glorpf 5 "crinp")))
Store.insert (Uid 2 (Dat "ellow" (Glorpf 6 "crinp")))
Store.insert (Uid 3 (Dat "cheerio" (Shwank "gzerq" (Pord 93 "pord"))))
r1 <- fmap (view #id) <$> Query.query (Q "ellow" (GlorpfQ 5))
[1] === r1
r2 <- fmap (view #id) <$> Query.query (Q "cheerio" (ShwankQ "gzerq"))
[3] === r2