module MpsNoPrefixTest where

import Init
import PersistentTestModels

specsWith :: MonadIO 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
"mpsNoPrefix" (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
"works" (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
    [Filter NoPrefix2] -> ReaderT SqlBackend m ()
forall backend (m :: * -> *) record.
(PersistQueryWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
[Filter record] -> ReaderT backend m ()
deleteWhere ([] :: [Filter NoPrefix2])
    [Filter NoPrefix1] -> ReaderT SqlBackend m ()
forall backend (m :: * -> *) record.
(PersistQueryWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
[Filter record] -> ReaderT backend m ()
deleteWhere ([] :: [Filter NoPrefix1])
    Key NoPrefix1
np1a <- NoPrefix1 -> ReaderT SqlBackend m (Key NoPrefix1)
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m (Key record)
insert (NoPrefix1 -> ReaderT SqlBackend m (Key NoPrefix1))
-> NoPrefix1 -> ReaderT SqlBackend m (Key NoPrefix1)
forall a b. (a -> b) -> a -> b
$ Int -> NoPrefix1
forall backend. Int -> NoPrefix1Generic backend
NoPrefix1 Int
1
    Key NoPrefix1 -> [Update NoPrefix1] -> ReaderT SqlBackend m ()
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> [Update record] -> ReaderT backend m ()
update Key NoPrefix1
np1a [EntityField NoPrefix1 Int
forall backend typ.
(typ ~ Int) =>
EntityField (NoPrefix1Generic backend) typ
SomeFieldName EntityField NoPrefix1 Int -> Int -> Update NoPrefix1
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Update v
=. Int
2]
    Key NoPrefix1
np1b <- NoPrefix1 -> ReaderT SqlBackend m (Key NoPrefix1)
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m (Key record)
insert (NoPrefix1 -> ReaderT SqlBackend m (Key NoPrefix1))
-> NoPrefix1 -> ReaderT SqlBackend m (Key NoPrefix1)
forall a b. (a -> b) -> a -> b
$ Int -> NoPrefix1
forall backend. Int -> NoPrefix1Generic backend
NoPrefix1 Int
3
    Key NoPrefix2
np2 <- NoPrefix2 -> ReaderT SqlBackend m (Key NoPrefix2)
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m (Key record)
insert (NoPrefix2 -> ReaderT SqlBackend m (Key NoPrefix2))
-> NoPrefix2 -> ReaderT SqlBackend m (Key NoPrefix2)
forall a b. (a -> b) -> a -> b
$ Int -> Key NoPrefix1 -> NoPrefix2
forall backend.
Int -> Key (NoPrefix1Generic backend) -> NoPrefix2Generic backend
NoPrefix2 Int
4 Key NoPrefix1
np1a
    Key NoPrefix2 -> [Update NoPrefix2] -> ReaderT SqlBackend m ()
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> [Update record] -> ReaderT backend m ()
update Key NoPrefix2
np2 [EntityField NoPrefix2 (Key NoPrefix1)
forall backend typ.
(typ ~ Key (NoPrefix1Generic backend)) =>
EntityField (NoPrefix2Generic backend) typ
UnprefixedRef EntityField NoPrefix2 (Key NoPrefix1)
-> Key NoPrefix1 -> Update NoPrefix2
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Update v
=. Key NoPrefix1
np1b, EntityField NoPrefix2 Int
forall backend typ.
(typ ~ Int) =>
EntityField (NoPrefix2Generic backend) typ
SomeOtherFieldName EntityField NoPrefix2 Int -> Int -> Update NoPrefix2
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Update v
=. Int
5]

    Maybe NoPrefix1
mnp1a <- Key NoPrefix1 -> ReaderT SqlBackend m (Maybe NoPrefix1)
forall backend record (m :: * -> *).
(PersistStoreRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
get Key NoPrefix1
np1a
    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 NoPrefix1
mnp1a Maybe NoPrefix1 -> Maybe NoPrefix1 -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= NoPrefix1 -> Maybe NoPrefix1
forall a. a -> Maybe a
Just (Int -> NoPrefix1
forall backend. Int -> NoPrefix1Generic backend
NoPrefix1 Int
2)
    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
$ (NoPrefix1 -> Int) -> Maybe NoPrefix1 -> Maybe Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NoPrefix1 -> Int
forall backend. NoPrefix1Generic backend -> Int
someFieldName Maybe NoPrefix1
mnp1a Maybe Int -> Maybe Int -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2
    Maybe NoPrefix2
mnp2 <- Key NoPrefix2 -> ReaderT SqlBackend m (Maybe NoPrefix2)
forall backend record (m :: * -> *).
(PersistStoreRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
get Key NoPrefix2
np2
    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
$ (NoPrefix2 -> Key NoPrefix1)
-> Maybe NoPrefix2 -> Maybe (Key NoPrefix1)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NoPrefix2 -> Key NoPrefix1
forall backend.
NoPrefix2Generic backend -> Key (NoPrefix1Generic backend)
unprefixedRef Maybe NoPrefix2
mnp2 Maybe (Key NoPrefix1) -> Maybe (Key NoPrefix1) -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Key NoPrefix1 -> Maybe (Key NoPrefix1)
forall a. a -> Maybe a
Just Key NoPrefix1
np1b
    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
$ (NoPrefix2 -> Int) -> Maybe NoPrefix2 -> Maybe Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NoPrefix2 -> Int
forall backend. NoPrefix2Generic backend -> Int
someOtherFieldName Maybe NoPrefix2
mnp2 Maybe Int -> Maybe Int -> IO ()
forall a. (HasCallStack, Eq a, Show a) => a -> a -> IO ()
@?= Int -> Maybe Int
forall a. a -> Maybe a
Just Int
5

    NoPrefixSumGeneric SqlBackend -> ReaderT SqlBackend m ()
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m ()
insert_ (NoPrefixSumGeneric SqlBackend -> ReaderT SqlBackend m ())
-> NoPrefixSumGeneric SqlBackend -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ Int -> NoPrefixSumGeneric SqlBackend
forall backend. Int -> NoPrefixSumGeneric backend
UnprefixedLeftSum Int
5
    NoPrefixSumGeneric SqlBackend -> ReaderT SqlBackend m ()
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m ()
insert_ (NoPrefixSumGeneric SqlBackend -> ReaderT SqlBackend m ())
-> NoPrefixSumGeneric SqlBackend -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ String -> NoPrefixSumGeneric SqlBackend
forall backend. String -> NoPrefixSumGeneric backend
UnprefixedRightSum String
"Hello"

  String -> IO () -> SpecWith (Arg (IO ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"IsSqlKey instance" (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
    let p :: PersonGeneric backend
p = Text -> Int -> Maybe Text -> PersonGeneric backend
forall backend. Text -> Int -> Maybe Text -> PersonGeneric backend
Person Text
"Alice" Int
30 Maybe Text
forall a. Maybe a
Nothing
    key :: Key (PersonGeneric SqlBackend)
key@(PersonKey (SqlBackendKey i)) <- PersonGeneric SqlBackend
-> ReaderT SqlBackend m (Key (PersonGeneric SqlBackend))
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
 PersistRecordBackend record backend, SafeToInsert record) =>
record -> ReaderT backend m (Key record)
insert PersonGeneric SqlBackend
forall backend. PersonGeneric backend
p
    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
$ Key (PersonGeneric SqlBackend) -> Int64
forall record.
ToBackendKey SqlBackend record =>
Key record -> Int64
fromSqlKey Key (PersonGeneric SqlBackend)
key Int64 -> Int64 -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` (Int64
i :: Int64)
    Maybe (PersonGeneric SqlBackend)
mp <- Key (PersonGeneric SqlBackend)
-> ReaderT SqlBackend m (Maybe (PersonGeneric SqlBackend))
forall backend record (m :: * -> *).
(PersistStoreRead backend, MonadIO m,
 PersistRecordBackend record backend) =>
Key record -> ReaderT backend m (Maybe record)
get (Key (PersonGeneric SqlBackend)
 -> ReaderT SqlBackend m (Maybe (PersonGeneric SqlBackend)))
-> Key (PersonGeneric SqlBackend)
-> ReaderT SqlBackend m (Maybe (PersonGeneric SqlBackend))
forall a b. (a -> b) -> a -> b
$ Int64 -> Key (PersonGeneric SqlBackend)
forall record.
ToBackendKey SqlBackend record =>
Int64 -> Key record
toSqlKey Int64
i
    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 (PersonGeneric SqlBackend)
mp Maybe (PersonGeneric SqlBackend)
-> Maybe (PersonGeneric SqlBackend) -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` PersonGeneric SqlBackend -> Maybe (PersonGeneric SqlBackend)
forall a. a -> Maybe a
Just PersonGeneric SqlBackend
forall backend. PersonGeneric backend
p