packages feed

persistent-mtl 0.5.1 → 0.5.2

raw patch · 15 files changed

+1709/−1706 lines, 15 filesdep +skeletestdep −explainable-predicatesdep −tastydep −tasty-autocollectdep ~basedep ~conduitdep ~containersPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: skeletest

Dependencies removed: explainable-predicates, tasty, tasty-autocollect, tasty-golden, tasty-hunit

Dependency ranges changed: base, conduit, containers, esqueleto, exceptions, monad-logger, mtl, persistent, resource-pool, resourcet, text, transformers, unliftio, unliftio-core, unliftio-pool

API changes (from Hackage documentation)

- Database.Persist.Sql.Shim: [$sel:unSqlReadBackend:SqlReadBackend] :: SqlReadBackend -> SqlBackend
- Database.Persist.Sql.Shim: [$sel:unSqlWriteBackend:SqlWriteBackend] :: SqlWriteBackend -> SqlBackend
+ Database.Persist.Sql.Shim: NoAction :: CascadeAction
+ Database.Persist.Sql.Shim: [unSqlReadBackend] :: SqlReadBackend -> SqlBackend
+ Database.Persist.Sql.Shim: [unSqlWriteBackend] :: SqlWriteBackend -> SqlBackend
+ Database.Persist.Sql.Shim: data BackendKey backend;
+ Database.Persist.Sql.Shim: data EntityField record :: Type -> Type;
+ Database.Persist.Sql.Shim: data Key record;
+ Database.Persist.Sql.Shim: data Unique record;
+ Database.Persist.Sql.Shim: getEntitySpan :: EntityDef -> Maybe SourceSpan
+ Database.Persist.Sql.Shim: keyAndEntityFieldsDatabase :: EntityDef -> NonEmpty FieldDef
+ Database.Persist.Sql.Shim: tabulateEntityApply :: (PersistEntity record, Apply f) => (forall a. () => EntityField record a -> f a) -> f (Entity record)
+ Database.Persist.Sql.Shim: type BaseBackend backend;
+ Database.Persist.Sql.Shim: type PersistConfigBackend c :: Type -> Type -> Type -> Type;
+ Database.Persist.Sql.Shim: type PersistConfigPool c;
+ Database.Persist.Sql.Shim: type PersistEntityBackend record;
- Control.Monad.IO.Rerunnable: class (Monad m) => MonadRerunnableIO m
+ Control.Monad.IO.Rerunnable: class Monad m => MonadRerunnableIO (m :: Type -> Type)
- Control.Monad.Trans.Rerunnable: class MonadRerunnableTrans t
+ Control.Monad.Trans.Rerunnable: class MonadRerunnableTrans (t :: Type -> Type -> Type -> Type)
- Database.Persist.Monad: SqlQueryT :: ReaderT SqlQueryEnv m a -> SqlQueryT m a
+ Database.Persist.Monad: SqlQueryT :: ReaderT SqlQueryEnv m a -> SqlQueryT (m :: Type -> Type) a
- Database.Persist.Monad: [unSqlQueryT] :: SqlQueryT m a -> ReaderT SqlQueryEnv m a
+ Database.Persist.Monad: [unSqlQueryT] :: SqlQueryT (m :: Type -> Type) a -> ReaderT SqlQueryEnv m a
- Database.Persist.Monad: catchSqlTransaction :: (MonadUnliftIO m, Exception e) => SqlTransaction m a -> (e -> SqlTransaction m a) -> SqlTransaction m a
+ Database.Persist.Monad: catchSqlTransaction :: forall (m :: Type -> Type) e a. (MonadUnliftIO m, Exception e) => SqlTransaction m a -> (e -> SqlTransaction m a) -> SqlTransaction m a
- Database.Persist.Monad: class (Monad m, MonadSqlQuery (TransactionM m)) => MonadSqlQuery m
+ Database.Persist.Monad: class (Monad m, MonadSqlQuery TransactionM m) => MonadSqlQuery (m :: Type -> Type)
- Database.Persist.Monad: data SqlTransaction m a
+ Database.Persist.Monad: data SqlTransaction (m :: Type -> Type) a
- Database.Persist.Monad: getSqlBackendPool :: Monad m => SqlQueryT m (Pool SqlBackend)
+ Database.Persist.Monad: getSqlBackendPool :: forall (m :: Type -> Type). Monad m => SqlQueryT m (Pool SqlBackend)
- Database.Persist.Monad: newtype SqlQueryT m a
+ Database.Persist.Monad: newtype SqlQueryT (m :: Type -> Type) a
- Database.Persist.Monad.Class: class (Monad m, MonadSqlQuery (TransactionM m)) => MonadSqlQuery m where {
+ Database.Persist.Monad.Class: class (Monad m, MonadSqlQuery TransactionM m) => MonadSqlQuery (m :: Type -> Type) where {
- Database.Persist.Monad.Class: type TransactionM m :: Type -> Type;
+ Database.Persist.Monad.Class: type TransactionM (m :: Type -> Type) :: Type -> Type;
- Database.Persist.Monad.Internal.SqlTransaction: UnsafeSqlTransaction :: ReaderT SqlTransactionEnv m a -> SqlTransaction m a
+ Database.Persist.Monad.Internal.SqlTransaction: UnsafeSqlTransaction :: ReaderT SqlTransactionEnv m a -> SqlTransaction (m :: Type -> Type) a
- Database.Persist.Monad.Internal.SqlTransaction: [unSqlTransaction] :: SqlTransaction m a -> ReaderT SqlTransactionEnv m a
+ Database.Persist.Monad.Internal.SqlTransaction: [unSqlTransaction] :: SqlTransaction (m :: Type -> Type) a -> ReaderT SqlTransactionEnv m a
- Database.Persist.Monad.Internal.SqlTransaction: catchSqlTransaction :: (MonadUnliftIO m, Exception e) => SqlTransaction m a -> (e -> SqlTransaction m a) -> SqlTransaction m a
+ Database.Persist.Monad.Internal.SqlTransaction: catchSqlTransaction :: forall (m :: Type -> Type) e a. (MonadUnliftIO m, Exception e) => SqlTransaction m a -> (e -> SqlTransaction m a) -> SqlTransaction m a
- Database.Persist.Monad.Internal.SqlTransaction: newtype SqlTransaction m a
+ Database.Persist.Monad.Internal.SqlTransaction: newtype SqlTransaction (m :: Type -> Type) a
- Database.Persist.Monad.Shim: rawQuery :: (MonadResource m, MonadSqlQuery m) => Text -> [PersistValue] -> ConduitM () [PersistValue] m ()
+ Database.Persist.Monad.Shim: rawQuery :: forall (m :: Type -> Type). (MonadResource m, MonadSqlQuery m) => Text -> [PersistValue] -> ConduitM () [PersistValue] m ()
- Database.Persist.Monad.Shim: rawQueryRes :: (MonadIO m2, MonadSqlQuery m) => Text -> [PersistValue] -> m (Acquire (ConduitM () [PersistValue] m2 ()))
+ Database.Persist.Monad.Shim: rawQueryRes :: forall (m2 :: Type -> Type) m. (MonadIO m2, MonadSqlQuery m) => Text -> [PersistValue] -> m (Acquire (ConduitM () [PersistValue] m2 ()))
- Database.Persist.Monad.Shim: selectKeys :: (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Key record) m ()
+ Database.Persist.Monad.Shim: selectKeys :: forall record (m :: Type -> Type). (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Key record) m ()
- Database.Persist.Monad.Shim: selectKeysRes :: (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Key record) m2 ()))
+ Database.Persist.Monad.Shim: selectKeysRes :: forall (m2 :: Type -> Type) record m. (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Key record) m2 ()))
- Database.Persist.Monad.Shim: selectSource :: (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Entity record) m ()
+ Database.Persist.Monad.Shim: selectSource :: forall record (m :: Type -> Type). (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Entity record) m ()
- Database.Persist.Monad.Shim: selectSourceRes :: (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Entity record) m2 ()))
+ Database.Persist.Monad.Shim: selectSourceRes :: forall (m2 :: Type -> Type) record m. (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Entity record) m2 ()))
- Database.Persist.Monad.Shim: unsafeLiftSql :: MonadSqlQuery m => Text -> (forall m2. MonadIO m2 => SqlPersistT m2 a) -> m a
+ Database.Persist.Monad.Shim: unsafeLiftSql :: MonadSqlQuery m => Text -> (forall (m2 :: Type -> Type). MonadIO m2 => SqlPersistT m2 a) -> m a
- Database.Persist.Monad.SqlQueryRep: [BelongsToJust] :: (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Key record2) -> record1 -> SqlQueryRep (record1, record2) record2
+ Database.Persist.Monad.SqlQueryRep: [BelongsToJust] :: forall record1 a. (PersistEntity record1, PersistRecordBackend a SqlBackend) => (record1 -> Key a) -> record1 -> SqlQueryRep (record1, a) a
- Database.Persist.Monad.SqlQueryRep: [BelongsTo] :: (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Maybe (Key record2)) -> record1 -> SqlQueryRep (record1, record2) (Maybe record2)
+ Database.Persist.Monad.SqlQueryRep: [BelongsTo] :: forall record1 record2. (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Maybe (Key record2)) -> record1 -> SqlQueryRep (record1, record2) (Maybe record2)
- Database.Persist.Monad.SqlQueryRep: [CheckUniqueUpdateable] :: PersistRecordBackend record SqlBackend => Entity record -> SqlQueryRep record (Maybe (Unique record))
+ Database.Persist.Monad.SqlQueryRep: [CheckUniqueUpdateable] :: forall record. PersistRecordBackend record SqlBackend => Entity record -> SqlQueryRep record (Maybe (Unique record))
- Database.Persist.Monad.SqlQueryRep: [CheckUnique] :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Unique record))
+ Database.Persist.Monad.SqlQueryRep: [CheckUnique] :: forall record. PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Unique record))
- Database.Persist.Monad.SqlQueryRep: [Count] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int
+ Database.Persist.Monad.SqlQueryRep: [Count] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int
- Database.Persist.Monad.SqlQueryRep: [DeleteBy] :: PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [DeleteBy] :: forall record. PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [DeleteWhereCount] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int64
+ Database.Persist.Monad.SqlQueryRep: [DeleteWhereCount] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int64
- Database.Persist.Monad.SqlQueryRep: [DeleteWhere] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [DeleteWhere] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [Delete] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [Delete] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [Exists] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Bool
+ Database.Persist.Monad.SqlQueryRep: [Exists] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Bool
- Database.Persist.Monad.SqlQueryRep: [GetByValue] :: (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record) => record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.SqlQueryRep: [GetByValue] :: forall record. (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record) => record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.SqlQueryRep: [GetBy] :: PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.SqlQueryRep: [GetBy] :: forall record. PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.SqlQueryRep: [GetEntity] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.SqlQueryRep: [GetEntity] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.SqlQueryRep: [GetFieldName] :: PersistRecordBackend record SqlBackend => EntityField record typ -> SqlQueryRep record Text
+ Database.Persist.Monad.SqlQueryRep: [GetFieldName] :: forall record typ. PersistRecordBackend record SqlBackend => EntityField record typ -> SqlQueryRep record Text
- Database.Persist.Monad.SqlQueryRep: [GetJustEntity] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.SqlQueryRep: [GetJustEntity] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.SqlQueryRep: [GetJust] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record record
+ Database.Persist.Monad.SqlQueryRep: [GetJust] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record record
- Database.Persist.Monad.SqlQueryRep: [GetMany] :: PersistRecordBackend record SqlBackend => [Key record] -> SqlQueryRep record (Map (Key record) record)
+ Database.Persist.Monad.SqlQueryRep: [GetMany] :: forall record. PersistRecordBackend record SqlBackend => [Key record] -> SqlQueryRep record (Map (Key record) record)
- Database.Persist.Monad.SqlQueryRep: [GetTableName] :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record Text
+ Database.Persist.Monad.SqlQueryRep: [GetTableName] :: forall record. PersistRecordBackend record SqlBackend => record -> SqlQueryRep record Text
- Database.Persist.Monad.SqlQueryRep: [Get] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe record)
+ Database.Persist.Monad.SqlQueryRep: [Get] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe record)
- Database.Persist.Monad.SqlQueryRep: [InsertBy] :: (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record, SafeToInsert record) => record -> SqlQueryRep record (Either (Entity record) (Key record))
+ Database.Persist.Monad.SqlQueryRep: [InsertBy] :: forall record. (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record, SafeToInsert record) => record -> SqlQueryRep record (Either (Entity record) (Key record))
- Database.Persist.Monad.SqlQueryRep: [InsertEntityMany] :: PersistRecordBackend record SqlBackend => [Entity record] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [InsertEntityMany] :: forall record. PersistRecordBackend record SqlBackend => [Entity record] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [InsertEntity] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.SqlQueryRep: [InsertEntity] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.SqlQueryRep: [InsertKey] :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [InsertKey] :: forall record. PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [InsertMany] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record [Key record]
+ Database.Persist.Monad.SqlQueryRep: [InsertMany] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record [Key record]
- Database.Persist.Monad.SqlQueryRep: [InsertMany_] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [InsertMany_] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [InsertRecord] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record record
+ Database.Persist.Monad.SqlQueryRep: [InsertRecord] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record record
- Database.Persist.Monad.SqlQueryRep: [InsertUniqueEntity] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.SqlQueryRep: [InsertUniqueEntity] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.SqlQueryRep: [InsertUnique] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Key record))
+ Database.Persist.Monad.SqlQueryRep: [InsertUnique] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Key record))
- Database.Persist.Monad.SqlQueryRep: [Insert] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Key record)
+ Database.Persist.Monad.SqlQueryRep: [Insert] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Key record)
- Database.Persist.Monad.SqlQueryRep: [Insert_] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [Insert_] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [OnlyUnique] :: (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record) => record -> SqlQueryRep record (Unique record)
+ Database.Persist.Monad.SqlQueryRep: [OnlyUnique] :: forall record. (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record) => record -> SqlQueryRep record (Unique record)
- Database.Persist.Monad.SqlQueryRep: [ParseMigration'] :: HasCallStack => Migration -> SqlQueryRep Void CautiousMigration
+ Database.Persist.Monad.SqlQueryRep: [ParseMigration'] :: HasCallStack => Migration -> SqlQueryRep Void [(Bool, Sql)]
- Database.Persist.Monad.SqlQueryRep: [PutMany] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [PutMany] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [RawExecuteCount] :: () => Text -> [PersistValue] -> SqlQueryRep Void Int64
+ Database.Persist.Monad.SqlQueryRep: [RawExecuteCount] :: Text -> [PersistValue] -> SqlQueryRep Void Int64
- Database.Persist.Monad.SqlQueryRep: [RawExecute] :: () => Text -> [PersistValue] -> SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [RawExecute] :: Text -> [PersistValue] -> SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [RawQueryRes] :: MonadIO m2 => Text -> [PersistValue] -> SqlQueryRep Void (Acquire (ConduitM () [PersistValue] m2 ()))
+ Database.Persist.Monad.SqlQueryRep: [RawQueryRes] :: forall (m2 :: Type -> Type). MonadIO m2 => Text -> [PersistValue] -> SqlQueryRep Void (Acquire (ConduitM () [PersistValue] m2 ()))
- Database.Persist.Monad.SqlQueryRep: [RawSql] :: RawSql a => Text -> [PersistValue] -> SqlQueryRep Void [a]
+ Database.Persist.Monad.SqlQueryRep: [RawSql] :: forall a1. RawSql a1 => Text -> [PersistValue] -> SqlQueryRep Void [a1]
- Database.Persist.Monad.SqlQueryRep: [ReplaceUnique] :: (PersistRecordBackend record SqlBackend, Eq (Unique record), Eq record) => Key record -> record -> SqlQueryRep record (Maybe (Unique record))
+ Database.Persist.Monad.SqlQueryRep: [ReplaceUnique] :: forall record. (PersistRecordBackend record SqlBackend, Eq (Unique record), Eq record) => Key record -> record -> SqlQueryRep record (Maybe (Unique record))
- Database.Persist.Monad.SqlQueryRep: [Replace] :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [Replace] :: forall record. PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [RepsertMany] :: PersistRecordBackend record SqlBackend => [(Key record, record)] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [RepsertMany] :: forall record. PersistRecordBackend record SqlBackend => [(Key record, record)] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [Repsert] :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [Repsert] :: forall record. PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [RunMigrationQuiet] :: () => Migration -> SqlQueryRep Void [Text]
+ Database.Persist.Monad.SqlQueryRep: [RunMigrationQuiet] :: Migration -> SqlQueryRep Void [Text]
- Database.Persist.Monad.SqlQueryRep: [RunMigrationSilent] :: () => Migration -> SqlQueryRep Void [Text]
+ Database.Persist.Monad.SqlQueryRep: [RunMigrationSilent] :: Migration -> SqlQueryRep Void [Text]
- Database.Persist.Monad.SqlQueryRep: [RunMigrationUnsafe] :: () => Migration -> SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [RunMigrationUnsafe] :: Migration -> SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [RunMigration] :: () => Migration -> SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [RunMigration] :: Migration -> SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [SelectFirst] :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.SqlQueryRep: [SelectFirst] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.SqlQueryRep: [SelectKeysList] :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Key record]
+ Database.Persist.Monad.SqlQueryRep: [SelectKeysList] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Key record]
- Database.Persist.Monad.SqlQueryRep: [SelectKeysRes] :: (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Key record) m2 ()))
+ Database.Persist.Monad.SqlQueryRep: [SelectKeysRes] :: forall (m2 :: Type -> Type) record. (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Key record) m2 ()))
- Database.Persist.Monad.SqlQueryRep: [SelectList] :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Entity record]
+ Database.Persist.Monad.SqlQueryRep: [SelectList] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Entity record]
- Database.Persist.Monad.SqlQueryRep: [SelectSourceRes] :: (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Entity record) m2 ()))
+ Database.Persist.Monad.SqlQueryRep: [SelectSourceRes] :: forall (m2 :: Type -> Type) record. (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Entity record) m2 ()))
- Database.Persist.Monad.SqlQueryRep: [TransactionSaveWithIsolation] :: () => IsolationLevel -> SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [TransactionSaveWithIsolation] :: IsolationLevel -> SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [TransactionSave] :: () => SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [TransactionSave] :: SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [TransactionUndoWithIsolation] :: () => IsolationLevel -> SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [TransactionUndoWithIsolation] :: IsolationLevel -> SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [TransactionUndo] :: () => SqlQueryRep Void ()
+ Database.Persist.Monad.SqlQueryRep: [TransactionUndo] :: SqlQueryRep Void ()
- Database.Persist.Monad.SqlQueryRep: [UnsafeLiftSql] :: Text -> (forall m. MonadIO m => SqlPersistT m a) -> SqlQueryRep Void a
+ Database.Persist.Monad.SqlQueryRep: [UnsafeLiftSql] :: forall a. Text -> (forall (m :: Type -> Type). MonadIO m => SqlPersistT m a) -> SqlQueryRep Void a
- Database.Persist.Monad.SqlQueryRep: [UpdateGet] :: PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record record
+ Database.Persist.Monad.SqlQueryRep: [UpdateGet] :: forall record. PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record record
- Database.Persist.Monad.SqlQueryRep: [UpdateWhereCount] :: PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record Int64
+ Database.Persist.Monad.SqlQueryRep: [UpdateWhereCount] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record Int64
- Database.Persist.Monad.SqlQueryRep: [UpdateWhere] :: PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [UpdateWhere] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [Update] :: PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record ()
+ Database.Persist.Monad.SqlQueryRep: [Update] :: forall record. PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record ()
- Database.Persist.Monad.SqlQueryRep: [UpsertBy] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => Unique record -> record -> [Update record] -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.SqlQueryRep: [UpsertBy] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => Unique record -> record -> [Update record] -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.SqlQueryRep: [Upsert] :: (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record, SafeToInsert record) => record -> [Update record] -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.SqlQueryRep: [Upsert] :: forall record. (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record, SafeToInsert record) => record -> [Update record] -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.SqlQueryRep: [WithRawQuery] :: () => Text -> [PersistValue] -> ConduitM [PersistValue] Void IO a -> SqlQueryRep Void a
+ Database.Persist.Monad.SqlQueryRep: [WithRawQuery] :: forall a. Text -> [PersistValue] -> ConduitM [PersistValue] Void IO a -> SqlQueryRep Void a
- Database.Persist.Monad.SqlQueryRep: runSqlQueryRep :: MonadUnliftIO m => SqlQueryRep record a -> SqlPersistT m a
+ Database.Persist.Monad.SqlQueryRep: runSqlQueryRep :: forall (m :: Type -> Type) record a. MonadUnliftIO m => SqlQueryRep record a -> SqlPersistT m a
- Database.Persist.Monad.TestUtils: [BelongsToJust] :: (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Key record2) -> record1 -> SqlQueryRep (record1, record2) record2
+ Database.Persist.Monad.TestUtils: [BelongsToJust] :: forall record1 a. (PersistEntity record1, PersistRecordBackend a SqlBackend) => (record1 -> Key a) -> record1 -> SqlQueryRep (record1, a) a
- Database.Persist.Monad.TestUtils: [BelongsTo] :: (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Maybe (Key record2)) -> record1 -> SqlQueryRep (record1, record2) (Maybe record2)
+ Database.Persist.Monad.TestUtils: [BelongsTo] :: forall record1 record2. (PersistEntity record1, PersistRecordBackend record2 SqlBackend) => (record1 -> Maybe (Key record2)) -> record1 -> SqlQueryRep (record1, record2) (Maybe record2)
- Database.Persist.Monad.TestUtils: [CheckUniqueUpdateable] :: PersistRecordBackend record SqlBackend => Entity record -> SqlQueryRep record (Maybe (Unique record))
+ Database.Persist.Monad.TestUtils: [CheckUniqueUpdateable] :: forall record. PersistRecordBackend record SqlBackend => Entity record -> SqlQueryRep record (Maybe (Unique record))
- Database.Persist.Monad.TestUtils: [CheckUnique] :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Unique record))
+ Database.Persist.Monad.TestUtils: [CheckUnique] :: forall record. PersistRecordBackend record SqlBackend => record -> SqlQueryRep record (Maybe (Unique record))
- Database.Persist.Monad.TestUtils: [Count] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int
+ Database.Persist.Monad.TestUtils: [Count] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int
- Database.Persist.Monad.TestUtils: [DeleteBy] :: PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [DeleteBy] :: forall record. PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [DeleteWhereCount] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int64
+ Database.Persist.Monad.TestUtils: [DeleteWhereCount] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Int64
- Database.Persist.Monad.TestUtils: [DeleteWhere] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [DeleteWhere] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [Delete] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [Delete] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [Exists] :: PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Bool
+ Database.Persist.Monad.TestUtils: [Exists] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> SqlQueryRep record Bool
- Database.Persist.Monad.TestUtils: [GetByValue] :: (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record) => record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.TestUtils: [GetByValue] :: forall record. (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record) => record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.TestUtils: [GetBy] :: PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.TestUtils: [GetBy] :: forall record. PersistRecordBackend record SqlBackend => Unique record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.TestUtils: [GetEntity] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.TestUtils: [GetEntity] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.TestUtils: [GetFieldName] :: PersistRecordBackend record SqlBackend => EntityField record typ -> SqlQueryRep record Text
+ Database.Persist.Monad.TestUtils: [GetFieldName] :: forall record typ. PersistRecordBackend record SqlBackend => EntityField record typ -> SqlQueryRep record Text
- Database.Persist.Monad.TestUtils: [GetJustEntity] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.TestUtils: [GetJustEntity] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.TestUtils: [GetJust] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record record
+ Database.Persist.Monad.TestUtils: [GetJust] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record record
- Database.Persist.Monad.TestUtils: [GetMany] :: PersistRecordBackend record SqlBackend => [Key record] -> SqlQueryRep record (Map (Key record) record)
+ Database.Persist.Monad.TestUtils: [GetMany] :: forall record. PersistRecordBackend record SqlBackend => [Key record] -> SqlQueryRep record (Map (Key record) record)
- Database.Persist.Monad.TestUtils: [GetTableName] :: PersistRecordBackend record SqlBackend => record -> SqlQueryRep record Text
+ Database.Persist.Monad.TestUtils: [GetTableName] :: forall record. PersistRecordBackend record SqlBackend => record -> SqlQueryRep record Text
- Database.Persist.Monad.TestUtils: [Get] :: PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe record)
+ Database.Persist.Monad.TestUtils: [Get] :: forall record. PersistRecordBackend record SqlBackend => Key record -> SqlQueryRep record (Maybe record)
- Database.Persist.Monad.TestUtils: [InsertBy] :: (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record, SafeToInsert record) => record -> SqlQueryRep record (Either (Entity record) (Key record))
+ Database.Persist.Monad.TestUtils: [InsertBy] :: forall record. (PersistRecordBackend record SqlBackend, AtLeastOneUniqueKey record, SafeToInsert record) => record -> SqlQueryRep record (Either (Entity record) (Key record))
- Database.Persist.Monad.TestUtils: [InsertEntityMany] :: PersistRecordBackend record SqlBackend => [Entity record] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [InsertEntityMany] :: forall record. PersistRecordBackend record SqlBackend => [Entity record] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [InsertEntity] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.TestUtils: [InsertEntity] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.TestUtils: [InsertKey] :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [InsertKey] :: forall record. PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [InsertMany] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record [Key record]
+ Database.Persist.Monad.TestUtils: [InsertMany] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record [Key record]
- Database.Persist.Monad.TestUtils: [InsertMany_] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [InsertMany_] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [InsertRecord] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record record
+ Database.Persist.Monad.TestUtils: [InsertRecord] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record record
- Database.Persist.Monad.TestUtils: [InsertUniqueEntity] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.TestUtils: [InsertUniqueEntity] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.TestUtils: [InsertUnique] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Key record))
+ Database.Persist.Monad.TestUtils: [InsertUnique] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Maybe (Key record))
- Database.Persist.Monad.TestUtils: [Insert] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Key record)
+ Database.Persist.Monad.TestUtils: [Insert] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record (Key record)
- Database.Persist.Monad.TestUtils: [Insert_] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [Insert_] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => record -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [OnlyUnique] :: (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record) => record -> SqlQueryRep record (Unique record)
+ Database.Persist.Monad.TestUtils: [OnlyUnique] :: forall record. (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record) => record -> SqlQueryRep record (Unique record)
- Database.Persist.Monad.TestUtils: [ParseMigration'] :: HasCallStack => Migration -> SqlQueryRep Void CautiousMigration
+ Database.Persist.Monad.TestUtils: [ParseMigration'] :: HasCallStack => Migration -> SqlQueryRep Void [(Bool, Sql)]
- Database.Persist.Monad.TestUtils: [PutMany] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [PutMany] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => [record] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [RawExecuteCount] :: () => Text -> [PersistValue] -> SqlQueryRep Void Int64
+ Database.Persist.Monad.TestUtils: [RawExecuteCount] :: Text -> [PersistValue] -> SqlQueryRep Void Int64
- Database.Persist.Monad.TestUtils: [RawExecute] :: () => Text -> [PersistValue] -> SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [RawExecute] :: Text -> [PersistValue] -> SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [RawQueryRes] :: MonadIO m2 => Text -> [PersistValue] -> SqlQueryRep Void (Acquire (ConduitM () [PersistValue] m2 ()))
+ Database.Persist.Monad.TestUtils: [RawQueryRes] :: forall (m2 :: Type -> Type). MonadIO m2 => Text -> [PersistValue] -> SqlQueryRep Void (Acquire (ConduitM () [PersistValue] m2 ()))
- Database.Persist.Monad.TestUtils: [RawSql] :: RawSql a => Text -> [PersistValue] -> SqlQueryRep Void [a]
+ Database.Persist.Monad.TestUtils: [RawSql] :: forall a1. RawSql a1 => Text -> [PersistValue] -> SqlQueryRep Void [a1]
- Database.Persist.Monad.TestUtils: [ReplaceUnique] :: (PersistRecordBackend record SqlBackend, Eq (Unique record), Eq record) => Key record -> record -> SqlQueryRep record (Maybe (Unique record))
+ Database.Persist.Monad.TestUtils: [ReplaceUnique] :: forall record. (PersistRecordBackend record SqlBackend, Eq (Unique record), Eq record) => Key record -> record -> SqlQueryRep record (Maybe (Unique record))
- Database.Persist.Monad.TestUtils: [Replace] :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [Replace] :: forall record. PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [RepsertMany] :: PersistRecordBackend record SqlBackend => [(Key record, record)] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [RepsertMany] :: forall record. PersistRecordBackend record SqlBackend => [(Key record, record)] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [Repsert] :: PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [Repsert] :: forall record. PersistRecordBackend record SqlBackend => Key record -> record -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [RunMigrationQuiet] :: () => Migration -> SqlQueryRep Void [Text]
+ Database.Persist.Monad.TestUtils: [RunMigrationQuiet] :: Migration -> SqlQueryRep Void [Text]
- Database.Persist.Monad.TestUtils: [RunMigrationSilent] :: () => Migration -> SqlQueryRep Void [Text]
+ Database.Persist.Monad.TestUtils: [RunMigrationSilent] :: Migration -> SqlQueryRep Void [Text]
- Database.Persist.Monad.TestUtils: [RunMigrationUnsafe] :: () => Migration -> SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [RunMigrationUnsafe] :: Migration -> SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [RunMigration] :: () => Migration -> SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [RunMigration] :: Migration -> SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [SelectFirst] :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Maybe (Entity record))
+ Database.Persist.Monad.TestUtils: [SelectFirst] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Maybe (Entity record))
- Database.Persist.Monad.TestUtils: [SelectKeysList] :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Key record]
+ Database.Persist.Monad.TestUtils: [SelectKeysList] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Key record]
- Database.Persist.Monad.TestUtils: [SelectKeysRes] :: (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Key record) m2 ()))
+ Database.Persist.Monad.TestUtils: [SelectKeysRes] :: forall (m2 :: Type -> Type) record. (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Key record) m2 ()))
- Database.Persist.Monad.TestUtils: [SelectList] :: PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Entity record]
+ Database.Persist.Monad.TestUtils: [SelectList] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [SelectOpt record] -> SqlQueryRep record [Entity record]
- Database.Persist.Monad.TestUtils: [SelectSourceRes] :: (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Entity record) m2 ()))
+ Database.Persist.Monad.TestUtils: [SelectSourceRes] :: forall (m2 :: Type -> Type) record. (MonadIO m2, PersistRecordBackend record SqlBackend) => [Filter record] -> [SelectOpt record] -> SqlQueryRep record (Acquire (ConduitM () (Entity record) m2 ()))
- Database.Persist.Monad.TestUtils: [TransactionSaveWithIsolation] :: () => IsolationLevel -> SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [TransactionSaveWithIsolation] :: IsolationLevel -> SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [TransactionSave] :: () => SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [TransactionSave] :: SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [TransactionUndoWithIsolation] :: () => IsolationLevel -> SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [TransactionUndoWithIsolation] :: IsolationLevel -> SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [TransactionUndo] :: () => SqlQueryRep Void ()
+ Database.Persist.Monad.TestUtils: [TransactionUndo] :: SqlQueryRep Void ()
- Database.Persist.Monad.TestUtils: [UnsafeLiftSql] :: Text -> (forall m. MonadIO m => SqlPersistT m a) -> SqlQueryRep Void a
+ Database.Persist.Monad.TestUtils: [UnsafeLiftSql] :: forall a. Text -> (forall (m :: Type -> Type). MonadIO m => SqlPersistT m a) -> SqlQueryRep Void a
- Database.Persist.Monad.TestUtils: [UpdateGet] :: PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record record
+ Database.Persist.Monad.TestUtils: [UpdateGet] :: forall record. PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record record
- Database.Persist.Monad.TestUtils: [UpdateWhereCount] :: PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record Int64
+ Database.Persist.Monad.TestUtils: [UpdateWhereCount] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record Int64
- Database.Persist.Monad.TestUtils: [UpdateWhere] :: PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [UpdateWhere] :: forall record. PersistRecordBackend record SqlBackend => [Filter record] -> [Update record] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [Update] :: PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record ()
+ Database.Persist.Monad.TestUtils: [Update] :: forall record. PersistRecordBackend record SqlBackend => Key record -> [Update record] -> SqlQueryRep record ()
- Database.Persist.Monad.TestUtils: [UpsertBy] :: (PersistRecordBackend record SqlBackend, SafeToInsert record) => Unique record -> record -> [Update record] -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.TestUtils: [UpsertBy] :: forall record. (PersistRecordBackend record SqlBackend, SafeToInsert record) => Unique record -> record -> [Update record] -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.TestUtils: [Upsert] :: (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record, SafeToInsert record) => record -> [Update record] -> SqlQueryRep record (Entity record)
+ Database.Persist.Monad.TestUtils: [Upsert] :: forall record. (PersistRecordBackend record SqlBackend, OnlyOneUniqueKey record, SafeToInsert record) => record -> [Update record] -> SqlQueryRep record (Entity record)
- Database.Persist.Monad.TestUtils: [WithRawQuery] :: () => Text -> [PersistValue] -> ConduitM [PersistValue] Void IO a -> SqlQueryRep Void a
+ Database.Persist.Monad.TestUtils: [WithRawQuery] :: forall a. Text -> [PersistValue] -> ConduitM [PersistValue] Void IO a -> SqlQueryRep Void a
- Database.Persist.Monad.TestUtils: data MockSqlQueryT m a
+ Database.Persist.Monad.TestUtils: data MockSqlQueryT (m :: Type -> Type) a
- Database.Persist.Monad.TestUtils: mockSelectKeys :: forall record. Typeable record => ([Filter record] -> [SelectOpt record] -> Maybe [Key record]) -> MockQuery
+ Database.Persist.Monad.TestUtils: mockSelectKeys :: Typeable record => ([Filter record] -> [SelectOpt record] -> Maybe [Key record]) -> MockQuery
- Database.Persist.Monad.TestUtils: mockSelectSource :: forall record. Typeable record => ([Filter record] -> [SelectOpt record] -> Maybe [Entity record]) -> MockQuery
+ Database.Persist.Monad.TestUtils: mockSelectSource :: Typeable record => ([Filter record] -> [SelectOpt record] -> Maybe [Entity record]) -> MockQuery
- Database.Persist.Monad.TestUtils: withRecord :: forall record. Typeable record => (forall a. SqlQueryRep record a -> Maybe a) -> MockQuery
+ Database.Persist.Monad.TestUtils: withRecord :: Typeable record => (forall a. () => SqlQueryRep record a -> Maybe a) -> MockQuery
- Database.Persist.Sql.Shim: data family Unique record;
+ Database.Persist.Sql.Shim: data family BackendKey backend
- Database.Persist.Sql.Shim: infix 4 ==.
+ Database.Persist.Sql.Shim: infix 4 /<-.
- Database.Persist.Sql.Shim: infixr 3 =.
+ Database.Persist.Sql.Shim: infixr 3 /=.
- Database.Persist.Sql.Shim: rawQuery :: (MonadResource m, MonadSqlQuery m) => Text -> [PersistValue] -> ConduitM () [PersistValue] m ()
+ Database.Persist.Sql.Shim: rawQuery :: forall (m :: Type -> Type). (MonadResource m, MonadSqlQuery m) => Text -> [PersistValue] -> ConduitM () [PersistValue] m ()
- Database.Persist.Sql.Shim: rawQueryRes :: (MonadIO m2, MonadSqlQuery m) => Text -> [PersistValue] -> m (Acquire (ConduitM () [PersistValue] m2 ()))
+ Database.Persist.Sql.Shim: rawQueryRes :: forall (m2 :: Type -> Type) m. (MonadIO m2, MonadSqlQuery m) => Text -> [PersistValue] -> m (Acquire (ConduitM () [PersistValue] m2 ()))
- Database.Persist.Sql.Shim: selectKeys :: (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Key record) m ()
+ Database.Persist.Sql.Shim: selectKeys :: forall record (m :: Type -> Type). (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Key record) m ()
- Database.Persist.Sql.Shim: selectKeysRes :: (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Key record) m2 ()))
+ Database.Persist.Sql.Shim: selectKeysRes :: forall (m2 :: Type -> Type) record m. (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Key record) m2 ()))
- Database.Persist.Sql.Shim: selectSource :: (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Entity record) m ()
+ Database.Persist.Sql.Shim: selectSource :: forall record (m :: Type -> Type). (PersistRecordBackend record SqlBackend, MonadResource m, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> ConduitM () (Entity record) m ()
- Database.Persist.Sql.Shim: selectSourceRes :: (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Entity record) m2 ()))
+ Database.Persist.Sql.Shim: selectSourceRes :: forall (m2 :: Type -> Type) record m. (MonadIO m2, PersistRecordBackend record SqlBackend, Typeable record, MonadSqlQuery m) => [Filter record] -> [SelectOpt record] -> m (Acquire (ConduitM () (Entity record) m2 ()))
- Database.Persist.Sql.Shim: type MultipleUniqueKeysError ty = 'Text "The entity " :<>: 'ShowType ty :<>: 'Text " has multiple unique keys." :$$: 'Text "The function you are trying to call requires only a single " :<>: 'Text "unique key." :$$: 'Text "There is probably a variant of the function with 'By' " :<>: 'Text "appended that will allow you to select a unique key " :<>: 'Text "for the operation."
+ Database.Persist.Sql.Shim: type MultipleUniqueKeysError ty = 'Text "The entity " ':<>: 'ShowType ty ':<>: 'Text " has multiple unique keys." ':$$: 'Text "The function you are trying to call requires only a single " ':<>: 'Text "unique key." ':$$: 'Text "There is probably a variant of the function with 'By' " ':<>: 'Text "appended that will allow you to select a unique key " ':<>: 'Text "for the operation."
- Database.Persist.Sql.Shim: type NoUniqueKeysError ty = 'Text "The entity " :<>: 'ShowType ty :<>: 'Text " does not have any unique keys." :$$: 'Text "The function you are trying to call requires a unique key " :<>: 'Text "to be defined on the entity."
+ Database.Persist.Sql.Shim: type NoUniqueKeysError ty = 'Text "The entity " ':<>: 'ShowType ty ':<>: 'Text " does not have any unique keys." ':$$: 'Text "The function you are trying to call requires a unique key " ':<>: 'Text "to be defined on the entity."
- Database.Persist.Sql.Shim: type SqlWriteT (m :: Type -> Type) a = forall backend. SqlBackendCanWrite backend => ReaderT backend m a
+ Database.Persist.Sql.Shim: type SqlReadT (m :: Type -> Type) a = forall backend. SqlBackendCanRead backend => ReaderT backend m a
- Database.Persist.Sql.Shim: type family PersistConfigPool c;
+ Database.Persist.Sql.Shim: type family BaseBackend backend
- Database.Persist.Sql.Shim: unsafeLiftSql :: MonadSqlQuery m => Text -> (forall m2. MonadIO m2 => SqlPersistT m2 a) -> m a
+ Database.Persist.Sql.Shim: unsafeLiftSql :: MonadSqlQuery m => Text -> (forall (m2 :: Type -> Type). MonadIO m2 => SqlPersistT m2 a) -> m a

