packages feed

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

{-# options_ghc -Wno-partial-type-signatures #-}

module Polysemy.Hasql.Test.DefaultTest where

import Polysemy.Db.Data.DbError (DbError)
import qualified Polysemy.Db.Effect.Store as Store
import Polysemy.Db.Effect.Store (Store)
import Polysemy.Test (UnitTest, assertEq)
import Prelude hiding (sum)
import Sqel.Column (pgDefault)
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)
import Sqel.Prim (prim, primAs, primNullable)
import Sqel.Product (prod)
import Sqel.Query (checkQuery)
import Sqel.Uid (uid)

import Polysemy.Hasql.Interpreter.DbTable (interpretTable)
import Polysemy.Hasql.Interpreter.Store (interpretStoreDb)
import Polysemy.Hasql.Test.RunIntegration (integrationTest)

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

dd :: Dd _
dd = uid prim (prod (prim :> prim :> pgDefault "13" primNullable))

ts :: TableSchema (Uid Int Dat)
ts = tableSchema dd

idSchema :: QuerySchema Int (Uid Int Dat)
idSchema =
  checkQuery (primAs @"id") dd

-- TODO problem: default value is not used when explicit null is specified. would need to omit the column from the
-- insert statement, but that would require dynamic statement
test_default :: UnitTest
test_default =
  integrationTest do
    interpretTable ts $ interpretStoreDb ts idSchema do
      restop @DbError @(Store _ _) do
        Store.insert d
        assertEq [d] =<< Store.fetchAll
  where
    d = Uid 1 (Dat "name" 1 Nothing)