add unique postgres tests

This commit is contained in:
Jose Duran 2019-09-30 14:10:41 -05:00
parent 07d9730dc4
commit 6acb8f0732
2 changed files with 48 additions and 3 deletions

View File

@ -25,11 +25,14 @@ module Common.Test
, testAscRandom , testAscRandom
, testRandomMath , testRandomMath
, migrateAll , migrateAll
, migrateUnique
, cleanDB , cleanDB
, cleanUniques
, RunDbMonad , RunDbMonad
, Run , Run
, p1, p2, p3, p4, p5 , p1, p2, p3, p4, p5
, l1, l2, l3 , l1, l2, l3
, u1, u2, u3, u4
, insert' , insert'
, EntityField (..) , EntityField (..)
, Foo (..) , Foo (..)
@ -48,6 +51,7 @@ module Common.Test
, Point (..) , Point (..)
, Circle (..) , Circle (..)
, Numbers (..) , Numbers (..)
, OneUnique(..)
) where ) where
import Control.Monad (forM_, replicateM, replicateM_, void) import Control.Monad (forM_, replicateM, replicateM_, void)
@ -157,8 +161,14 @@ share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistUpperCase|
double Double double Double
|] |]
-- Unique Test schema
share [mkPersist sqlSettings, mkMigrate "migrateUnique"] [persistUpperCase|
OneUnique
name String
value Int
UniqueValue value
deriving Eq Show
|]
-- | this could be achieved with S.fromList, but not all lists -- | this could be achieved with S.fromList, but not all lists
-- have Ord instances -- have Ord instances
@ -196,7 +206,17 @@ l2 = Lord "Dorset" Nothing
l3 :: Lord l3 :: Lord
l3 = Lord "Chester" (Just 17) l3 = Lord "Chester" (Just 17)
u1 :: OneUnique
u1 = OneUnique "First" 0
u2 :: OneUnique
u2 = OneUnique "Second" 1
u3 :: OneUnique
u3 = OneUnique "Third" 0
u4 :: OneUnique
u4 = OneUnique "First" 2
testSelect :: Run -> Spec testSelect :: Run -> Spec
testSelect run = do testSelect run = do
@ -1536,3 +1556,10 @@ cleanDB = do
delete $ from $ \(_ :: SqlExpr (Entity Point)) -> return () delete $ from $ \(_ :: SqlExpr (Entity Point)) -> return ()
delete $ from $ \(_ :: SqlExpr (Entity Numbers)) -> return () delete $ from $ \(_ :: SqlExpr (Entity Numbers)) -> return ()
cleanUniques
:: (forall m. RunDbMonad m
=> SqlPersistT (R.ResourceT m) ())
cleanUniques =
delete $ from $ \(_ :: SqlExpr (Entity OneUnique)) -> return ()

View File

@ -11,6 +11,7 @@
module Main (main) where module Main (main) where
import Control.Arrow ((&&&)) import Control.Arrow ((&&&))
import Control.Exception (evaluate)
import Control.Monad (void, when) import Control.Monad (void, when)
import Control.Monad.Catch (MonadCatch, catch) import Control.Monad.Catch (MonadCatch, catch)
import Control.Monad.IO.Class (MonadIO(liftIO)) import Control.Monad.IO.Class (MonadIO(liftIO))
@ -33,7 +34,7 @@ import qualified Database.Esqueleto.PostgreSQL as EP
import Database.Esqueleto.PostgreSQL.JSON hiding ((?.), (-.), (||.)) import Database.Esqueleto.PostgreSQL.JSON hiding ((?.), (-.), (||.))
import qualified Database.Esqueleto.PostgreSQL.JSON as JSON import qualified Database.Esqueleto.PostgreSQL.JSON as JSON
import Database.Persist.Postgresql (withPostgresqlConn) import Database.Persist.Postgresql (withPostgresqlConn)
import Database.PostgreSQL.Simple (SqlError(..)) import Database.PostgreSQL.Simple (SqlError(..), ExecStatus(..))
import System.Environment import System.Environment
import Test.Hspec import Test.Hspec
@ -949,6 +950,20 @@ testHashMinusOperator =
where_ $ v @>. jsonbVal (object []) where_ $ v @>. jsonbVal (object [])
where_ $ f v where_ $ f v
testInsertUniqueViolation :: Spec
testInsertUniqueViolation =
describe "Unique Violation on Insert" $
it "Unique throws exception" $ run (do
u1k <- insert u1
u2k <- insert u2
insert u3) `shouldThrow` (==) exception
where
exception = SqlError {
sqlState = "23505",
sqlExecStatus = FatalError,
sqlErrorMsg = "duplicate key value violates unique constraint \"UniqueValue\"",
sqlErrorDetail = "Key (value)=(0) already exists.",
sqlErrorHint = ""}
type JSONValue = Maybe (JSONB A.Value) type JSONValue = Maybe (JSONB A.Value)
@ -1021,6 +1036,7 @@ main = do
testPostgresqlUpdate testPostgresqlUpdate
testPostgresqlCoalesce testPostgresqlCoalesce
testPostgresqlTextFunctions testPostgresqlTextFunctions
testInsertUniqueViolation
describe "PostgreSQL JSON tests" $ do describe "PostgreSQL JSON tests" $ do
-- NOTE: We only clean the table once, so we -- NOTE: We only clean the table once, so we
-- can use its contents across all JSON tests -- can use its contents across all JSON tests
@ -1053,7 +1069,9 @@ run_worker act = withConn $ runSqlConn (migrateIt >> act)
migrateIt :: RunDbMonad m => SqlPersistT (R.ResourceT m) () migrateIt :: RunDbMonad m => SqlPersistT (R.ResourceT m) ()
migrateIt = do migrateIt = do
void $ runMigrationSilent migrateAll void $ runMigrationSilent migrateAll
void $ runMigrationSilent migrateUnique
cleanDB cleanDB
cleanUniques
withConn :: RunDbMonad m => (SqlBackend -> R.ResourceT m a) -> m a withConn :: RunDbMonad m => (SqlBackend -> R.ResourceT m a) -> m a
withConn = withConn =