module Test.Entities.Bar ( Bar (..) , table , generate , generateList , withTable , barIdField ) where import Control.Monad.IO.Class (MonadIO (liftIO)) import Data.Int (Int32) import qualified Data.Text as T import qualified Hedgehog as HH import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import qualified Orville.PostgreSQL as Orville import qualified Orville.PostgreSQL.Raw.Connection as Conn import qualified Test.PgGen as PgGen import qualified Test.TestTable as TestTable type BarId = Int32 type BarName = T.Text data Bar barId = Bar { barId :: barId , barName :: BarName } deriving (Eq, Show) type BarWrite = Bar () type BarRead = Bar BarId table :: Orville.TableDefinition (Orville.HasKey BarId) BarWrite BarRead table = Orville.mkTableDefinition "bar" (Orville.primaryKey barIdField) barMarshaller barMarshaller :: Orville.SqlMarshaller BarWrite BarRead barMarshaller = Bar <$> Orville.marshallReadOnly (Orville.marshallField barId barIdField) <*> Orville.marshallField barName barNameField barIdField :: Orville.FieldDefinition Orville.NotNull BarId barIdField = Orville.serialField "id" barNameField :: Orville.FieldDefinition Orville.NotNull BarName barNameField = Orville.unboundedTextField "name" generate :: HH.Gen BarWrite generate = Bar () <$> PgGen.pgText (Range.constant 0 10) generateList :: HH.Range Int -> HH.Gen [BarWrite] generateList range = (Gen.list range generate) withTable :: MonadIO m => Orville.ConnectionPool -> Orville.Orville a -> m a withTable pool operation = liftIO $ do Conn.withPoolConnection pool $ \connection -> TestTable.dropAndRecreateTableDef connection table Orville.runOrville pool operation