packages feed

polysemy-hasql-0.0.1.0: integration/Polysemy/Hasql/Test/SumQueryTest.hs

{-# options_ghc -Wno-partial-type-signatures -fconstraint-solver-iterations=10 #-}

module Polysemy.Hasql.Test.SumQueryTest where

import Polysemy.Db.Data.DbError (DbError)
import qualified Polysemy.Db.Effect.Query as Query
import Polysemy.Db.Effect.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, DdK (DdK), Sqel, type (:>) ((:>)))
import Sqel.Data.Projection (Projection)
import Sqel.Data.QuerySchema (QuerySchema)
import Sqel.Data.TableSchema (TableSchema)
import Sqel.Data.Uid (Uid (Uid))
import Sqel.PgType (projection, tableSchema)
import Sqel.Prim (prim, primAs, prims)
import Sqel.Product (prod)
import Sqel.Query (checkQuery)
import Sqel.Sum (con1, con1As, sum)
import Sqel.Uid (uid)

import Polysemy.Hasql.Interpreter.DbTable (interpretTable, interpretTableViewDd)
import Polysemy.Hasql.Interpreter.Query (interpretQuery)
import Polysemy.Hasql.Interpreter.Store (interpretStoreDb)
import Polysemy.Hasql.Test.RunIntegration (integrationTest)

data Dat =
  Dat {
    name :: Text,
    number :: Int64
  }
  deriving stock (Eq, Show, Generic)

data NaNu =
  Na { name :: Text }
  |
  Nu Int64
  deriving stock (Eq, Show, Generic)

td :: Sqel (Uid Int64 Dat) _
td = uid prim (prod prims)

ts :: TableSchema (Uid Int64 Dat)
ts = tableSchema td

vd :: Dd ('DdK _ _ Dat _)
vd = prod prims

vs :: Projection Dat (Uid Int64 Dat)
vs =
  projection vd td

idSchema :: QuerySchema Int64 (Uid Int64 Dat)
idSchema =
  checkQuery (primAs @"id") td

qd :: Dd ('DdK _ _ NaNu _)
qd = sum (con1 prim :> con1As @"number" prim)

test_sumQuery :: UnitTest
test_sumQuery =
  integrationTest do
    interpretTable ts $ interpretTableViewDd td vd $ interpretStoreDb ts idSchema $ interpretQuery @[_] vs (checkQuery qd td) do
      restop @DbError @(Query _ _) $ restop @DbError @(Store _ _) do
        Store.insert (Uid 1 d1)
        Store.insert (Uid 2 d2)
        Store.insert (Uid 3 d3)
        r1 <- Query.query (Na "x")
        [d1, d2] === r1
        r2 <- Query.query (Nu 10)
        [d2, d3] === r2
  where
    d1 = Dat "x" 5
    d2 = Dat "x" 10
    d3 = Dat "y" 10