{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE UndecidableInstances #-}
module ForeignKey where
import Init
-- mpsGeneric = False is due to a bug or at least lack of a feature in mkKeyTypeDec TH.hs
share [mkPersist persistSettings { mpsGeneric = False }, mkMigrate "compositeMigrate"] [persistLowerCase|
Parent
name String
Primary name
Child
pname String
Foreign Parent OnDeleteCascade OnUpdateCascade fkparent pname
deriving Show Eq
ParentComposite
name String
lastName String
Primary name lastName
ChildComposite
pname String
plastName String
Foreign ParentComposite OnDeleteCascade fkparent pname plastName
deriving Show Eq
SelfReferenced
name String
pname String
Primary name
Foreign SelfReferenced OnDeleteCascade fkparent pname
deriving Show Eq
|]
specsWith :: (MonadIO m, MonadFail m) => RunDb SqlBackend m -> Spec
specsWith runDb = describe "foreign keys options" $ do
it "delete cascades" $ runDb $ do
kf <- insert $ Parent "A"
kc <- insert $ Child "A"
delete kf
cs <- selectList [] []
let expected = [] :: [Entity Child]
cs @== expected
it "update cascades" $ runDb $ do
kf <- insert $ Parent "A"
kc <- insert $ Child "A"
update kf [ParentName =. "B"]
cs <- selectList [] []
fmap (childPname . entityVal) cs @== ["B"]
it "delete Composite cascades" $ runDb $ do
kf <- insert $ ParentComposite "A" "B"
kc <- insert $ ChildComposite "A" "B"
delete kf
cs <- selectList [] []
let expected = [] :: [Entity ChildComposite]
cs @== expected
it "delete self referenced cascades" $ runDb $ do
kf <- insert $ SelfReferenced "A" "A" -- bootstrap self reference
kc <- insert $ SelfReferenced "B" "A"
delete kf
srs <- selectList [] []
let expected = [] :: [Entity SelfReferenced]
srs @== expected