{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}
module GeneratedColumnTestSQL (specsWith) where

import Database.Persist.TH
import Init

share [mkPersist sqlSettings, mkMigrate "migrate1", mkDeleteCascade sqlSettings] [persistLowerCase|
GenTest sql=gen_test
  fieldOne Text Maybe
  fieldTwo Text Maybe
  fieldThree Text Maybe generated=COALESCE(field_one,field_two)
  deriving Show Eq

MigrateTestV1 sql=gen_migrate_test
  sickness Int
  cromulence Int generated=5
|]

share [mkPersist sqlSettings, mkMigrate "migrate2", mkDeleteCascade sqlSettings] [persistLowerCase|
MigrateTestV2 sql=gen_migrate_test
  sickness Int generated=3
  cromulence Int
|]

specsWith :: Runner SqlBackend m => RunDb SqlBackend m -> Spec
specsWith :: RunDb SqlBackend m -> Spec
specsWith RunDb SqlBackend m
runDB = String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"PersistLiteral field" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"should read a generated column" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ RunDb SqlBackend m
runDB RunDb SqlBackend m -> RunDb SqlBackend m
forall a b. (a -> b) -> a -> b
$ do
        Text -> [PersistValue] -> ReaderT SqlBackend m ()
forall (m :: * -> *) backend.
(MonadIO m, BackendCompatible SqlBackend backend) =>
Text -> [PersistValue] -> ReaderT backend m ()
rawExecute Text
"DROP TABLE IF EXISTS gen_test;" []
        Text -> [PersistValue] -> ReaderT SqlBackend m ()
forall (m :: * -> *) backend.
(MonadIO m, BackendCompatible SqlBackend backend) =>
Text -> [PersistValue] -> ReaderT backend m ()
rawExecute Text
"DROP TABLE IF EXISTS gen_migrate_test;" []
        Migration -> ReaderT SqlBackend m ()
forall (m :: * -> *).
MonadIO m =>
Migration -> ReaderT SqlBackend m ()
runMigration Migration
migrate1

        GenTest -> ReaderT SqlBackend m ()
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
record -> ReaderT backend m ()
insert_ GenTest :: Maybe Text -> Maybe Text -> Maybe Text -> GenTest
GenTest
            { genTestFieldOne :: Maybe Text
genTestFieldOne = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"like, literally this exact string"
            , genTestFieldTwo :: Maybe Text
genTestFieldTwo = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"like, totally some other string"
            , genTestFieldThree :: Maybe Text
genTestFieldThree = Maybe Text
forall a. Maybe a
Nothing
            }
        Just (Entity Key GenTest
_ GenTest{Maybe Text
genTestFieldThree :: Maybe Text
genTestFieldTwo :: Maybe Text
genTestFieldOne :: Maybe Text
genTestFieldThree :: GenTest -> Maybe Text
genTestFieldTwo :: GenTest -> Maybe Text
genTestFieldOne :: GenTest -> Maybe Text
..}) <- [Filter GenTest]
-> [SelectOpt GenTest]
-> ReaderT SqlBackend m (Maybe (Entity GenTest))
forall backend (m :: * -> *) record.
(PersistQueryRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
[Filter record]
-> [SelectOpt record] -> ReaderT backend m (Maybe (Entity record))
selectFirst [] []
        IO () -> ReaderT SqlBackend m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT SqlBackend m ())
-> IO () -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ Maybe Text
genTestFieldThree Maybe Text -> Maybe Text -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"like, literally this exact string"

        Key MigrateTestV1
k1 <- MigrateTestV1 -> ReaderT SqlBackend m (Key MigrateTestV1)
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
record -> ReaderT backend m (Key record)
insert (MigrateTestV1 -> ReaderT SqlBackend m (Key MigrateTestV1))
-> MigrateTestV1 -> ReaderT SqlBackend m (Key MigrateTestV1)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> MigrateTestV1
MigrateTestV1 Int
0 Int
0
        Just (MigrateTestV1 Int
sickness1 Int
cromulence1) <- Key MigrateTestV1 -> ReaderT SqlBackend m (Maybe MigrateTestV1)
forall backend record (m :: * -> *).
(PersistStoreRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
get Key MigrateTestV1
k1
        IO () -> ReaderT SqlBackend m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT SqlBackend m ())
-> IO () -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ Int
sickness1 Int -> Int -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Int
0
        IO () -> ReaderT SqlBackend m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT SqlBackend m ())
-> IO () -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ Int
cromulence1  Int -> Int -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Int
5

    String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"should support adding or removing generation expressions from columns" (IO () -> SpecWith (Arg (IO ())))
-> IO () -> SpecWith (Arg (IO ()))
forall a b. (a -> b) -> a -> b
$ RunDb SqlBackend m
runDB RunDb SqlBackend m -> RunDb SqlBackend m
forall a b. (a -> b) -> a -> b
$ do
        Migration -> ReaderT SqlBackend m ()
forall (m :: * -> *).
MonadIO m =>
Migration -> ReaderT SqlBackend m ()
runMigration Migration
migrate2

        Key MigrateTestV2
k2 <- MigrateTestV2 -> ReaderT SqlBackend m (Key MigrateTestV2)
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
record -> ReaderT backend m (Key record)
insert (MigrateTestV2 -> ReaderT SqlBackend m (Key MigrateTestV2))
-> MigrateTestV2 -> ReaderT SqlBackend m (Key MigrateTestV2)
forall a b. (a -> b) -> a -> b
$ Int -> Int -> MigrateTestV2
MigrateTestV2 Int
0 Int
0
        Just (MigrateTestV2 Int
sickness2 Int
cromulence2) <- Key MigrateTestV2 -> ReaderT SqlBackend m (Maybe MigrateTestV2)
forall backend record (m :: * -> *).
(PersistStoreRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
get Key MigrateTestV2
k2
        IO () -> ReaderT SqlBackend m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT SqlBackend m ())
-> IO () -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ Int
sickness2 Int -> Int -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Int
3
        IO () -> ReaderT SqlBackend m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT SqlBackend m ())
-> IO () -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ Int
cromulence2 Int -> Int -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Int
0