Files

CHANGELOG.md view
@@ -1,3 +1,8 @@+# v0.5.2++* Add GHC 9.10 support+* Drop support for GHC < 9.8+ # v0.5.1  * Add GHC 9.8 support
persistent-mtl.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.36.0.+-- This file has been generated from package.yaml by hpack version 0.37.0. -- -- see: https://github.com/sol/hpack  name:           persistent-mtl-version:        0.5.1+version:        0.5.2 synopsis:       Monad transformer for the persistent API description:    A monad transformer and mtl-style type class for using the                 persistent API directly in your monad transformer stack.@@ -19,8 +19,7 @@ extra-source-files:     CHANGELOG.md     README.md-    test/goldens/persistent-2.13/sqlqueryrep_show_representation.golden-    test/goldens/persistent-2.14/sqlqueryrep_show_representation.golden+    test/__snapshots__/SqlQueryRepSpec.snap.md  source-repository head   type: git@@ -44,20 +43,20 @@       src   ghc-options: -Wall -Wcompat -Wunused-packages   build-depends:-      base >=4.14 && <5-    , conduit <1.4-    , containers <0.7-    , exceptions <0.11-    , monad-logger <0.4-    , mtl <2.4-    , persistent >=2.13 && <2.15-    , resource-pool <1-    , resourcet <1.4-    , text <2.2-    , transformers <0.7-    , unliftio <0.3-    , unliftio-core <0.3-    , unliftio-pool <1+      base <5+    , conduit+    , containers+    , exceptions+    , monad-logger+    , mtl+    , persistent+    , resource-pool+    , resourcet+    , text+    , transformers+    , unliftio+    , unliftio-core+    , unliftio-pool   default-language: Haskell2010   if impl(ghc >= 9.4.0) && impl(ghc < 9.4.3) @@ -69,25 +68,24 @@   other-modules:       Example       Generated-      IntegrationTest-      MockedTest-      READMETest-      SqlQueryRepTest+      IntegrationSpec+      MockedSpec+      READMESpec+      SqlQueryRepSpec       TestUtils.DB       TestUtils.Esqueleto       Paths_persistent_mtl   hs-source-dirs:       test-  ghc-options: -Wall -Wcompat -Wunused-packages -F -pgmF=tasty-autocollect+  ghc-options: -Wall -Wcompat -Wunused-packages -F -pgmF=skeletest-preprocessor   build-tool-depends:-      tasty-autocollect:tasty-autocollect+      skeletest:skeletest-preprocessor   build-depends:       base     , bytestring     , conduit     , containers-    , esqueleto >=3.5-    , explainable-predicates >=0.1.2.0+    , esqueleto >=3.5.14.0     , monad-logger     , persistent     , persistent-mtl@@ -95,10 +93,7 @@     , persistent-sqlite >=2.13.0.3     , resource-pool     , resourcet-    , tasty-    , tasty-autocollect >=0.2.0.0-    , tasty-golden-    , tasty-hunit+    , skeletest >=0.2.1     , text     , unliftio   default-language: Haskell2010
+ test/IntegrationSpec.hs view
@@ -0,0 +1,890 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE TypeFamilies #-}++module IntegrationSpec (spec) where++import Conduit (runConduit, (.|))+import qualified Conduit+import Control.Arrow ((&&&))+import Control.Monad (forM_)+import qualified Data.Acquire as Acquire+import Data.Bifunctor (first)+import qualified Data.Map.Strict as Map+import Data.Text (Text)+import qualified Data.Text as Text+import Data.Typeable (Typeable)+import qualified Database.Esqueleto.Experimental as E+import Database.Persist.Sql (+  Entity (..),+  IsolationLevel (..),+  Migration,+  PersistField,+  PersistRecordBackend,+  PersistValue,+  Single (..),+  SqlBackend,+  fromPersistValue,+  (=.),+  (==.),+ )+import Skeletest+import qualified Skeletest.Predicate as P+import UnliftIO (MonadIO, MonadUnliftIO, liftIO)+import UnliftIO.Exception (+  Exception,+  SomeException,+  StringException (..),+  fromException,+  throwIO,+  throwString,+  try,+ )+import UnliftIO.IORef (atomicModifyIORef, newIORef, readIORef, writeIORef)++import Control.Monad.IO.Rerunnable (MonadRerunnableIO, rerunnableIO)+import Database.Persist.Monad+import Database.Persist.Monad.Internal.PersistentShim (SafeToInsert)+import Example+import TestUtils.DB (BackendType (..), allBackendTypes)+import TestUtils.Esqueleto (esqueletoSelect)++spec :: Spec+spec = do+  forM_ allBackendTypes $ \backendType ->+    describe (show backendType) $ do+      describe "withTransaction" $ do+        it "uses the same transaction" $ do+          -- without transactions, the INSERT shouldn't be rolled back+          resultWithoutTransactions <-+            runTestApp backendType $ do+              catchTestError $ insertAndFail $ person "Alice"+              getPeopleNames+          resultWithoutTransactions `shouldBe` ["Alice"]++          -- with transactions, the INSERT should be rolled back+          resultWithTransactions <-+            runTestApp backendType $ do+              catchTestError $ withTransaction $ insertAndFail $ person "Alice"+              getPeopleNames+          resultWithTransactions `shouldBe` []++        it "retries transactions" $ do+          let retryIf e = case fromException e of+                Just (StringException "retry me" _) -> True+                _ -> False+              setRetry env = env{retryIf, retryLimit = 5}++          counter <- newIORef (0 :: Int)++          (`shouldNotSatisfy` P.throws (P.anything @_ @SomeException)) $+            runTestAppWith backendType setRetry $+              withTransaction $+                rerunnableIO $ do+                  x <- atomicModifyIORef counter $ \x -> (x + 1, x)+                  if x > 2+                    then return ()+                    else throwString "retry me"++        it "throws error when retry hits limit" $ do+          let setRetry env = env{retryIf = const True, retryLimit = 2}++          result <-+            try @_ @TransactionError @() $+              runTestAppWith backendType setRetry $+                withTransaction $+                  rerunnableIO $+                    throwString "retry me"++          result `shouldBe` Left RetryLimitExceeded++        it "runs retryCallback" $ do+          callbackRef <- newIORef Nothing++          let setRetry env =+                env+                  { retryIf = const True+                  , retryLimit = 2+                  , retryCallback = writeIORef callbackRef . Just+                  }+          _ <-+            try @_ @TransactionError @() $+              runTestAppWith backendType setRetry . withTransaction $+                rerunnableIO (throwIO TestError)++          mError <- readIORef callbackRef+          (mError >>= fromException) `shouldBe` Just TestError++      describe "catchSqlTransaction" $ do+        let newCatchRef = do+              wasCaughtRef <- newIORef False+              let markCaught (_ :: SomeException) =+                    rerunnableIO $ writeIORef wasCaughtRef True+                  getWasCaught = readIORef wasCaughtRef+              pure (markCaught, getWasCaught)++        it "catches errors" $ do+          (markCaught, getWasCaught) <- newCatchRef+          runTestApp backendType . withTransaction $+            (`catchSqlTransaction` markCaught) $+              rerunnableIO (throwString "error")+          getWasCaught `shouldSatisfy` P.returns (P.eq True)++        it "does not catch retry errors" $ do+          let retryIf e = case fromException e of+                Just (StringException "retry me" _) -> True+                _ -> False+              setRetry env = env{retryIf, retryLimit = 2}++          (markCaught, getWasCaught) <- newCatchRef+          _ <-+            try @_ @SomeException $+              runTestAppWith backendType setRetry . withTransaction $+                (`catchSqlTransaction` markCaught) $+                  rerunnableIO (throwString "retry me")+          getWasCaught `shouldSatisfy` P.returns (P.eq False)++      -- should compile+      it "can compose operations" $ do+        let onlySql :: (MonadSqlQuery m) => m ()+            onlySql = do+              _ <- getPeople+              return ()++            sqlAndRerunnableIO :: (MonadSqlQuery m, MonadRerunnableIO m) => m ()+            sqlAndRerunnableIO = do+              _ <- getPeopleNames+              _ <- rerunnableIO $ newIORef True+              return ()++            onlyRerunnableIO :: (MonadRerunnableIO m) => m ()+            onlyRerunnableIO = do+              _ <- rerunnableIO $ newIORef True+              return ()++            arbitraryIO :: (MonadIO m) => m ()+            arbitraryIO = do+              _ <- liftIO $ newIORef True+              return ()++        -- everything should compose naturally by default+        runTestApp backendType $ do+          onlySql+          sqlAndRerunnableIO+          onlyRerunnableIO+          arbitraryIO++        -- in a transaction, you can compose everything except arbitrary IO+        runTestApp backendType $ withTransaction $ do+          onlySql+          sqlAndRerunnableIO+          onlyRerunnableIO+          -- uncomment this to get compile error+          -- arbitraryIO+          pure ()++      describe "Persistent API" $ do+        it "get" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            mapM get [1, 2]+          map (fmap personName) result `shouldBe` [Just "Alice", Nothing]++        it "getMany" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            getMany [1]+          personName <$> Map.lookup 1 result `shouldBe` Just "Alice"++        it "getJust" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            getJust 1+          personName result `shouldBe` "Alice"++        it "getJustEntity" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            getJustEntity 1+          getName result `shouldBe` "Alice"++        it "getEntity" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            mapM getEntity [1, 2]+          map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++        it "belongsTo" $ do+          result <- runTestApp backendType $ do+            aliceKey <- insert $ person "Alice"+            let post1 = Post "Post #1" aliceKey (Just aliceKey)+                post2 = Post "Post #2" aliceKey Nothing+            insertMany_ [post1, post2]+            mapM (belongsTo postEditor) [post1, post2]+          map (fmap personName) result `shouldBe` [Just "Alice", Nothing]++        it "belongsToJust" $ do+          result <- runTestApp backendType $ do+            aliceKey <- insert $ person "Alice"+            let post1 = Post "Post #1" aliceKey Nothing+            insert_ post1+            belongsToJust postAuthor post1+          personName result `shouldBe` "Alice"++        it "insert" $ do+          result <- runTestApp backendType $ do+            aliceKey <- insert $ person "Alice"+            people <- getPeopleNames+            return (aliceKey, people)+          result `shouldBe` (1, ["Alice"])++        it "insert_" $ do+          result <- runTestApp backendType $ do+            result <- insert_ $ person "Alice"+            people <- getPeopleNames+            return (result, people)+          result `shouldBe` ((), ["Alice"])++        it "insertMany" $ do+          result <- runTestApp backendType $ do+            keys <- insertMany [person "Alice", person "Bob"]+            people <- getPeopleNames+            return (keys, people)+          result `shouldBe` ([1, 2], ["Alice", "Bob"])++        it "insertMany_" $ do+          result <- runTestApp backendType $ do+            result <- insertMany_ [person "Alice", person "Bob"]+            people <- getPeopleNames+            return (result, people)+          result `shouldBe` ((), ["Alice", "Bob"])++        it "insertEntityMany" $ do+          result <- runTestApp backendType $ do+            result <-+              insertEntityMany+                [ Entity 1 $ person "Alice"+                , Entity 2 $ person "Bob"+                ]+            people <- getPeopleNames+            return (result, people)+          result `shouldBe` ((), ["Alice", "Bob"])++        it "insertKey" $ do+          result <- runTestApp backendType $ do+            result <- insertKey 1 $ person "Alice"+            people <- getPeopleNames+            return (result, people)+          result `shouldBe` ((), ["Alice"])++        it "repsert" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            insert_ alice+            repsert 1 $ alice{personAge = 100}+            repsert 2 $ person "Bob"+            getPeople+          map nameAndAge result+            `shouldBe` [ ("Alice", 100)+                       , ("Bob", 0)+                       ]++        it "repsertMany" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            -- https://github.com/yesodweb/persistent/issues/832+            insert_ alice+            repsertMany+              [ (1, alice{personAge = 100})+              , (2, person "Bob")+              ]+            getPeople+          map nameAndAge result+            `shouldBe` [ ("Alice", 100)+                       , ("Bob", 0)+                       ]++        it "replace" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            insert_ alice+            replace 1 $ alice{personAge = 100}+            getJust 1+          personAge result `shouldBe` 100++        it "delete" $ do+          result <- runTestApp backendType $ do+            aliceKey <- insert $ person "Alice"+            delete aliceKey+            getPeople+          result `shouldBe` []++        it "update" $ do+          result <- runTestApp backendType $ do+            key <- insert $ person "Alice"+            update key [PersonName =. "Alicia"]+            getPeopleNames+          result `shouldBe` ["Alicia"]++        it "updateGet" $ do+          (updateResult, getResult) <- runTestApp backendType $ do+            key <- insert $ person "Alice"+            updateResult <- updateGet key [PersonName =. "Alicia"]+            getResult <- getJust key+            return (updateResult, getResult)+          updateResult `shouldBe` getResult++        it "insertEntity" $ do+          (insertResult, getResult) <- runTestApp backendType $ do+            insertResult <- insertEntity $ person "Alice"+            getResult <- getJust $ entityKey insertResult+            return (insertResult, getResult)+          entityVal insertResult `shouldBe` getResult++        it "insertRecord" $ do+          (insertResult, getResult) <- runTestApp backendType $ do+            insertResult <- insertRecord $ person "Alice"+            getResult <- getJust 1+            return (insertResult, getResult)+          insertResult `shouldBe` getResult++        it "getBy" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            mapM getBy [UniqueName "Alice", UniqueName "Bob"]+          map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++        it "getByValue" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            insert_ alice+            mapM getByValue [alice, person "Bob"]+          map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++        it "checkUnique" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            insert_ alice+            mapM+              checkUnique+              [ alice+              , person "Bob"+              , (person "Alice"){personAge = 100}+              ]+          result `shouldBe` [Just (UniqueName "Alice"), Nothing, Just (UniqueName "Alice")]++        it "checkUniqueUpdateable" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            insert_ alice+            mapM+              checkUniqueUpdateable+              [ Entity 1 alice+              , Entity 2 $ person "Bob"+              , Entity 3 $ (person "Alice"){personAge = 100}+              ]+          result `shouldBe` [Nothing, Nothing, Just (UniqueName "Alice")]++        it "deleteBy" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            deleteBy $ UniqueName "Alice"+            getPeople+          result `shouldBe` []++        it "insertUnique" $ do+          (result1, result2, people) <- runTestApp backendType $ do+            result1 <- insertUnique $ person "Alice"+            result2 <- insertUnique $ person "Alice"+            people <- getPeopleNames+            return (result1, result2, people)+          result1 `shouldBe` Just 1+          result2 `shouldBe` Nothing+          people `shouldBe` ["Alice"]++        it "upsert" $ do+          (result1, result2, people) <- runTestApp backendType $ do+            result1 <- upsert (person "Alice") [PersonAge =. 0]+            result2 <- upsert (person "Alice") [PersonAge =. 100]+            people <- getPeople+            return (result1, result2, people)+          entityKey result1 `shouldBe` entityKey result2+          nameAndAge (entityVal result1) `shouldBe` ("Alice", 0)+          nameAndAge (entityVal result2) `shouldBe` ("Alice", 100)+          map nameAndAge people `shouldBe` [("Alice", 100)]++        it "upsertBy" $ do+          (result1, result2, people) <- runTestApp backendType $ do+            result1 <- upsertBy (UniqueName "Alice") (person "Alice") [PersonAge =. 0]+            result2 <- upsertBy (UniqueName "Alice") (person "Alice") [PersonAge =. 100]+            people <- getPeople+            return (result1, result2, people)+          entityKey result1 `shouldBe` entityKey result2+          nameAndAge (entityVal result1) `shouldBe` ("Alice", 0)+          nameAndAge (entityVal result2) `shouldBe` ("Alice", 100)+          map nameAndAge people `shouldBe` [("Alice", 100)]++        it "putMany" $ do+          result <- runTestApp backendType $ do+            let alice = person "Alice"+            insert_ alice+            putMany+              [ alice{personAge = 100}+              , person "Bob"+              ]+            getPeople+          map nameAndAge result+            `shouldBe` [ ("Alice", 100)+                       , ("Bob", 0)+                       ]++        it "insertBy" $ do+          (result1, result2, people) <- runTestApp backendType $ do+            let alice = person "Alice"+            result1 <- insertBy alice+            result2 <- insertBy $ alice{personAge = 100}+            people <- getPeople+            return (result1, result2, people)+          result1 `shouldBe` Right 1+          first (entityKey &&& getName) result2 `shouldBe` Left (1, "Alice")+          map nameAndAge people `shouldBe` [("Alice", 0)]++        it "insertUniqueEntity" $ do+          (result1, result2, people) <- runTestApp backendType $ do+            let alice = person "Alice"+            result1 <- insertUniqueEntity alice+            result2 <- insertUniqueEntity $ alice{personAge = 100}+            people <- getPeople+            return (result1, result2, people)+          (entityKey &&& getName) <$> result1 `shouldBe` Just (1, "Alice")+          result2 `shouldBe` Nothing+          map nameAndAge people `shouldBe` [("Alice", 0)]++        it "replaceUnique" $ do+          (result1, result2, people) <- runTestApp backendType $ do+            let alice = person "Alice"+                bob = person "Bob"+            insertMany_ [alice, bob]+            result1 <- replaceUnique 1 $ alice{personName = "Bob"}+            result2 <- replaceUnique 2 $ bob{personAge = 100}+            people <- getPeople+            return (result1, result2, people)+          result1 `shouldBe` Just (UniqueName "Bob")+          result2 `shouldBe` Nothing+          map nameAndAge people `shouldBe` [("Alice", 0), ("Bob", 100)]++        it "onlyUnique" $ do+          result <- runTestApp backendType $ onlyUnique $ person "Alice"+          result `shouldBe` UniqueName "Alice"++        it "selectSourceRes" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            acquire <- selectSourceRes [] []+            Acquire.with acquire $ \conduit ->+              runConduit $ conduit .| Conduit.mapC getName .| Conduit.sinkList+          result `shouldBe` ["Alice", "Bob"]++        it "selectFirst" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            sequence+              [ selectFirst [PersonName ==. "Alice"] []+              , selectFirst [PersonName ==. "Bob"] []+              ]+          map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++        it "selectKeysRes" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            acquire <- selectKeysRes @_ @Person [] []+            Acquire.with acquire $ \conduit ->+              runConduit $ conduit .| Conduit.sinkList+          result `shouldBe` [1, 2]++        it "count" $ do+          result <- runTestApp backendType $ do+            insertMany_ $ map (\p -> p{personAge = 100}) [person "Alice", person "Bob"]+            count [PersonAge ==. 100]+          result `shouldBe` 2++        it "exists" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            exists [PersonName ==. "Alice"]+          result `shouldBe` True++        it "selectSource" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            runConduit $ selectSource [] [] .| Conduit.mapC getName .| Conduit.sinkList+          result `shouldBe` ["Alice", "Bob"]++        it "selectKeys" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            runConduit $ selectKeys @Person [] [] .| Conduit.sinkList+          result `shouldBe` [1, 2]++        it "selectList" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            insert_ $ person "Bob"+            selectList [] []+          map getName result `shouldBe` ["Alice", "Bob"]++        it "selectKeysList" $ do+          result <- runTestApp backendType $ do+            insert_ $ person "Alice"+            insert_ $ person "Bob"+            selectKeysList @Person [] []+          result `shouldBe` [1, 2]++        it "updateWhere" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            updateWhere [PersonName ==. "Alice"] [PersonAge =. 100]+            getPeople+          map nameAndAge result `shouldBe` [("Alice", 100), ("Bob", 0)]++        it "deleteWhere" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            deleteWhere [PersonName ==. "Alice"]+            getPeopleNames+          result `shouldBe` ["Bob"]++        it "updateWhereCount" $ do+          (rowsUpdated, people) <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            rowsUpdated <- updateWhereCount [PersonName ==. "Alice"] [PersonAge =. 100]+            people <- getPeople+            return (rowsUpdated, people)+          rowsUpdated `shouldBe` 1+          map nameAndAge people `shouldBe` [("Alice", 100), ("Bob", 0)]++        it "deleteWhereCount" $ do+          (rowsDeleted, names) <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            rowsDeleted <- deleteWhereCount [PersonName ==. "Alice"]+            names <- getPeopleNames+            return (rowsDeleted, names)+          rowsDeleted `shouldBe` 1+          names `shouldBe` ["Bob"]++        it "parseMigration" $ do+          result <- runTestApp backendType $ do+            setupUnsafeMigration+            parseMigration migration++          let sql = case backendType of+                Sqlite ->+                  [ P.eq+                      ( False+                      , Text.concat+                          [ "CREATE TEMP TABLE \"person_backup\"("+                          , "\"id\" INTEGER PRIMARY KEY,"+                          , "\"name\" VARCHAR NOT NULL,"+                          , "\"age\" INTEGER NOT NULL,"+                          , "CONSTRAINT \"unique_name\" UNIQUE (\"name\"))"+                          ]+                      )+                  , P.anything+                  , P.eq (True, "DROP TABLE \"person\"")+                  , P.anything+                  , P.anything+                  , P.eq (False, "DROP TABLE \"person_backup\"")+                  ]+                Postgresql ->+                  [ P.eq (True, "ALTER TABLE \"person\" DROP COLUMN \"foo\"")+                  ]++          result `shouldSatisfy` P.right (P.list sql)++        it "parseMigration'" $ do+          let action :: (Migration -> TestApp a) -> IO a+              action f = runTestApp backendType $ do+                setupUnsafeMigration+                f migration++          result <- action parseMigration+          result' <- action parseMigration'+          Right result' `shouldBe` result++        it "printMigration" $+          runTestApp backendType $ do+            setupUnsafeMigration+            printMigration migration++        it "showMigration" $ do+          result <- runTestApp backendType $ do+            setupUnsafeMigration+            showMigration migration++          let sql = case backendType of+                Sqlite ->+                  [ P.eq $+                      Text.concat+                        [ "CREATE TEMP TABLE \"person_backup\"("+                        , "\"id\" INTEGER PRIMARY KEY,"+                        , "\"name\" VARCHAR NOT NULL,"+                        , "\"age\" INTEGER NOT NULL,"+                        , "CONSTRAINT \"unique_name\" UNIQUE (\"name\"));"+                        ]+                  , P.anything+                  , P.eq "DROP TABLE \"person\";"+                  , P.anything+                  , P.anything+                  , P.eq "DROP TABLE \"person_backup\";"+                  ]+                Postgresql ->+                  [ P.eq "ALTER TABLE \"person\" DROP COLUMN \"foo\";"+                  ]++          result `shouldSatisfy` P.list sql++        it "getMigration" $ do+          result <- runTestApp backendType $ do+            setupUnsafeMigration+            getMigration migration++          let sql = case backendType of+                Sqlite ->+                  [ P.eq $+                      Text.concat+                        [ "CREATE TEMP TABLE \"person_backup\"("+                        , "\"id\" INTEGER PRIMARY KEY,"+                        , "\"name\" VARCHAR NOT NULL,"+                        , "\"age\" INTEGER NOT NULL,"+                        , "CONSTRAINT \"unique_name\" UNIQUE (\"name\"))"+                        ]+                  , P.anything+                  , P.eq "DROP TABLE \"person\""+                  , P.anything+                  , P.anything+                  , P.eq "DROP TABLE \"person_backup\""+                  ]+                Postgresql ->+                  [ P.eq "ALTER TABLE \"person\" DROP COLUMN \"foo\""+                  ]++          result `shouldSatisfy` P.list sql++        it "runMigration" $ do+          result <- runTestApp backendType $ do+            setupSafeMigration+            runMigration migration+            getSchemaColumnNames backendType "person"+          result `shouldNotSatisfy` P.elem "removed_column"++        it "runMigrationQuiet" $ do+          (withQuiet, cols) <- runTestApp backendType $ do+            setupSafeMigration+            sql <- runMigrationQuiet migration+            cols <- getSchemaColumnNames backendType "person"+            return (sql, cols)+          withSilent <- runTestApp backendType $ do+            setupSafeMigration+            runMigrationSilent migration+          cols `shouldNotSatisfy` P.elem "removed_column"+          withQuiet `shouldBe` withSilent++        it "runMigrationSilent" $ do+          (sqlPlanned, sqlExecuted, cols) <- runTestApp backendType $ do+            setupSafeMigration+            sqlPlanned <- getMigration migration+            sqlExecuted <- runMigrationSilent migration+            cols <- getSchemaColumnNames backendType "person"+            return (sqlPlanned, sqlExecuted, cols)+          cols `shouldNotSatisfy` P.elem "removed_column"+          sqlExecuted `shouldBe` sqlPlanned++        it "runMigrationUnsafe" $ do+          result <- runTestApp backendType $ do+            setupUnsafeMigration+            runMigrationUnsafe migration+            getSchemaColumnNames backendType "person"+          result `shouldNotSatisfy` P.elem "removed_column"++        it "runMigrationUnsafeQuiet" $ do+          (sqlPlanned, sqlExecuted, cols) <- runTestApp backendType $ do+            setupUnsafeMigration+            sqlPlanned <- getMigration migration+            sqlExecuted <- runMigrationUnsafeQuiet migration+            cols <- getSchemaColumnNames backendType "person"+            return (sqlPlanned, sqlExecuted, cols)+          cols `shouldNotSatisfy` P.elem "removed_column"+          sqlExecuted `shouldBe` sqlPlanned++        it "getFieldName" $ do+          result <-+            runTestApp backendType $+              getFieldName PersonName+          result `shouldBe` "\"name\""++        it "getTableName" $ do+          result <-+            runTestApp backendType $+              getTableName $+                person "Alice"+          result `shouldBe` "\"person\""++        it "withRawQuery" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            withRawQuery "SELECT name FROM person" [] $+              Conduit.mapC (getFirstPersistValue @Text) .| Conduit.sinkList++          result `shouldBe` ["Alice", "Bob"]++        it "rawQueryRes" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            acquire <- rawQueryRes "SELECT name FROM person" []+            Acquire.with acquire $ \conduit ->+              runConduit $ conduit .| Conduit.mapC (getFirstPersistValue @Text) .| Conduit.sinkList+          result `shouldBe` ["Alice", "Bob"]++        it "rawQuery" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            runConduit $ rawQuery "SELECT name FROM person" [] .| Conduit.mapC (getFirstPersistValue @Text) .| Conduit.sinkList+          result `shouldBe` ["Alice", "Bob"]++        it "rawExecute" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            rawExecute "UPDATE person SET age = 100 WHERE name = 'Alice'" []+            getPeople+          map nameAndAge result `shouldBe` [("Alice", 100), ("Bob", 0)]++        it "rawExecuteCount" $ do+          (rowsUpdated, people) <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            rowsUpdated <- rawExecuteCount "UPDATE person SET age = 100 WHERE name = 'Alice'" []+            people <- getPeople+            return (rowsUpdated, people)+          rowsUpdated `shouldBe` 1+          map nameAndAge people `shouldBe` [("Alice", 100), ("Bob", 0)]++        it "rawSql" $ do+          result <- runTestApp backendType $ do+            insertMany_ [person "Alice", person "Bob"]+            rawSql @(Single String) "SELECT name FROM person" []+          map unSingle result `shouldBe` ["Alice", "Bob"]++        it "transactionSave" $ do+          result1 <- runTestApp backendType $ do+            catchTestError $ withTransaction $ do+              insert_ $ person "Alice"+              insertAndFail $ person "Bob"+            getPeopleNames+          result1 `shouldBe` []++          result2 <- runTestApp backendType $ do+            catchTestError $ withTransaction $ do+              insert_ $ person "Alice"+              transactionSave+              insertAndFail $ person "Bob"+            getPeopleNames+          result2 `shouldBe` ["Alice"]++        it "transactionSaveWithIsolation" $ do+          result1 <- runTestApp backendType $ do+            catchTestError $ withTransaction $ do+              insert_ $ person "Alice"+              insertAndFail $ person "Bob"+            getPeopleNames+          result1 `shouldBe` []++          result2 <- runTestApp backendType $ do+            catchTestError $ withTransaction $ do+              insert_ $ person "Alice"+              transactionSaveWithIsolation Serializable+              insertAndFail $ person "Bob"+            getPeopleNames+          result2 `shouldBe` ["Alice"]++        it "transactionUndo" $ do+          result <- runTestApp backendType $ withTransaction $ do+            insert_ $ person "Alice"+            transactionUndo+            getPeopleNames+          result `shouldBe` []++        it "transactionUndoWithIsolation" $ do+          result <- runTestApp backendType $ withTransaction $ do+            insert_ $ person "Alice"+            transactionUndoWithIsolation Serializable+            getPeopleNames+          result `shouldBe` []++      describe "Interop with third-party Persistent libraries" $ do+        it "unsafeLiftSql" $ do+          let alice = person "Alice"+          result <- runTestApp backendType $ do+            insert_ alice+            esqueletoSelect $+              E.from $+                E.table @Person+          result `shouldBe` [Entity 1 alice]++{- Persistent helpers -}++getFirstPersistValue :: (PersistField a) => [PersistValue] -> a+getFirstPersistValue = \case+  [] -> error "Unexpectedly got no values"+  v : _ -> fromPersistValueOrFail v++fromPersistValueOrFail :: (PersistField a) => PersistValue -> a+fromPersistValueOrFail = either (error . Text.unpack) id . fromPersistValue++{- Meta SQL helpers -}++-- | Put the database in a state where running a migration is safe.+setupSafeMigration :: (MonadSqlQuery m) => m ()+setupSafeMigration = rawExecute "ALTER TABLE person ADD COLUMN removed_column VARCHAR" []++-- | Put the database in a state where running a migration is unsafe.+setupUnsafeMigration :: (MonadSqlQuery m) => m ()+setupUnsafeMigration = rawExecute "ALTER TABLE person ADD COLUMN foo VARCHAR" []++-- | Get the names of all columns in the given table.+getSchemaColumnNames :: (MonadSqlQuery m) => BackendType -> String -> m [String]+getSchemaColumnNames backendType tableName = map unSingle <$> rawSql sql []+  where+    sql = Text.pack $ case backendType of+      Sqlite -> "SELECT name FROM pragma_table_info('" ++ tableName ++ "')"+      Postgresql ->+        unlines+          [ "SELECT column_name FROM information_schema.columns"+          , "WHERE table_schema = 'public' AND table_name = '" ++ tableName ++ "'"+          ]++{- Test helpers -}++data TestError = TestError+  deriving (Show, Eq)++instance Exception TestError++catchTestError :: (MonadUnliftIO m, Eq a, Show a) => m a -> m ()+catchTestError m = do+  result <- try m+  liftIO $ result `shouldBe` Left TestError++insertAndFail ::+  ( MonadRerunnableIO m+  , MonadSqlQuery m+  , PersistRecordBackend record SqlBackend+  , Typeable record+  , SafeToInsert record+  ) =>+  record+  -> m ()+insertAndFail record = do+  insert_ record+  rerunnableIO $ throwIO TestError
− test/IntegrationTest.hs
@@ -1,852 +0,0 @@-{- AUTOCOLLECT.TEST -}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeApplications #-}-{-# LANGUAGE TypeFamilies #-}--module IntegrationTest (-  -- $AUTOCOLLECT.TEST.export$-) where--import Conduit (runConduit, (.|))-import qualified Conduit-import Control.Arrow ((&&&))-import qualified Data.Acquire as Acquire-import Data.Bifunctor (first)-import qualified Data.Map.Strict as Map-import Data.Text (Text)-import qualified Data.Text as Text-import Data.Typeable (Typeable)-import qualified Database.Esqueleto.Experimental as E-import Database.Persist.Sql (-  Entity (..),-  IsolationLevel (..),-  Migration,-  PersistField,-  PersistRecordBackend,-  PersistValue,-  Single (..),-  SqlBackend,-  fromPersistValue,-  (=.),-  (==.),- )-import Test.Predicates (anything, elemsAre, eq, right)-import Test.Predicates.HUnit ((@?~))-import Test.Tasty-import Test.Tasty.HUnit-import UnliftIO (MonadIO, MonadUnliftIO, liftIO)-import UnliftIO.Exception (-  Exception,-  SomeException,-  StringException (..),-  fromException,-  throwIO,-  throwString,-  try,- )-import UnliftIO.IORef (atomicModifyIORef, newIORef, readIORef, writeIORef)--import Control.Monad.IO.Rerunnable (MonadRerunnableIO, rerunnableIO)-import Database.Persist.Monad-import Database.Persist.Monad.Internal.PersistentShim (SafeToInsert)-import Example-import TestUtils.DB (BackendType (..), allBackendTypes)-import TestUtils.Esqueleto (esqueletoSelect)--test_batch =-  [ testGroup-    (show backendType)-    [ testWithTransaction backendType-    , testCatchTransaction backendType-    , testComposability backendType-    , testPersistentAPI backendType-    , testInterop backendType-    ]-  | backendType <- allBackendTypes-  ]--testWithTransaction :: BackendType -> TestTree-testWithTransaction backendType =-  testGroup-    "withTransaction"-    [ testCase "it uses the same transaction" $ do-        -- without transactions, the INSERT shouldn't be rolled back-        runTestApp backendType $ do-          catchTestError $ insertAndFail $ person "Alice"-          result <- getPeopleNames-          liftIO $ result @?= ["Alice"]--        -- with transactions, the INSERT should be rolled back-        runTestApp backendType $ do-          catchTestError $ withTransaction $ insertAndFail $ person "Alice"-          result <- getPeopleNames-          liftIO $ result @?= []-    , testCase "retries transactions" $ do-        let retryIf e = case fromException e of-              Just (StringException "retry me" _) -> True-              _ -> False-            setRetry env = env{retryIf, retryLimit = 5}--        counter <- newIORef (0 :: Int)--        result <- try @_ @SomeException $-          runTestAppWith backendType setRetry $-            withTransaction $-              rerunnableIO $ do-                x <- atomicModifyIORef counter $ \x -> (x + 1, x)-                if x > 2-                  then return ()-                  else throwString "retry me"--        case result of-          Right () -> return ()-          Left e -> error $ "Got unexpected error: " ++ show e-    , testCase "throws error when retry hits limit" $ do-        let setRetry env = env{retryIf = const True, retryLimit = 2}--        result <--          try @_ @TransactionError @() $-            runTestAppWith backendType setRetry $-              withTransaction $-                rerunnableIO $-                  throwString "retry me"--        result @?= Left RetryLimitExceeded-    , testCase "Runs retryCallback" $ do-        callbackRef <- newIORef Nothing--        let setRetry env =-              env-                { retryIf = const True-                , retryLimit = 2-                , retryCallback = writeIORef callbackRef . Just-                }-        _ <--          try @_ @TransactionError @() $-            runTestAppWith backendType setRetry . withTransaction $-              rerunnableIO (throwIO TestError)--        mError <- readIORef callbackRef-        case mError >>= fromException of-          Just TestError -> return ()-          _ -> assertFailure $ "Unexpected result: " ++ show mError-    ]--testCatchTransaction :: BackendType -> TestTree-testCatchTransaction backendType =-  testGroup-    "catchSqlTransaction"-    [ testCase "catches errors" $ do-        wasCaughtRef <- newIORef False-        runTestApp backendType . withTransaction $-          (`catchSqlTransaction` markCaught wasCaughtRef) $-            rerunnableIO (throwString "error")-        wasCaught <- readIORef wasCaughtRef-        wasCaught @?= True-    , testCase "does not catch retry errors" $ do-        let retryIf e = case fromException e of-              Just (StringException "retry me" _) -> True-              _ -> False-            setRetry env = env{retryIf, retryLimit = 2}--        wasCaughtRef <- newIORef False-        _ <--          try @_ @SomeException $-            runTestAppWith backendType setRetry . withTransaction $-              (`catchSqlTransaction` markCaught wasCaughtRef) $-                rerunnableIO (throwString "retry me")-        wasCaught <- readIORef wasCaughtRef-        wasCaught @?= False-    ]-  where-    markCaught wasCaughtRef (_ :: SomeException) =-      rerunnableIO $ writeIORef wasCaughtRef True---- this should compile-testComposability :: BackendType -> TestTree-testComposability backendType = testCase "Operations can be composed" $ do-  let onlySql :: (MonadSqlQuery m) => m ()-      onlySql = do-        _ <- getPeople-        return ()--      sqlAndRerunnableIO :: (MonadSqlQuery m, MonadRerunnableIO m) => m ()-      sqlAndRerunnableIO = do-        _ <- getPeopleNames-        _ <- rerunnableIO $ newIORef True-        return ()--      onlyRerunnableIO :: (MonadRerunnableIO m) => m ()-      onlyRerunnableIO = do-        _ <- rerunnableIO $ newIORef True-        return ()--      arbitraryIO :: (MonadIO m) => m ()-      arbitraryIO = do-        _ <- liftIO $ newIORef True-        return ()--  -- everything should compose naturally by default-  runTestApp backendType $ do-    onlySql-    sqlAndRerunnableIO-    onlyRerunnableIO-    arbitraryIO--  -- in a transaction, you can compose everything except arbitrary IO-  runTestApp backendType $ withTransaction $ do-    onlySql-    sqlAndRerunnableIO-    onlyRerunnableIO---- uncomment this to get compile error--- arbitraryIO--testPersistentAPI :: BackendType -> TestTree-testPersistentAPI backendType =-  testGroup-    "Persistent API"-    [ testCase "get" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          mapM get [1, 2]-        map (fmap personName) result @?= [Just "Alice", Nothing]-    , testCase "getMany" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          getMany [1]-        personName <$> Map.lookup 1 result @?= Just "Alice"-    , testCase "getJust" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          getJust 1-        personName result @?= "Alice"-    , testCase "getJustEntity" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          getJustEntity 1-        getName result @?= "Alice"-    , testCase "getEntity" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          mapM getEntity [1, 2]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "belongsTo" $ do-        result <- runTestApp backendType $ do-          aliceKey <- insert $ person "Alice"-          let post1 = Post "Post #1" aliceKey (Just aliceKey)-              post2 = Post "Post #2" aliceKey Nothing-          insertMany_ [post1, post2]-          mapM (belongsTo postEditor) [post1, post2]-        map (fmap personName) result @?= [Just "Alice", Nothing]-    , testCase "belongsToJust" $ do-        result <- runTestApp backendType $ do-          aliceKey <- insert $ person "Alice"-          let post1 = Post "Post #1" aliceKey Nothing-          insert_ post1-          belongsToJust postAuthor post1-        personName result @?= "Alice"-    , testCase "insert" $ do-        result <- runTestApp backendType $ do-          aliceKey <- insert $ person "Alice"-          people <- getPeopleNames-          return (aliceKey, people)-        result @?= (1, ["Alice"])-    , testCase "insert_" $ do-        result <- runTestApp backendType $ do-          result <- insert_ $ person "Alice"-          people <- getPeopleNames-          return (result, people)-        result @?= ((), ["Alice"])-    , testCase "insertMany" $ do-        result <- runTestApp backendType $ do-          keys <- insertMany [person "Alice", person "Bob"]-          people <- getPeopleNames-          return (keys, people)-        result @?= ([1, 2], ["Alice", "Bob"])-    , testCase "insertMany_" $ do-        result <- runTestApp backendType $ do-          result <- insertMany_ [person "Alice", person "Bob"]-          people <- getPeopleNames-          return (result, people)-        result @?= ((), ["Alice", "Bob"])-    , testCase "insertEntityMany" $ do-        result <- runTestApp backendType $ do-          result <--            insertEntityMany-              [ Entity 1 $ person "Alice"-              , Entity 2 $ person "Bob"-              ]-          people <- getPeopleNames-          return (result, people)-        result @?= ((), ["Alice", "Bob"])-    , testCase "insertKey" $ do-        result <- runTestApp backendType $ do-          result <- insertKey 1 $ person "Alice"-          people <- getPeopleNames-          return (result, people)-        result @?= ((), ["Alice"])-    , testCase "repsert" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          insert_ alice-          repsert 1 $ alice{personAge = 100}-          repsert 2 $ person "Bob"-          getPeople-        map nameAndAge result-          @?= [ ("Alice", 100)-              , ("Bob", 0)-              ]-    , testCase "repsertMany" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          -- https://github.com/yesodweb/persistent/issues/832-          insert_ alice-          repsertMany-            [ (1, alice{personAge = 100})-            , (2, person "Bob")-            ]-          getPeople-        map nameAndAge result-          @?= [ ("Alice", 100)-              , ("Bob", 0)-              ]-    , testCase "replace" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          insert_ alice-          replace 1 $ alice{personAge = 100}-          getJust 1-        personAge result @?= 100-    , testCase "delete" $ do-        result <- runTestApp backendType $ do-          aliceKey <- insert $ person "Alice"-          delete aliceKey-          getPeople-        result @?= []-    , testCase "update" $ do-        result <- runTestApp backendType $ do-          key <- insert $ person "Alice"-          update key [PersonName =. "Alicia"]-          getPeopleNames-        result @?= ["Alicia"]-    , testCase "updateGet" $ do-        (updateResult, getResult) <- runTestApp backendType $ do-          key <- insert $ person "Alice"-          updateResult <- updateGet key [PersonName =. "Alicia"]-          getResult <- getJust key-          return (updateResult, getResult)-        updateResult @?= getResult-    , testCase "insertEntity" $ do-        (insertResult, getResult) <- runTestApp backendType $ do-          insertResult <- insertEntity $ person "Alice"-          getResult <- getJust $ entityKey insertResult-          return (insertResult, getResult)-        entityVal insertResult @?= getResult-    , testCase "insertRecord" $ do-        (insertResult, getResult) <- runTestApp backendType $ do-          insertResult <- insertRecord $ person "Alice"-          getResult <- getJust 1-          return (insertResult, getResult)-        insertResult @?= getResult-    , testCase "getBy" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          mapM getBy [UniqueName "Alice", UniqueName "Bob"]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "getByValue" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          insert_ alice-          mapM getByValue [alice, person "Bob"]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "checkUnique" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          insert_ alice-          mapM-            checkUnique-            [ alice-            , person "Bob"-            , (person "Alice"){personAge = 100}-            ]-        result @?= [Just (UniqueName "Alice"), Nothing, Just (UniqueName "Alice")]-    , testCase "checkUniqueUpdateable" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          insert_ alice-          mapM-            checkUniqueUpdateable-            [ Entity 1 alice-            , Entity 2 $ person "Bob"-            , Entity 3 $ (person "Alice"){personAge = 100}-            ]-        result @?= [Nothing, Nothing, Just (UniqueName "Alice")]-    , testCase "deleteBy" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          deleteBy $ UniqueName "Alice"-          getPeople-        result @?= []-    , testCase "insertUnique" $ do-        (result1, result2, people) <- runTestApp backendType $ do-          result1 <- insertUnique $ person "Alice"-          result2 <- insertUnique $ person "Alice"-          people <- getPeopleNames-          return (result1, result2, people)-        result1 @?= Just 1-        result2 @?= Nothing-        people @?= ["Alice"]-    , testCase "upsert" $ do-        (result1, result2, people) <- runTestApp backendType $ do-          result1 <- upsert (person "Alice") [PersonAge =. 0]-          result2 <- upsert (person "Alice") [PersonAge =. 100]-          people <- getPeople-          return (result1, result2, people)-        entityKey result1 @?= entityKey result2-        nameAndAge (entityVal result1) @?= ("Alice", 0)-        nameAndAge (entityVal result2) @?= ("Alice", 100)-        map nameAndAge people @?= [("Alice", 100)]-    , testCase "upsertBy" $ do-        (result1, result2, people) <- runTestApp backendType $ do-          result1 <- upsertBy (UniqueName "Alice") (person "Alice") [PersonAge =. 0]-          result2 <- upsertBy (UniqueName "Alice") (person "Alice") [PersonAge =. 100]-          people <- getPeople-          return (result1, result2, people)-        entityKey result1 @?= entityKey result2-        nameAndAge (entityVal result1) @?= ("Alice", 0)-        nameAndAge (entityVal result2) @?= ("Alice", 100)-        map nameAndAge people @?= [("Alice", 100)]-    , testCase "putMany" $ do-        result <- runTestApp backendType $ do-          let alice = person "Alice"-          insert_ alice-          putMany-            [ alice{personAge = 100}-            , person "Bob"-            ]-          getPeople-        map nameAndAge result-          @?= [ ("Alice", 100)-              , ("Bob", 0)-              ]-    , testCase "insertBy" $ do-        (result1, result2, people) <- runTestApp backendType $ do-          let alice = person "Alice"-          result1 <- insertBy alice-          result2 <- insertBy $ alice{personAge = 100}-          people <- getPeople-          return (result1, result2, people)-        result1 @?= Right 1-        first (entityKey &&& getName) result2 @?= Left (1, "Alice")-        map nameAndAge people @?= [("Alice", 0)]-    , testCase "insertUniqueEntity" $ do-        (result1, result2, people) <- runTestApp backendType $ do-          let alice = person "Alice"-          result1 <- insertUniqueEntity alice-          result2 <- insertUniqueEntity $ alice{personAge = 100}-          people <- getPeople-          return (result1, result2, people)-        (entityKey &&& getName) <$> result1 @?= Just (1, "Alice")-        result2 @?= Nothing-        map nameAndAge people @?= [("Alice", 0)]-    , testCase "replaceUnique" $ do-        (result1, result2, people) <- runTestApp backendType $ do-          let alice = person "Alice"-              bob = person "Bob"-          insertMany_ [alice, bob]-          result1 <- replaceUnique 1 $ alice{personName = "Bob"}-          result2 <- replaceUnique 2 $ bob{personAge = 100}-          people <- getPeople-          return (result1, result2, people)-        result1 @?= Just (UniqueName "Bob")-        result2 @?= Nothing-        map nameAndAge people @?= [("Alice", 0), ("Bob", 100)]-    , testCase "onlyUnique" $ do-        result <- runTestApp backendType $ onlyUnique $ person "Alice"-        result @?= UniqueName "Alice"-    , testCase "selectSourceRes" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          acquire <- selectSourceRes [] []-          Acquire.with acquire $ \conduit ->-            runConduit $ conduit .| Conduit.mapC getName .| Conduit.sinkList-        result @?= ["Alice", "Bob"]-    , testCase "selectFirst" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          sequence-            [ selectFirst [PersonName ==. "Alice"] []-            , selectFirst [PersonName ==. "Bob"] []-            ]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "selectKeysRes" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          acquire <- selectKeysRes @_ @Person [] []-          Acquire.with acquire $ \conduit ->-            runConduit $ conduit .| Conduit.sinkList-        result @?= [1, 2]-    , testCase "count" $ do-        result <- runTestApp backendType $ do-          insertMany_ $ map (\p -> p{personAge = 100}) [person "Alice", person "Bob"]-          count [PersonAge ==. 100]-        result @?= 2-    , testCase "exists" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          exists [PersonName ==. "Alice"]-        result @?= True-    , testCase "selectSource" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          runConduit $ selectSource [] [] .| Conduit.mapC getName .| Conduit.sinkList-        result @?= ["Alice", "Bob"]-    , testCase "selectKeys" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          runConduit $ selectKeys @Person [] [] .| Conduit.sinkList-        result @?= [1, 2]-    , testCase "selectList" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          insert_ $ person "Bob"-          selectList [] []-        map getName result @?= ["Alice", "Bob"]-    , testCase "selectKeysList" $ do-        result <- runTestApp backendType $ do-          insert_ $ person "Alice"-          insert_ $ person "Bob"-          selectKeysList @Person [] []-        result @?= [1, 2]-    , testCase "updateWhere" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          updateWhere [PersonName ==. "Alice"] [PersonAge =. 100]-          getPeople-        map nameAndAge result @?= [("Alice", 100), ("Bob", 0)]-    , testCase "deleteWhere" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          deleteWhere [PersonName ==. "Alice"]-          getPeopleNames-        result @?= ["Bob"]-    , testCase "updateWhereCount" $ do-        (rowsUpdated, people) <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          rowsUpdated <- updateWhereCount [PersonName ==. "Alice"] [PersonAge =. 100]-          people <- getPeople-          return (rowsUpdated, people)-        rowsUpdated @?= 1-        map nameAndAge people @?= [("Alice", 100), ("Bob", 0)]-    , testCase "deleteWhereCount" $ do-        (rowsDeleted, names) <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          rowsDeleted <- deleteWhereCount [PersonName ==. "Alice"]-          names <- getPeopleNames-          return (rowsDeleted, names)-        rowsDeleted @?= 1-        names @?= ["Bob"]-    , testCase "parseMigration" $ do-        result <- runTestApp backendType $ do-          setupUnsafeMigration-          parseMigration migration--        let sql = case backendType of-              Sqlite ->-                [ eq-                    ( False-                    , Text.concat-                        [ "CREATE TEMP TABLE \"person_backup\"("-                        , "\"id\" INTEGER PRIMARY KEY,"-                        , "\"name\" VARCHAR NOT NULL,"-                        , "\"age\" INTEGER NOT NULL,"-                        , "CONSTRAINT \"unique_name\" UNIQUE (\"name\"))"-                        ]-                    )-                , anything-                , eq (True, "DROP TABLE \"person\"")-                , anything-                , anything-                , eq (False, "DROP TABLE \"person_backup\"")-                ]-              Postgresql ->-                [ eq (True, "ALTER TABLE \"person\" DROP COLUMN \"foo\"")-                ]--        result @?~ right (elemsAre sql)-    , testCase "parseMigration'" $ do-        let action :: (Migration -> TestApp a) -> IO a-            action f = runTestApp backendType $ do-              setupUnsafeMigration-              f migration--        result <- action parseMigration-        result' <- action parseMigration'-        Right result' @?= result-    , testCase "printMigration" $-        runTestApp backendType $ do-          setupUnsafeMigration-          printMigration migration-    , testCase "showMigration" $ do-        result <- runTestApp backendType $ do-          setupUnsafeMigration-          showMigration migration--        let sql = case backendType of-              Sqlite ->-                [ eq $-                    Text.concat-                      [ "CREATE TEMP TABLE \"person_backup\"("-                      , "\"id\" INTEGER PRIMARY KEY,"-                      , "\"name\" VARCHAR NOT NULL,"-                      , "\"age\" INTEGER NOT NULL,"-                      , "CONSTRAINT \"unique_name\" UNIQUE (\"name\"));"-                      ]-                , anything-                , eq "DROP TABLE \"person\";"-                , anything-                , anything-                , eq "DROP TABLE \"person_backup\";"-                ]-              Postgresql ->-                [ eq "ALTER TABLE \"person\" DROP COLUMN \"foo\";"-                ]--        result @?~ elemsAre sql-    , testCase "getMigration" $ do-        result <- runTestApp backendType $ do-          setupUnsafeMigration-          getMigration migration--        let sql = case backendType of-              Sqlite ->-                [ eq $-                    Text.concat-                      [ "CREATE TEMP TABLE \"person_backup\"("-                      , "\"id\" INTEGER PRIMARY KEY,"-                      , "\"name\" VARCHAR NOT NULL,"-                      , "\"age\" INTEGER NOT NULL,"-                      , "CONSTRAINT \"unique_name\" UNIQUE (\"name\"))"-                      ]-                , anything-                , eq "DROP TABLE \"person\""-                , anything-                , anything-                , eq "DROP TABLE \"person_backup\""-                ]-              Postgresql ->-                [ eq "ALTER TABLE \"person\" DROP COLUMN \"foo\""-                ]--        result @?~ elemsAre sql-    , testCase "runMigration" $ do-        result <- runTestApp backendType $ do-          setupSafeMigration-          runMigration migration-          getSchemaColumnNames backendType "person"-        assertNotIn "removed_column" result-    , testCase "runMigrationQuiet" $ do-        (withQuiet, cols) <- runTestApp backendType $ do-          setupSafeMigration-          sql <- runMigrationQuiet migration-          cols <- getSchemaColumnNames backendType "person"-          return (sql, cols)-        withSilent <- runTestApp backendType $ do-          setupSafeMigration-          runMigrationSilent migration-        assertNotIn "removed_column" cols-        withQuiet @?= withSilent-    , testCase "runMigrationSilent" $ do-        (sqlPlanned, sqlExecuted, cols) <- runTestApp backendType $ do-          setupSafeMigration-          sqlPlanned <- getMigration migration-          sqlExecuted <- runMigrationSilent migration-          cols <- getSchemaColumnNames backendType "person"-          return (sqlPlanned, sqlExecuted, cols)-        assertNotIn "removed_column" cols-        sqlExecuted @?= sqlPlanned-    , testCase "runMigrationUnsafe" $ do-        result <- runTestApp backendType $ do-          setupUnsafeMigration-          runMigrationUnsafe migration-          getSchemaColumnNames backendType "person"-        assertNotIn "removed_column" result-    , testCase "runMigrationUnsafeQuiet" $ do-        (sqlPlanned, sqlExecuted, cols) <- runTestApp backendType $ do-          setupUnsafeMigration-          sqlPlanned <- getMigration migration-          sqlExecuted <- runMigrationUnsafeQuiet migration-          cols <- getSchemaColumnNames backendType "person"-          return (sqlPlanned, sqlExecuted, cols)-        assertNotIn "removed_column" cols-        sqlExecuted @?= sqlPlanned-    , testCase "getFieldName" $ do-        result <--          runTestApp backendType $-            getFieldName PersonName-        result @?= "\"name\""-    , testCase "getTableName" $ do-        result <--          runTestApp backendType $-            getTableName $-              person "Alice"-        result @?= "\"person\""-    , testCase "withRawQuery" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          withRawQuery "SELECT name FROM person" [] $-            Conduit.mapC (getFirstPersistValue @Text) .| Conduit.sinkList--        result @?= ["Alice", "Bob"]-    , testCase "rawQueryRes" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          acquire <- rawQueryRes "SELECT name FROM person" []-          Acquire.with acquire $ \conduit ->-            runConduit $ conduit .| Conduit.mapC (getFirstPersistValue @Text) .| Conduit.sinkList-        result @?= ["Alice", "Bob"]-    , testCase "rawQuery" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          runConduit $ rawQuery "SELECT name FROM person" [] .| Conduit.mapC (getFirstPersistValue @Text) .| Conduit.sinkList-        result @?= ["Alice", "Bob"]-    , testCase "rawExecute" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          rawExecute "UPDATE person SET age = 100 WHERE name = 'Alice'" []-          getPeople-        map nameAndAge result @?= [("Alice", 100), ("Bob", 0)]-    , testCase "rawExecuteCount" $ do-        (rowsUpdated, people) <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          rowsUpdated <- rawExecuteCount "UPDATE person SET age = 100 WHERE name = 'Alice'" []-          people <- getPeople-          return (rowsUpdated, people)-        rowsUpdated @?= 1-        map nameAndAge people @?= [("Alice", 100), ("Bob", 0)]-    , testCase "rawSql" $ do-        result <- runTestApp backendType $ do-          insertMany_ [person "Alice", person "Bob"]-          rawSql @(Single String) "SELECT name FROM person" []-        map unSingle result @?= ["Alice", "Bob"]-    , testCase "transactionSave" $ do-        result1 <- runTestApp backendType $ do-          catchTestError $ withTransaction $ do-            insert_ $ person "Alice"-            insertAndFail $ person "Bob"-          getPeopleNames-        result1 @?= []--        result2 <- runTestApp backendType $ do-          catchTestError $ withTransaction $ do-            insert_ $ person "Alice"-            transactionSave-            insertAndFail $ person "Bob"-          getPeopleNames-        result2 @?= ["Alice"]-    , testCase "transactionSaveWithIsolation" $ do-        result1 <- runTestApp backendType $ do-          catchTestError $ withTransaction $ do-            insert_ $ person "Alice"-            insertAndFail $ person "Bob"-          getPeopleNames-        result1 @?= []--        result2 <- runTestApp backendType $ do-          catchTestError $ withTransaction $ do-            insert_ $ person "Alice"-            transactionSaveWithIsolation Serializable-            insertAndFail $ person "Bob"-          getPeopleNames-        result2 @?= ["Alice"]-    , testCase "transactionUndo" $ do-        result <- runTestApp backendType $ withTransaction $ do-          insert_ $ person "Alice"-          transactionUndo-          getPeopleNames-        result @?= []-    , testCase "transactionUndoWithIsolation" $ do-        result <- runTestApp backendType $ withTransaction $ do-          insert_ $ person "Alice"-          transactionUndoWithIsolation Serializable-          getPeopleNames-        result @?= []-    ]--testInterop :: BackendType -> TestTree-testInterop backendType =-  testGroup-    "Interop with third-party Persistent libraries"-    [ testCase "unsafeLiftSql" $ do-        let alice = person "Alice"-        result <- runTestApp backendType $ do-          insert_ alice-          esqueletoSelect $-            E.from $-              E.table @Person-        result @?= [Entity 1 alice]-    ]--{- Persistent helpers -}--getFirstPersistValue :: (PersistField a) => [PersistValue] -> a-getFirstPersistValue = \case-  [] -> error "Unexpectedly got no values"-  v : _ -> fromPersistValueOrFail v--fromPersistValueOrFail :: (PersistField a) => PersistValue -> a-fromPersistValueOrFail = either (error . Text.unpack) id . fromPersistValue--{- Meta SQL helpers -}---- | Put the database in a state where running a migration is safe.-setupSafeMigration :: (MonadSqlQuery m) => m ()-setupSafeMigration = rawExecute "ALTER TABLE person ADD COLUMN removed_column VARCHAR" []---- | Put the database in a state where running a migration is unsafe.-setupUnsafeMigration :: (MonadSqlQuery m) => m ()-setupUnsafeMigration = rawExecute "ALTER TABLE person ADD COLUMN foo VARCHAR" []---- | Get the names of all columns in the given table.-getSchemaColumnNames :: (MonadSqlQuery m) => BackendType -> String -> m [String]-getSchemaColumnNames backendType tableName = map unSingle <$> rawSql sql []-  where-    sql = Text.pack $ case backendType of-      Sqlite -> "SELECT name FROM pragma_table_info('" ++ tableName ++ "')"-      Postgresql ->-        unlines-          [ "SELECT column_name FROM information_schema.columns"-          , "WHERE table_schema = 'public' AND table_name = '" ++ tableName ++ "'"-          ]--{- Test helpers -}--data TestError = TestError-  deriving (Show, Eq)--instance Exception TestError--catchTestError :: (MonadUnliftIO m, Eq a, Show a) => m a -> m ()-catchTestError m = do-  result <- try m-  liftIO $ result @?= Left TestError--insertAndFail ::-  ( MonadRerunnableIO m-  , MonadSqlQuery m-  , PersistRecordBackend record SqlBackend-  , Typeable record-  , SafeToInsert record-  ) =>-  record-  -> m ()-insertAndFail record = do-  insert_ record-  rerunnableIO $ throwIO TestError--assertNotIn :: (Eq a, Show a) => a -> [a] -> Assertion-assertNotIn a as = as @?= filter (/= a) as
test/Main.hs view
@@ -1,4 +1,1 @@-{- AUTOCOLLECT.MAIN-suite_name = persistent-mtl-strip_suffix = Test--}+import Skeletest.Main
+ test/MockedSpec.hs view
@@ -0,0 +1,663 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TypeApplications #-}++module MockedSpec (spec) where++import Conduit (runConduit, runResourceT, (.|))+import qualified Conduit+import qualified Data.Acquire as Acquire+import qualified Data.Map.Strict as Map+import Data.Maybe (listToMaybe)+import Database.Persist.Sql (+  Entity (..),+  Single (..),+  toPersistValue,+  toSqlKey,+  (=.),+  (==.),+ )+import Skeletest+import qualified Skeletest.Predicate as P+import UnliftIO (SomeException)++import Database.Persist.Monad+import Database.Persist.Monad.TestUtils+import Example++spec :: Spec+spec = do+  describe "withTransaction" $ do+    it "doesn't error with MockSqlQueryT" $+      runMockSqlQueryT+        (withTransaction $ insert_ $ person "Alice")+        [ withRecord @Person $ \case+            Insert_ _ -> Just ()+            _ -> Nothing+        ]++  describe "MockSqlQueryT" $ do+    it "errors if it could not find a mock" $ do+      let errMsg e = (listToMaybe . lines . show) (e :: SomeException)+      runMockSqlQueryT getPeopleNames [] `shouldSatisfy` P.throws (errMsg P.>>> P.just (P.eq "Could not find mock for query: SelectList{..}<Person>"))++    it "continues after a mock doesn't match" $ do+      result <-+        runMockSqlQueryT+          getPeopleNames+          [ withRecord @Post $ \_ -> error "getPeopleNames matched Post record"+          , mockQuery $ \_ -> Nothing+          , withRecord @Person $ \case+              SelectList _ _ ->+                Just+                  [ Entity (toSqlKey 1) (Person "Alice" 10)+                  , Entity (toSqlKey 2) (Person "Bob" 20)+                  ]+              _ -> Nothing+          ]++      result `shouldBe` ["Alice", "Bob"]++  describe "Persistent API" $ do+    it "get" $ do+      result <-+        runMockSqlQueryT+          (mapM get [1, 2])+          [ withRecord @Person $ \case+              Get n+                | n == 1 -> Just $ Just $ person "Alice"+                | n == 2 -> Just Nothing+              _ -> Nothing+          ]+      map (fmap personName) result `shouldBe` [Just "Alice", Nothing]++    it "getMany" $ do+      result <-+        runMockSqlQueryT+          (getMany [1])+          [ withRecord @Person $ \case+              GetMany _ -> Just $ Map.fromList [(1, person "Alice")]+              _ -> Nothing+          ]+      personName <$> Map.lookup 1 result `shouldBe` Just "Alice"++    it "getJust" $ do+      result <-+        runMockSqlQueryT+          (getJust 1)+          [ withRecord @Person $ \case+              GetJust _ -> Just $ person "Alice"+              _ -> Nothing+          ]+      personName result `shouldBe` "Alice"++    it "getJustEntity" $ do+      result <-+        runMockSqlQueryT+          (getJustEntity 1)+          [ withRecord @Person $ \case+              GetJustEntity _ -> Just $ Entity 1 $ person "Alice"+              _ -> Nothing+          ]+      getName result `shouldBe` "Alice"++    it "getEntity" $ do+      result <-+        runMockSqlQueryT+          (mapM getEntity [1, 2])+          [ withRecord @Person $ \case+              GetEntity n+                | n == 1 -> Just $ Just $ Entity 1 $ person "Alice"+                | n == 2 -> Just Nothing+              _ -> Nothing+          ]+      map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++    it "belongsTo" $ do+      let post1 = Post "Post #1" 1 (Just 1)+          post2 = Post "Post #2" 1 Nothing+      result <-+        runMockSqlQueryT+          (mapM (belongsTo postEditor) [post1, post2])+          [ withRecord @(Post, Person) $ \case+              BelongsTo _ Post{postEditor = Just 1} -> Just $ Just $ person "Alice"+              BelongsTo _ Post{postEditor = Nothing} -> Just Nothing+              _ -> Nothing+          ]+      map (fmap personName) result `shouldBe` [Just "Alice", Nothing]++    it "belongsToJust" $ do+      let post1 = Post "Post #1" 1 Nothing+      result <-+        runMockSqlQueryT+          (belongsToJust postAuthor post1)+          [ withRecord @(Post, Person) $ \case+              BelongsToJust _ _ -> Just $ person "Alice"+              _ -> Nothing+          ]+      personName result `shouldBe` "Alice"++    it "insert" $ do+      result <-+        runMockSqlQueryT+          (insert $ person "Alice")+          [ withRecord @Person $ \case+              Insert _ -> Just 1+              _ -> Nothing+          ]+      result `shouldBe` 1++    it "insert_" $ do+      result <-+        runMockSqlQueryT+          (insert_ $ person "Alice")+          [ withRecord @Person $ \case+              Insert_ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "insertMany" $ do+      result <-+        runMockSqlQueryT+          (insertMany [person "Alice", person "Bob"])+          [ withRecord @Person $ \case+              InsertMany records -> Just $ map fromIntegral [1 .. length records]+              _ -> Nothing+          ]+      result `shouldBe` [1, 2]++    it "insertMany_" $ do+      result <-+        runMockSqlQueryT+          (insertMany_ [person "Alice", person "Bob"])+          [ withRecord @Person $ \case+              InsertMany_ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "insertEntityMany" $ do+      result <-+        runMockSqlQueryT+          (insertEntityMany [Entity 1 $ person "Alice"])+          [ withRecord @Person $ \case+              InsertEntityMany _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "insertKey" $ do+      result <-+        runMockSqlQueryT+          (insertKey 1 $ person "Alice")+          [ withRecord @Person $ \case+              InsertKey _ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "repsert" $ do+      result <-+        runMockSqlQueryT+          (repsert 1 $ person "Alice")+          [ withRecord @Person $ \case+              Repsert _ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "repsertMany" $ do+      result <-+        runMockSqlQueryT+          (repsertMany [(1, person "Alice")])+          [ withRecord @Person $ \case+              RepsertMany _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "replace" $ do+      result <-+        runMockSqlQueryT+          (replace 1 $ person "Alice")+          [ withRecord @Person $ \case+              Replace _ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "delete" $ do+      result <-+        runMockSqlQueryT+          (delete @Person 1)+          [ withRecord @Person $ \case+              Delete _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "update" $ do+      result <-+        runMockSqlQueryT+          (update 1 [PersonName =. "Alicia"])+          [ withRecord @Person $ \case+              Update _ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "updateGet" $ do+      result <-+        runMockSqlQueryT+          (updateGet 1 [PersonName =. "Alicia"])+          [ withRecord @Person $ \case+              UpdateGet _ _ -> Just $ person "Alicia"+              _ -> Nothing+          ]+      personName result `shouldBe` "Alicia"++    it "insertEntity" $ do+      let alice = person "Alice"+      result <-+        runMockSqlQueryT+          (insertEntity alice)+          [ withRecord @Person $ \case+              InsertEntity _ -> Just $ Entity 1 alice+              _ -> Nothing+          ]+      entityVal result `shouldBe` alice++    it "insertRecord" $ do+      let alice = person "Alice"+      result <-+        runMockSqlQueryT+          (insertRecord alice)+          [ withRecord @Person $ \case+              InsertRecord _ -> Just alice+              _ -> Nothing+          ]+      result `shouldBe` alice++    it "getBy" $ do+      result <-+        runMockSqlQueryT+          (mapM getBy [UniqueName "Alice", UniqueName "Bob"])+          [ withRecord @Person $ \case+              GetBy (UniqueName "Alice") -> Just $ Just $ Entity 1 $ person "Alice"+              GetBy (UniqueName "Bob") -> Just Nothing+              _ -> Nothing+          ]+      map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++    it "getByValue" $ do+      result <-+        runMockSqlQueryT+          (mapM getByValue [person "Alice", person "Bob"])+          [ withRecord @Person $ \case+              GetByValue Person{personName = "Alice"} -> Just $ Just $ Entity 1 $ person "Alice"+              GetByValue Person{personName = "Bob"} -> Just Nothing+              _ -> Nothing+          ]+      map (fmap getName) result `shouldBe` [Just "Alice", Nothing]++    it "checkUnique" $ do+      result <-+        runMockSqlQueryT+          (mapM checkUnique [person "Alice", person "Bob"])+          [ withRecord @Person $ \case+              CheckUnique Person{personName = "Alice"} -> Just $ Just $ UniqueName "Alice"+              CheckUnique Person{personName = "Bob"} -> Just Nothing+              _ -> Nothing+          ]+      result `shouldBe` [Just $ UniqueName "Alice", Nothing]++    it "checkUniqueUpdateable" $ do+      result <-+        runMockSqlQueryT+          (mapM checkUniqueUpdateable [Entity 1 $ person "Alice", Entity 2 $ person "Bob"])+          [ withRecord @Person $ \case+              CheckUniqueUpdateable (Entity _ Person{personName = "Alice"}) -> Just $ Just $ UniqueName "Alice"+              CheckUniqueUpdateable (Entity _ Person{personName = "Bob"}) -> Just Nothing+              _ -> Nothing+          ]+      result `shouldBe` [Just $ UniqueName "Alice", Nothing]++    it "deleteBy" $ do+      result <-+        runMockSqlQueryT+          (deleteBy $ UniqueName "Alice")+          [ withRecord @Person $ \case+              DeleteBy _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "insertUnique" $ do+      result <-+        runMockSqlQueryT+          (mapM insertUnique [person "Alice", person "Bob"])+          [ withRecord @Person $ \case+              InsertUnique Person{personName = "Alice"} -> Just $ Just 1+              InsertUnique Person{personName = "Bob"} -> Just Nothing+              _ -> Nothing+          ]+      result `shouldBe` [Just 1, Nothing]++    it "upsert" $ do+      let alice = person "Alice"+      result <-+        runMockSqlQueryT+          (upsert alice [PersonAge =. 100])+          [ withRecord @Person $ \case+              Upsert _ _ -> Just $ Entity 1 alice+              _ -> Nothing+          ]+      result `shouldBe` Entity 1 alice++    it "upsertBy" $ do+      let alice = person "Alice"+      result <-+        runMockSqlQueryT+          (upsertBy (UniqueName "Alice") alice [PersonAge =. 100])+          [ withRecord @Person $ \case+              UpsertBy _ _ _ -> Just $ Entity 1 alice+              _ -> Nothing+          ]+      result `shouldBe` Entity 1 alice++    it "putMany" $ do+      result <-+        runMockSqlQueryT+          (putMany [person "Alice"])+          [ withRecord @Person $ \case+              PutMany _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "insertBy" $ do+      let alice = person "Alice"+      result <-+        runMockSqlQueryT+          (mapM insertBy [alice, person "Bob"])+          [ withRecord @Person $ \case+              InsertBy Person{personName = "Alice"} -> Just $ Left $ Entity 1 alice+              InsertBy Person{personName = "Bob"} -> Just $ Right 2+              _ -> Nothing+          ]+      result `shouldBe` [Left $ Entity 1 alice, Right 2]++    it "insertUniqueEntity" $ do+      let bob = person "Bob"+      result <-+        runMockSqlQueryT+          (mapM insertUniqueEntity [person "Alice", bob])+          [ withRecord @Person $ \case+              InsertUniqueEntity Person{personName = "Alice"} -> Just Nothing+              InsertUniqueEntity Person{personName = "Bob"} -> Just $ Just $ Entity 1 bob+              _ -> Nothing+          ]+      result `shouldBe` [Nothing, Just $ Entity 1 bob]++    it "replaceUnique" $ do+      result <-+        runMockSqlQueryT+          (mapM (uncurry replaceUnique) [(1, person "Alice"), (2, person "Bob")])+          [ withRecord @Person $ \case+              ReplaceUnique _ Person{personName = "Alice"} -> Just Nothing+              ReplaceUnique _ Person{personName = "Bob"} -> Just $ Just $ UniqueName "Bob"+              _ -> Nothing+          ]+      result `shouldBe` [Nothing, Just $ UniqueName "Bob"]++    it "onlyUnique" $ do+      result <-+        runMockSqlQueryT+          (onlyUnique $ person "Alice")+          [ withRecord @Person $ \case+              OnlyUnique _ -> Just $ UniqueName "Alice"+              _ -> Nothing+          ]+      result `shouldBe` UniqueName "Alice"++    it "selectSourceRes" $ do+      acquire <-+        runMockSqlQueryT+          (selectSourceRes [] [])+          [ mockSelectSource $ \_ _ ->+              Just+                [ Entity 1 $ person "Alice"+                , Entity 2 $ person "Bob"+                ]+          ]+      result <- Acquire.with acquire $ \conduit ->+        runConduit $ conduit .| Conduit.mapC getName .| Conduit.sinkList+      result `shouldBe` ["Alice", "Bob"]++    it "selectFirst" $ do+      result1 <-+        runMockSqlQueryT+          (selectFirst [PersonName ==. "Alice"] [])+          [ withRecord @Person $ \case+              SelectFirst _ _ -> Just $ Just $ Entity 1 $ person "Alice"+              _ -> Nothing+          ]+      getName <$> result1 `shouldBe` Just "Alice"+      result2 <-+        runMockSqlQueryT+          (selectFirst [PersonName ==. "Alice"] [])+          [ withRecord @Person $ \case+              SelectFirst _ _ -> Just Nothing+              _ -> Nothing+          ]+      result2 `shouldBe` Nothing++    it "selectKeysRes" $ do+      let keys = [1, 2, 3]+      acquire <-+        runMockSqlQueryT+          (selectKeysRes @_ @Person [] [])+          [ mockSelectKeys $ \_ _ -> Just keys+          ]+      result <- Acquire.with acquire $ \conduit ->+        runConduit $ conduit .| Conduit.sinkList+      result `shouldBe` keys++    it "count" $ do+      result <-+        runMockSqlQueryT+          (count @Person [])+          [ withRecord @Person $ \case+              Count _ -> Just 10+              _ -> Nothing+          ]+      result `shouldBe` 10++    it "exists" $ do+      result <-+        runMockSqlQueryT+          (exists @Person [])+          [ withRecord @Person $ \case+              Exists _ -> Just True+              _ -> Nothing+          ]+      result `shouldBe` True++    it "selectSource" $ do+      result <-+        runResourceT $+          runMockSqlQueryT+            (runConduit $ selectSource [] [] .| Conduit.mapC getName .| Conduit.sinkList)+            [ mockSelectSource $ \_ _ ->+                Just+                  [ Entity 1 $ person "Alice"+                  , Entity 2 $ person "Bob"+                  ]+            ]+      result `shouldBe` ["Alice", "Bob"]++    it "selectKeys" $ do+      let keys = [1, 2, 3]+      result <-+        runResourceT $+          runMockSqlQueryT+            (runConduit $ selectKeys @Person [] [] .| Conduit.sinkList)+            [ mockSelectKeys $ \_ _ -> Just keys+            ]+      result `shouldBe` keys++    it "selectList" $ do+      result <-+        runMockSqlQueryT+          (selectList [] [])+          [ withRecord @Person $ \case+              SelectList _ _ ->+                Just+                  [ Entity 1 (person "Alice")+                  , Entity 2 (person "Bob")+                  ]+              _ -> Nothing+          ]+      map getName result `shouldBe` ["Alice", "Bob"]++    it "selectKeysList" $ do+      let keys = [1, 2, 3]+      result <-+        runMockSqlQueryT+          (selectKeysList @Person [] [])+          [ withRecord @Person $ \case+              SelectKeysList _ _ -> Just keys+              _ -> Nothing+          ]+      result `shouldBe` keys++    it "updateWhere" $ do+      result <-+        runMockSqlQueryT+          (updateWhere [] [PersonAge =. 100])+          [ withRecord @Person $ \case+              UpdateWhere _ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "deleteWhere" $ do+      result <-+        runMockSqlQueryT+          (deleteWhere [PersonName ==. "Alice"])+          [ withRecord @Person $ \case+              DeleteWhere _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "updateWhereCount" $ do+      result <-+        runMockSqlQueryT+          (updateWhereCount [] [PersonAge =. 100])+          [ withRecord @Person $ \case+              UpdateWhereCount _ _ -> Just 10+              _ -> Nothing+          ]+      result `shouldBe` 10++    it "deleteWhereCount" $ do+      result <-+        runMockSqlQueryT+          (deleteWhereCount [PersonName ==. "Alice"])+          [ withRecord @Person $ \case+              DeleteWhereCount _ -> Just 10+              _ -> Nothing+          ]+      result `shouldBe` 10++    it "getFieldName" $ do+      result <-+        runMockSqlQueryT+          (getFieldName PersonName)+          [ withRecord @Person $ \case+              GetFieldName PersonName -> Just "\"name\""+              _ -> Nothing+          ]+      result `shouldBe` "\"name\""++    it "getTableName" $ do+      result <-+        runMockSqlQueryT+          (getTableName $ person "Alice")+          [ withRecord @Person $ \case+              GetTableName _ -> Just "\"person\""+              _ -> Nothing+          ]+      result `shouldBe` "\"person\""++    it "withRawQuery" $ do+      let query = "SELECT name FROM person"+          row1 = [toPersistValue @String "Alice"]+          row2 = [toPersistValue @String "Bob"]+          rows = [row1, row2]+      result <-+        runMockSqlQueryT+          (withRawQuery query [] Conduit.sinkList)+          [ mockWithRawQuery $ \sql _ ->+              if sql == query+                then Just rows+                else Nothing+          ]+      result `shouldBe` rows++    it "rawQueryRes" $ do+      let row1 = [toPersistValue @String "Alice"]+          row2 = [toPersistValue @String "Bob"]+          rows = [row1, row2]+      acquire <-+        runMockSqlQueryT+          (rawQueryRes "SELECT name FROM person" [])+          [ mockRawQuery $ \_ _ -> Just rows+          ]+      result <- Acquire.with acquire $ \conduit ->+        runConduit $ conduit .| Conduit.sinkList+      result `shouldBe` rows++    it "rawQuery" $ do+      let row1 = [toPersistValue @String "Alice"]+          row2 = [toPersistValue @String "Bob"]+          rows = [row1, row2]+      result <-+        runResourceT $+          runMockSqlQueryT+            (runConduit $ rawQuery "SELECT name FROM person" [] .| Conduit.sinkList)+            [ mockRawQuery $ \_ _ -> Just rows+            ]+      result `shouldBe` rows++    it "rawExecute" $ do+      result <-+        runMockSqlQueryT+          (rawExecute "DELETE FROM person" [])+          [ mockQuery $ \case+              RawExecute _ _ -> Just ()+              _ -> Nothing+          ]+      result `shouldBe` ()++    it "rawExecuteCount" $ do+      result <-+        runMockSqlQueryT+          (rawExecuteCount "DELETE FROM person" [])+          [ mockQuery $ \case+              RawExecuteCount _ _ -> Just 10+              _ -> Nothing+          ]+      result `shouldBe` 10++    it "rawSql" $ do+      let names = ["Alice", "Bob"] :: [String]+      result <-+        runMockSqlQueryT+          (rawSql "SELECT name FROM person" [])+          [ mockRawSql $ \_ _ -> Just $ map ((: []) . toPersistValue) names+          ]+      map unSingle result `shouldBe` names
− test/MockedTest.hs
@@ -1,622 +0,0 @@-{- AUTOCOLLECT.TEST -}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE TypeApplications #-}--module MockedTest (-  -- $AUTOCOLLECT.TEST.export$-) where--import Conduit (runConduit, runResourceT, (.|))-import qualified Conduit-import qualified Data.Acquire as Acquire-import qualified Data.Map.Strict as Map-import Data.Maybe (listToMaybe)-import Database.Persist.Sql (-  Entity (..),-  Single (..),-  toPersistValue,-  toSqlKey,-  (=.),-  (==.),- )-import Test.Tasty-import Test.Tasty.HUnit-import UnliftIO (SomeException, try)--import Database.Persist.Monad-import Database.Persist.Monad.TestUtils-import Example--test =-  testGroup-    "withTransaction"-    [ testCase "it doesn't error with MockSqlQueryT" $-        runMockSqlQueryT-          (withTransaction $ insert_ $ person "Alice")-          [ withRecord @Person $ \case-              Insert_ _ -> Just ()-              _ -> Nothing-          ]-    ]--test =-  testGroup-    "MockSqlQueryT"-    [ testCase "it errors if it could not find a mock" $ do-        result <- try $ runMockSqlQueryT getPeopleNames []-        case result of-          Right _ -> assertFailure "runMockSqlQueryT did not fail"-          Left e -> do-            let msg = listToMaybe $ lines $ show (e :: SomeException)-            msg @?= Just "Could not find mock for query: SelectList{..}<Person>"-    , testCase "it continues after a mock doesn't match" $ do-        result <--          runMockSqlQueryT-            getPeopleNames-            [ withRecord @Post $ \_ -> error "getPeopleNames matched Post record"-            , mockQuery $ \_ -> Nothing-            , withRecord @Person $ \case-                SelectList _ _ ->-                  Just-                    [ Entity (toSqlKey 1) (Person "Alice" 10)-                    , Entity (toSqlKey 2) (Person "Bob" 20)-                    ]-                _ -> Nothing-            ]--        result @?= ["Alice", "Bob"]-    ]--test =-  testGroup-    "Persistent API"-    [ testCase "get" $ do-        result <--          runMockSqlQueryT-            (mapM get [1, 2])-            [ withRecord @Person $ \case-                Get n-                  | n == 1 -> Just $ Just $ person "Alice"-                  | n == 2 -> Just Nothing-                _ -> Nothing-            ]-        map (fmap personName) result @?= [Just "Alice", Nothing]-    , testCase "getMany" $ do-        result <--          runMockSqlQueryT-            (getMany [1])-            [ withRecord @Person $ \case-                GetMany _ -> Just $ Map.fromList [(1, person "Alice")]-                _ -> Nothing-            ]-        personName <$> Map.lookup 1 result @?= Just "Alice"-    , testCase "getJust" $ do-        result <--          runMockSqlQueryT-            (getJust 1)-            [ withRecord @Person $ \case-                GetJust _ -> Just $ person "Alice"-                _ -> Nothing-            ]-        personName result @?= "Alice"-    , testCase "getJustEntity" $ do-        result <--          runMockSqlQueryT-            (getJustEntity 1)-            [ withRecord @Person $ \case-                GetJustEntity _ -> Just $ Entity 1 $ person "Alice"-                _ -> Nothing-            ]-        getName result @?= "Alice"-    , testCase "getEntity" $ do-        result <--          runMockSqlQueryT-            (mapM getEntity [1, 2])-            [ withRecord @Person $ \case-                GetEntity n-                  | n == 1 -> Just $ Just $ Entity 1 $ person "Alice"-                  | n == 2 -> Just Nothing-                _ -> Nothing-            ]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "belongsTo" $ do-        let post1 = Post "Post #1" 1 (Just 1)-            post2 = Post "Post #2" 1 Nothing-        result <--          runMockSqlQueryT-            (mapM (belongsTo postEditor) [post1, post2])-            [ withRecord @(Post, Person) $ \case-                BelongsTo _ Post{postEditor = Just 1} -> Just $ Just $ person "Alice"-                BelongsTo _ Post{postEditor = Nothing} -> Just Nothing-                _ -> Nothing-            ]-        map (fmap personName) result @?= [Just "Alice", Nothing]-    , testCase "belongsToJust" $ do-        let post1 = Post "Post #1" 1 Nothing-        result <--          runMockSqlQueryT-            (belongsToJust postAuthor post1)-            [ withRecord @(Post, Person) $ \case-                BelongsToJust _ _ -> Just $ person "Alice"-                _ -> Nothing-            ]-        personName result @?= "Alice"-    , testCase "insert" $ do-        result <--          runMockSqlQueryT-            (insert $ person "Alice")-            [ withRecord @Person $ \case-                Insert _ -> Just 1-                _ -> Nothing-            ]-        result @?= 1-    , testCase "insert_" $ do-        result <--          runMockSqlQueryT-            (insert_ $ person "Alice")-            [ withRecord @Person $ \case-                Insert_ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "insertMany" $ do-        result <--          runMockSqlQueryT-            (insertMany [person "Alice", person "Bob"])-            [ withRecord @Person $ \case-                InsertMany records -> Just $ map fromIntegral [1 .. length records]-                _ -> Nothing-            ]-        result @?= [1, 2]-    , testCase "insertMany_" $ do-        result <--          runMockSqlQueryT-            (insertMany_ [person "Alice", person "Bob"])-            [ withRecord @Person $ \case-                InsertMany_ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "insertEntityMany" $ do-        result <--          runMockSqlQueryT-            (insertEntityMany [Entity 1 $ person "Alice"])-            [ withRecord @Person $ \case-                InsertEntityMany _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "insertKey" $ do-        result <--          runMockSqlQueryT-            (insertKey 1 $ person "Alice")-            [ withRecord @Person $ \case-                InsertKey _ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "repsert" $ do-        result <--          runMockSqlQueryT-            (repsert 1 $ person "Alice")-            [ withRecord @Person $ \case-                Repsert _ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "repsertMany" $ do-        result <--          runMockSqlQueryT-            (repsertMany [(1, person "Alice")])-            [ withRecord @Person $ \case-                RepsertMany _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "replace" $ do-        result <--          runMockSqlQueryT-            (replace 1 $ person "Alice")-            [ withRecord @Person $ \case-                Replace _ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "delete" $ do-        result <--          runMockSqlQueryT-            (delete @Person 1)-            [ withRecord @Person $ \case-                Delete _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "update" $ do-        result <--          runMockSqlQueryT-            (update 1 [PersonName =. "Alicia"])-            [ withRecord @Person $ \case-                Update _ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "updateGet" $ do-        result <--          runMockSqlQueryT-            (updateGet 1 [PersonName =. "Alicia"])-            [ withRecord @Person $ \case-                UpdateGet _ _ -> Just $ person "Alicia"-                _ -> Nothing-            ]-        personName result @?= "Alicia"-    , testCase "insertEntity" $ do-        let alice = person "Alice"-        result <--          runMockSqlQueryT-            (insertEntity alice)-            [ withRecord @Person $ \case-                InsertEntity _ -> Just $ Entity 1 alice-                _ -> Nothing-            ]-        entityVal result @?= alice-    , testCase "insertRecord" $ do-        let alice = person "Alice"-        result <--          runMockSqlQueryT-            (insertRecord alice)-            [ withRecord @Person $ \case-                InsertRecord _ -> Just alice-                _ -> Nothing-            ]-        result @?= alice-    , testCase "getBy" $ do-        result <--          runMockSqlQueryT-            (mapM getBy [UniqueName "Alice", UniqueName "Bob"])-            [ withRecord @Person $ \case-                GetBy (UniqueName "Alice") -> Just $ Just $ Entity 1 $ person "Alice"-                GetBy (UniqueName "Bob") -> Just Nothing-                _ -> Nothing-            ]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "getByValue" $ do-        result <--          runMockSqlQueryT-            (mapM getByValue [person "Alice", person "Bob"])-            [ withRecord @Person $ \case-                GetByValue Person{personName = "Alice"} -> Just $ Just $ Entity 1 $ person "Alice"-                GetByValue Person{personName = "Bob"} -> Just Nothing-                _ -> Nothing-            ]-        map (fmap getName) result @?= [Just "Alice", Nothing]-    , testCase "checkUnique" $ do-        result <--          runMockSqlQueryT-            (mapM checkUnique [person "Alice", person "Bob"])-            [ withRecord @Person $ \case-                CheckUnique Person{personName = "Alice"} -> Just $ Just $ UniqueName "Alice"-                CheckUnique Person{personName = "Bob"} -> Just Nothing-                _ -> Nothing-            ]-        result @?= [Just $ UniqueName "Alice", Nothing]-    , testCase "checkUniqueUpdateable" $ do-        result <--          runMockSqlQueryT-            (mapM checkUniqueUpdateable [Entity 1 $ person "Alice", Entity 2 $ person "Bob"])-            [ withRecord @Person $ \case-                CheckUniqueUpdateable (Entity _ Person{personName = "Alice"}) -> Just $ Just $ UniqueName "Alice"-                CheckUniqueUpdateable (Entity _ Person{personName = "Bob"}) -> Just Nothing-                _ -> Nothing-            ]-        result @?= [Just $ UniqueName "Alice", Nothing]-    , testCase "deleteBy" $ do-        result <--          runMockSqlQueryT-            (deleteBy $ UniqueName "Alice")-            [ withRecord @Person $ \case-                DeleteBy _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "insertUnique" $ do-        result <--          runMockSqlQueryT-            (mapM insertUnique [person "Alice", person "Bob"])-            [ withRecord @Person $ \case-                InsertUnique Person{personName = "Alice"} -> Just $ Just 1-                InsertUnique Person{personName = "Bob"} -> Just Nothing-                _ -> Nothing-            ]-        result @?= [Just 1, Nothing]-    , testCase "upsert" $ do-        let alice = person "Alice"-        result <--          runMockSqlQueryT-            (upsert alice [PersonAge =. 100])-            [ withRecord @Person $ \case-                Upsert _ _ -> Just $ Entity 1 alice-                _ -> Nothing-            ]-        result @?= Entity 1 alice-    , testCase "upsertBy" $ do-        let alice = person "Alice"-        result <--          runMockSqlQueryT-            (upsertBy (UniqueName "Alice") alice [PersonAge =. 100])-            [ withRecord @Person $ \case-                UpsertBy _ _ _ -> Just $ Entity 1 alice-                _ -> Nothing-            ]-        result @?= Entity 1 alice-    , testCase "putMany" $ do-        result <--          runMockSqlQueryT-            (putMany [person "Alice"])-            [ withRecord @Person $ \case-                PutMany _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "insertBy" $ do-        let alice = person "Alice"-        result <--          runMockSqlQueryT-            (mapM insertBy [alice, person "Bob"])-            [ withRecord @Person $ \case-                InsertBy Person{personName = "Alice"} -> Just $ Left $ Entity 1 alice-                InsertBy Person{personName = "Bob"} -> Just $ Right 2-                _ -> Nothing-            ]-        result @?= [Left $ Entity 1 alice, Right 2]-    , testCase "insertUniqueEntity" $ do-        let bob = person "Bob"-        result <--          runMockSqlQueryT-            (mapM insertUniqueEntity [person "Alice", bob])-            [ withRecord @Person $ \case-                InsertUniqueEntity Person{personName = "Alice"} -> Just Nothing-                InsertUniqueEntity Person{personName = "Bob"} -> Just $ Just $ Entity 1 bob-                _ -> Nothing-            ]-        result @?= [Nothing, Just $ Entity 1 bob]-    , testCase "replaceUnique" $ do-        result <--          runMockSqlQueryT-            (mapM (uncurry replaceUnique) [(1, person "Alice"), (2, person "Bob")])-            [ withRecord @Person $ \case-                ReplaceUnique _ Person{personName = "Alice"} -> Just Nothing-                ReplaceUnique _ Person{personName = "Bob"} -> Just $ Just $ UniqueName "Bob"-                _ -> Nothing-            ]-        result @?= [Nothing, Just $ UniqueName "Bob"]-    , testCase "onlyUnique" $ do-        result <--          runMockSqlQueryT-            (onlyUnique $ person "Alice")-            [ withRecord @Person $ \case-                OnlyUnique _ -> Just $ UniqueName "Alice"-                _ -> Nothing-            ]-        result @?= UniqueName "Alice"-    , testCase "selectSourceRes" $ do-        acquire <--          runMockSqlQueryT-            (selectSourceRes [] [])-            [ mockSelectSource $ \_ _ ->-                Just-                  [ Entity 1 $ person "Alice"-                  , Entity 2 $ person "Bob"-                  ]-            ]-        result <- Acquire.with acquire $ \conduit ->-          runConduit $ conduit .| Conduit.mapC getName .| Conduit.sinkList-        result @?= ["Alice", "Bob"]-    , testCase "selectFirst" $ do-        result1 <--          runMockSqlQueryT-            (selectFirst [PersonName ==. "Alice"] [])-            [ withRecord @Person $ \case-                SelectFirst _ _ -> Just $ Just $ Entity 1 $ person "Alice"-                _ -> Nothing-            ]-        getName <$> result1 @?= Just "Alice"-        result2 <--          runMockSqlQueryT-            (selectFirst [PersonName ==. "Alice"] [])-            [ withRecord @Person $ \case-                SelectFirst _ _ -> Just Nothing-                _ -> Nothing-            ]-        result2 @?= Nothing-    , testCase "selectKeysRes" $ do-        let keys = [1, 2, 3]-        acquire <--          runMockSqlQueryT-            (selectKeysRes @_ @Person [] [])-            [ mockSelectKeys $ \_ _ -> Just keys-            ]-        result <- Acquire.with acquire $ \conduit ->-          runConduit $ conduit .| Conduit.sinkList-        result @?= keys-    , testCase "count" $ do-        result <--          runMockSqlQueryT-            (count @Person [])-            [ withRecord @Person $ \case-                Count _ -> Just 10-                _ -> Nothing-            ]-        result @?= 10-    , testCase "exists" $ do-        result <--          runMockSqlQueryT-            (exists @Person [])-            [ withRecord @Person $ \case-                Exists _ -> Just True-                _ -> Nothing-            ]-        result @?= True-    , testCase "selectSource" $ do-        result <--          runResourceT $-            runMockSqlQueryT-              (runConduit $ selectSource [] [] .| Conduit.mapC getName .| Conduit.sinkList)-              [ mockSelectSource $ \_ _ ->-                  Just-                    [ Entity 1 $ person "Alice"-                    , Entity 2 $ person "Bob"-                    ]-              ]-        result @?= ["Alice", "Bob"]-    , testCase "selectKeys" $ do-        let keys = [1, 2, 3]-        result <--          runResourceT $-            runMockSqlQueryT-              (runConduit $ selectKeys @Person [] [] .| Conduit.sinkList)-              [ mockSelectKeys $ \_ _ -> Just keys-              ]-        result @?= keys-    , testCase "selectList" $ do-        result <--          runMockSqlQueryT-            (selectList [] [])-            [ withRecord @Person $ \case-                SelectList _ _ ->-                  Just-                    [ Entity 1 (person "Alice")-                    , Entity 2 (person "Bob")-                    ]-                _ -> Nothing-            ]-        map getName result @?= ["Alice", "Bob"]-    , testCase "selectKeysList" $ do-        let keys = [1, 2, 3]-        result <--          runMockSqlQueryT-            (selectKeysList @Person [] [])-            [ withRecord @Person $ \case-                SelectKeysList _ _ -> Just keys-                _ -> Nothing-            ]-        result @?= keys-    , testCase "updateWhere" $ do-        result <--          runMockSqlQueryT-            (updateWhere [] [PersonAge =. 100])-            [ withRecord @Person $ \case-                UpdateWhere _ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "deleteWhere" $ do-        result <--          runMockSqlQueryT-            (deleteWhere [PersonName ==. "Alice"])-            [ withRecord @Person $ \case-                DeleteWhere _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "updateWhereCount" $ do-        result <--          runMockSqlQueryT-            (updateWhereCount [] [PersonAge =. 100])-            [ withRecord @Person $ \case-                UpdateWhereCount _ _ -> Just 10-                _ -> Nothing-            ]-        result @?= 10-    , testCase "deleteWhereCount" $ do-        result <--          runMockSqlQueryT-            (deleteWhereCount [PersonName ==. "Alice"])-            [ withRecord @Person $ \case-                DeleteWhereCount _ -> Just 10-                _ -> Nothing-            ]-        result @?= 10-    , testCase "getFieldName" $ do-        result <--          runMockSqlQueryT-            (getFieldName PersonName)-            [ withRecord @Person $ \case-                GetFieldName PersonName -> Just "\"name\""-                _ -> Nothing-            ]-        result @?= "\"name\""-    , testCase "getTableName" $ do-        result <--          runMockSqlQueryT-            (getTableName $ person "Alice")-            [ withRecord @Person $ \case-                GetTableName _ -> Just "\"person\""-                _ -> Nothing-            ]-        result @?= "\"person\""-    , testCase "withRawQuery" $ do-        let query = "SELECT name FROM person"-            row1 = [toPersistValue @String "Alice"]-            row2 = [toPersistValue @String "Bob"]-            rows = [row1, row2]-        result <--          runMockSqlQueryT-            (withRawQuery query [] Conduit.sinkList)-            [ mockWithRawQuery $ \sql _ ->-                if sql == query-                  then Just rows-                  else Nothing-            ]-        result @?= rows-    , testCase "rawQueryRes" $ do-        let row1 = [toPersistValue @String "Alice"]-            row2 = [toPersistValue @String "Bob"]-            rows = [row1, row2]-        acquire <--          runMockSqlQueryT-            (rawQueryRes "SELECT name FROM person" [])-            [ mockRawQuery $ \_ _ -> Just rows-            ]-        result <- Acquire.with acquire $ \conduit ->-          runConduit $ conduit .| Conduit.sinkList-        result @?= rows-    , testCase "rawQuery" $ do-        let row1 = [toPersistValue @String "Alice"]-            row2 = [toPersistValue @String "Bob"]-            rows = [row1, row2]-        result <--          runResourceT $-            runMockSqlQueryT-              (runConduit $ rawQuery "SELECT name FROM person" [] .| Conduit.sinkList)-              [ mockRawQuery $ \_ _ -> Just rows-              ]-        result @?= rows-    , testCase "rawExecute" $ do-        result <--          runMockSqlQueryT-            (rawExecute "DELETE FROM person" [])-            [ mockQuery $ \case-                RawExecute _ _ -> Just ()-                _ -> Nothing-            ]-        result @?= ()-    , testCase "rawExecuteCount" $ do-        result <--          runMockSqlQueryT-            (rawExecuteCount "DELETE FROM person" [])-            [ mockQuery $ \case-                RawExecuteCount _ _ -> Just 10-                _ -> Nothing-            ]-        result @?= 10-    , testCase "rawSql" $ do-        let names = ["Alice", "Bob"] :: [String]-        result <--          runMockSqlQueryT-            (rawSql "SELECT name FROM person" [])-            [ mockRawSql $ \_ _ -> Just $ map ((: []) . toPersistValue) names-            ]-        map unSingle result @?= names-    ]
+ test/READMESpec.hs view
@@ -0,0 +1,30 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE TypeApplications #-}++module READMESpec (spec) where++import Skeletest++import Database.Persist.Monad+import Database.Persist.Monad.TestUtils+import Example++spec :: Spec+spec = do+  it "withTransaction example works" $ do+    let foo :: (MonadSqlQuery m) => m ()+        foo = insert_ $ person "Alice"+        bar :: (MonadSqlQuery m) => m ()+        bar = insert_ $ person "Bob"+        fooAndBar :: (MonadSqlQuery m) => m ()+        fooAndBar = withTransaction $ foo >> bar+    runMockSqlQueryT+      fooAndBar+      [ withRecord @Person $ \case+          Insert_ _ -> Just ()+          _ -> Nothing+      , withRecord @Person $ \case+          Insert_ _ -> Just ()+          _ -> Nothing+      ]
− test/READMETest.hs
@@ -1,32 +0,0 @@-{- AUTOCOLLECT.TEST -}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE TypeApplications #-}--module READMETest (-  -- $AUTOCOLLECT.TEST.export$-) where--import Test.Tasty.HUnit--import Database.Persist.Monad-import Database.Persist.Monad.TestUtils-import Example--test =-  testCase "withTransaction example works" $ do-    let foo :: (MonadSqlQuery m) => m ()-        foo = insert_ $ person "Alice"-        bar :: (MonadSqlQuery m) => m ()-        bar = insert_ $ person "Bob"-        fooAndBar :: (MonadSqlQuery m) => m ()-        fooAndBar = withTransaction $ foo >> bar-    runMockSqlQueryT-      fooAndBar-      [ withRecord @Person $ \case-          Insert_ _ -> Just ()-          _ -> Nothing-      , withRecord @Person $ \case-          Insert_ _ -> Just ()-          _ -> Nothing-      ]
+ test/SqlQueryRepSpec.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE CPP #-}++module SqlQueryRepSpec (spec) where++import Skeletest+import qualified Skeletest.Predicate as P++import Generated++persistentVersion :: String+#if MIN_VERSION_persistent(2,15,0)+persistentVersion = error "Running tests against persistent > 2.14 is not supported"+#elif MIN_VERSION_persistent(2,14,0)+persistentVersion = "2.14"+#else+persistentVersion = error "Running tests against persistent < 2.14 is not supported"+#endif++spec :: Spec+spec = do+  describe "SqlQueryRep" $ do+    it ("renders with Show (persistent-" <> persistentVersion <> ")") $ do+      unlines allSqlQueryRepShowRepresentations `shouldSatisfy` P.matchesSnapshot
− test/SqlQueryRepTest.hs
@@ -1,33 +0,0 @@-{- AUTOCOLLECT.TEST -}-{-# LANGUAGE CPP #-}--module SqlQueryRepTest (-  -- $AUTOCOLLECT.TEST.export$-) where--import qualified Data.ByteString.Lazy.Char8 as Char8-import Test.Tasty-import Test.Tasty.Golden--import Generated--persistentVersionDir :: FilePath-#if MIN_VERSION_persistent(2,15,0)-persistentVersionDir = error "Running tests against persistent > 2.14 is not supported"-#elif MIN_VERSION_persistent(2,14,0)-persistentVersionDir = "persistent-2.14/"-#elif MIN_VERSION_persistent(2,13,0)-persistentVersionDir = "persistent-2.13/"-#else-persistentVersionDir = error "Running tests against persistent < 2.13 is not supported"-#endif--test =-  golden "Show representation" (persistentVersionDir ++ "sqlqueryrep_show_representation.golden") $-    pure $-      unlines allSqlQueryRepShowRepresentations--golden :: String -> FilePath -> IO String -> TestTree-golden name fp action = goldenVsStringDiff name diffCmd ("test/goldens/" ++ fp) $ Char8.pack <$> action-  where-    diffCmd expected actual = ["diff", "-u", expected, actual]
test/TestUtils/Esqueleto.hs view
@@ -5,7 +5,6 @@ ) where  import qualified Database.Esqueleto.Experimental as E-import qualified Database.Esqueleto.Internal.Internal as E  import Database.Persist.Monad (MonadSqlQuery, unsafeLiftSql) 
+ test/__snapshots__/SqlQueryRepSpec.snap.md view
@@ -0,0 +1,72 @@+# SqlQueryRep++## SqlQueryRep / renders with Show (persistent-2.14)++```+Get{..}<Person>+GetMany{..}<Person>+GetJust{..}<Person>+GetJustEntity{..}<Person>+GetEntity{..}<Person>+BelongsTo{..}<(Person,Post)>+BelongsToJust{..}<(Person,Post)>+Insert{..}<Person>+Insert_{..}<Person>+InsertMany{..}<Person>+InsertMany_{..}<Person>+InsertEntityMany{..}<Person>+InsertKey{..}<Person>+Repsert{..}<Person>+RepsertMany{..}<Person>+Replace{..}<Person>+Delete{..}<Person>+Update{..}<Person>+UpdateGet{..}<Person>+InsertEntity{..}<Person>+InsertRecord{..}<Person>+GetBy{..}<Person>+GetByValue{..}<Person>+CheckUnique{..}<Person>+CheckUniqueUpdateable{..}<Person>+DeleteBy{..}<Person>+InsertUnique{..}<Person>+Upsert{..}<Person>+UpsertBy{..}<Person>+PutMany{..}<Person>+InsertBy{..}<Person>+InsertUniqueEntity{..}<Person>+ReplaceUnique{..}<Person>+OnlyUnique{..}<Person>+SelectSourceRes{..}<Person>+SelectFirst{..}<Person>+SelectKeysRes{..}<Person>+Count{..}<Person>+Exists{..}<Person>+SelectList{..}<Person>+SelectKeysList{..}<Person>+UpdateWhere{..}<Person>+DeleteWhere{..}<Person>+DeleteWhereCount{..}<Person>+UpdateWhereCount{..}<Person>+ParseMigration{..}+ParseMigration'{..}+PrintMigration{..}+ShowMigration{..}+GetMigration{..}+RunMigration{..}+RunMigrationQuiet{..}+RunMigrationSilent{..}+RunMigrationUnsafe{..}+RunMigrationUnsafeQuiet{..}+GetFieldName{..}<Person>+GetTableName{..}<Person>+WithRawQuery{..}+RawQueryRes{..}+RawExecute{..}+RawExecuteCount{..}+RawSql{..}+TransactionSave{..}+TransactionSaveWithIsolation{..}+TransactionUndo{..}+TransactionUndoWithIsolation{..}+```
− test/goldens/persistent-2.13/sqlqueryrep_show_representation.golden
@@ -1,66 +0,0 @@-Get{..}<Person>-GetMany{..}<Person>-GetJust{..}<Person>-GetJustEntity{..}<Person>-GetEntity{..}<Person>-BelongsTo{..}<(Person,Post)>-BelongsToJust{..}<(Person,Post)>-Insert{..}<Person>-Insert_{..}<Person>-InsertMany{..}<Person>-InsertMany_{..}<Person>-InsertEntityMany{..}<Person>-InsertKey{..}<Person>-Repsert{..}<Person>-RepsertMany{..}<Person>-Replace{..}<Person>-Delete{..}<Person>-Update{..}<Person>-UpdateGet{..}<Person>-InsertEntity{..}<Person>-InsertRecord{..}<Person>-GetBy{..}<Person>-GetByValue{..}<Person>-CheckUnique{..}<Person>-CheckUniqueUpdateable{..}<Person>-DeleteBy{..}<Person>-InsertUnique{..}<Person>-Upsert{..}<Person>-UpsertBy{..}<Person>-PutMany{..}<Person>-InsertBy{..}<Person>-InsertUniqueEntity{..}<Person>-ReplaceUnique{..}<Person>-OnlyUnique{..}<Person>-SelectSourceRes{..}<Person>-SelectFirst{..}<Person>-SelectKeysRes{..}<Person>-Count{..}<Person>-Exists{..}<Person>-SelectList{..}<Person>-SelectKeysList{..}<Person>-UpdateWhere{..}<Person>-DeleteWhere{..}<Person>-DeleteWhereCount{..}<Person>-UpdateWhereCount{..}<Person>-ParseMigration{..}-ParseMigration'{..}-PrintMigration{..}-ShowMigration{..}-GetMigration{..}-RunMigration{..}-RunMigrationQuiet{..}-RunMigrationSilent{..}-RunMigrationUnsafe{..}-RunMigrationUnsafeQuiet{..}-GetFieldName{..}<Person>-GetTableName{..}<Person>-WithRawQuery{..}-RawQueryRes{..}-RawExecute{..}-RawExecuteCount{..}-RawSql{..}-TransactionSave{..}-TransactionSaveWithIsolation{..}-TransactionUndo{..}-TransactionUndoWithIsolation{..}
− test/goldens/persistent-2.14/sqlqueryrep_show_representation.golden
@@ -1,66 +0,0 @@-Get{..}<Person>-GetMany{..}<Person>-GetJust{..}<Person>-GetJustEntity{..}<Person>-GetEntity{..}<Person>-BelongsTo{..}<(Person,Post)>-BelongsToJust{..}<(Person,Post)>-Insert{..}<Person>-Insert_{..}<Person>-InsertMany{..}<Person>-InsertMany_{..}<Person>-InsertEntityMany{..}<Person>-InsertKey{..}<Person>-Repsert{..}<Person>-RepsertMany{..}<Person>-Replace{..}<Person>-Delete{..}<Person>-Update{..}<Person>-UpdateGet{..}<Person>-InsertEntity{..}<Person>-InsertRecord{..}<Person>-GetBy{..}<Person>-GetByValue{..}<Person>-CheckUnique{..}<Person>-CheckUniqueUpdateable{..}<Person>-DeleteBy{..}<Person>-InsertUnique{..}<Person>-Upsert{..}<Person>-UpsertBy{..}<Person>-PutMany{..}<Person>-InsertBy{..}<Person>-InsertUniqueEntity{..}<Person>-ReplaceUnique{..}<Person>-OnlyUnique{..}<Person>-SelectSourceRes{..}<Person>-SelectFirst{..}<Person>-SelectKeysRes{..}<Person>-Count{..}<Person>-Exists{..}<Person>-SelectList{..}<Person>-SelectKeysList{..}<Person>-UpdateWhere{..}<Person>-DeleteWhere{..}<Person>-DeleteWhereCount{..}<Person>-UpdateWhereCount{..}<Person>-ParseMigration{..}-ParseMigration'{..}-PrintMigration{..}-ShowMigration{..}-GetMigration{..}-RunMigration{..}-RunMigrationQuiet{..}-RunMigrationSilent{..}-RunMigrationUnsafe{..}-RunMigrationUnsafeQuiet{..}-GetFieldName{..}<Person>-GetTableName{..}<Person>-WithRawQuery{..}-RawQueryRes{..}-RawExecute{..}-RawExecuteCount{..}-RawSql{..}-TransactionSave{..}-TransactionSaveWithIsolation{..}-TransactionUndo{..}-TransactionUndoWithIsolation{..}