public void AddFakeEntityWithTransaction()
        {
            var entities = new List <FakeEntity>
            {
                new FakeEntity {
                    Name = Guid.NewGuid().ToString(), CreatedTime = DateTime.Now
                },
                new FakeEntity {
                    Name = Guid.NewGuid().ToString(), CreatedTime = DateTime.Now
                },
            };

            using (var transaction = _fakeDbContext.Database.BeginTransaction())
            {
                try
                {
                    _fakeDbContext.Set <FakeEntity>().AddRange(entities);
                    _fakeDbContext.SaveChanges();
                    //throw new Exception();
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                }
            }
        }
        public void Should_Audit_When_EntityState_SoftDeleted()
        {
            var options      = DatabaseOptions <FakeDbContext>();
            var fakeEntities = new FakeEntities();

            using (IDbContext context = new FakeDbContext(options))
            {
                var dbSet = context.Set <FakeEntity>();
                dbSet.AddRange(fakeEntities);
                context.SaveChanges();
            }

            using (IDbContext context = new FakeDbContext(options))
            {
                var dbSet = context.Set <FakeEntity>();
                dbSet.RemoveRange(fakeEntities);
                context.Audit();

                var auditEntries = context.GetCurrentEntries();

                Assert.All(auditEntries, prop => Assert.Equal(Principal.Identity.Name, prop.CurrentValues[nameof(FakeEntity.ModifiedBy)]));
                Assert.All(auditEntries, prop => Assert.True((bool)prop.CurrentValues[nameof(FakeEntity.IsDeleted)]));
                Assert.All(auditEntries, prop => Assert.Equal((DateTime)prop.CurrentValues[nameof(FakeEntity.ModifiedTime)], (DateTime)prop.CurrentValues[nameof(FakeEntity.DeletedTime)], TimeSpan.FromMinutes(1)));
            }
        }
        public void Should_Audit_When_EntityState_Modified()
        {
            var options      = DatabaseOptions <FakeDbContext>();
            var fakeEntities = new FakeEntities();

            using (IDbContext context = new FakeDbContext(options))
            {
                var dbSet = context.Set <FakeEntity>();
                dbSet.AddRange(fakeEntities);
                context.SaveChanges();
            }

            using (IDbContext context = new FakeDbContext(options))
            {
                var dbSet = context.Set <FakeEntity>();
                dbSet.AttachRange(fakeEntities);
                fakeEntities.ForEach(entity => entity.EntityName = "Modified");
                context.Audit();

                var auditEntries   = context.GetCurrentEntries();
                var modifyDateTime = (DateTime)auditEntries.First().CurrentValues[nameof(FakeEntity.ModifiedTime)];

                Assert.All(auditEntries, prop => Assert.Equal("Modified", prop.CurrentValues[nameof(FakeEntity.EntityName)]));
                Assert.All(auditEntries, prop => Assert.Equal(Principal.Identity.Name, prop.CurrentValues[nameof(FakeEntity.ModifiedBy)]));
                Assert.All(auditEntries, prop => Assert.Equal(modifyDateTime, (DateTime)prop.CurrentValues[nameof(FakeEntity.ModifiedTime)], TimeSpan.FromMinutes(1)));
            }
        }
        /// <summary>
        /// Ensures that there is fake aggregate roots with the specified count
        /// </summary>
        /// <param name="count">Count of fake aggregate roots</param>
        protected IReadOnlyCollection <FakeAggregateRoot> EnsureHasFakeAggregateRoots(int count)
        {
            for (int i = 0; i < count; i++)
            {
                var fakeAggregateRoot = new FakeAggregateRoot(GenerateRandomName());

                _dbContext
                .Set <FakeAggregateRoot>()
                .Add(fakeAggregateRoot);
            }

            _dbContext.SaveChanges();

            return(_dbContext
                   .Set <FakeAggregateRoot>()
                   .ToList());
        }
        public void Should_Set_Entity()
        {
            using (IDbContext context = new FakeDbContext(DatabaseOptions <FakeDbContext>()))
            {
                var dbSet = context.Set <FakeEntity>();

                Assert.NotNull(dbSet);
            }
        }
        public void Should_Audit_When_EntityState_Added()
        {
            var fakeEntities = new FakeEntities();

            using (IDbContext context = new FakeDbContext(DatabaseOptions <FakeDbContext>()))
            {
                var dbSet = context.Set <FakeEntity>();
                dbSet.AddRange(fakeEntities);
                context.Audit();

                var auditEntries  = context.GetCurrentEntries();
                var entryDateTime = (DateTime)auditEntries.First().CurrentValues[nameof(FakeEntity.CreatedTime)];

                Assert.All(auditEntries, prop => Assert.Equal(Principal.Identity.Name, prop.CurrentValues[nameof(FakeEntity.CreatedBy)]));
                Assert.All(auditEntries, prop => Assert.Equal(entryDateTime, (DateTime)prop.CurrentValues[nameof(FakeEntity.CreatedTime)], TimeSpan.FromMinutes(1)));
                Assert.All(auditEntries, prop => Assert.Null(prop.CurrentValues[nameof(FakeEntity.ModifiedBy)]));
                Assert.All(auditEntries, prop => Assert.Null(prop.CurrentValues[nameof(FakeEntity.ModifiedTime)]));
            }
        }
        public void Delete_ExistingEntity_Deleted()
        {
            // Arrange
            const int id = 30;

            var dbContextOptionsBuilder = new DbContextOptionsBuilder <DbContext>().UseInMemoryDatabase(nameof(Delete_ExistingEntity_Deleted));
            var fakeDbContext           = new FakeDbContext(dbContextOptionsBuilder.Options, "dbo");
            var entity = fakeDbContext.Add(new FakeEntity {
                Id = id
            }).Entity;

            fakeDbContext.SaveChanges();

            var repository = new Repository <FakeEntity, int>(fakeDbContext);

            // Act
            repository.Delete(entity);
            fakeDbContext.SaveChanges();

            // Assert
            Assert.False(fakeDbContext.Set <FakeEntity>().Any(x => x.Id == id));
        }