public void does_not_publish_add_audit_on_error()
        {
            //setup
            var context = CreateUserContext();
            var mockPublisher = new Mock<IAuditEventPublisher>();

            //act
            Exception expectedException = null;
            using (var subject = new TestAuditableContext(GetEFConnectionString(), context, mockPublisher.Object, _defaultMockConfiguration.Object))
            {
                var invalidEntity = new Gender { Name = new string('x', 500) };
                subject.Genders.AddObject(invalidEntity);
                try
                {
                    subject.SaveChanges();
                }
                catch (Exception ex)
                {
                    expectedException = ex;
                }
            }

            Assert.IsNotNull(expectedException); //sanity check

            //assert
            mockPublisher.Verify(m => m.Publish(It.IsAny<AuditEvent>()), Times.Never());
        }
        public void tells_if_has_changes_when_properties_are_modified()
        {
            //setup
            EntityUpdatedAudit subject;
            var initialName = Guid.NewGuid().ToString();
            var newName = Guid.NewGuid().ToString();

            var entity = new Gender();
            entity.Name = initialName;
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }

            entity = GetGenderById(id);
            entity.Name = newName;
            entity.IsEnabled = true;

            using (var updateContext = CreateObjectContext())
            {
                var currentEntity = updateContext.Genders.Single(g => g.Id == entity.Id);
                updateContext.Genders.ApplyCurrentValues(entity);
                var objectStateEntry = updateContext.ObjectStateManager.GetObjectStateEntry(currentEntity);

                //act
                subject = new EntityUpdatedAudit(objectStateEntry);

            }

            //assert
            Assert.IsTrue(subject.HasChanges);
        }
Esempio n. 3
0
        public void tracks_action_identifier_and_type()
        {
            EntityReadAudit subject;

            //setup
            var initialValue = Guid.NewGuid().ToString();

            var entity = new Gender();
            entity.Name = initialValue;
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }

            using (var readContext = CreateObjectContext())
            {
                entity = readContext.Genders.Single(g => g.Id == id);
                readContext.DeleteObject(entity);
                var objectStateEntry = readContext.ObjectStateManager.GetObjectStateEntry(entity);

                //act
                subject = new EntityReadAudit(entity);
            }

            //assert
            Assert.AreEqual(AuditEntityAction.Read, subject.AuditEntityAction);
            Assert.AreEqual(typeof(Gender).Name, subject.EntityType);
            Assert.AreEqual(id.ToString(), subject.EntityIdentifier);
        }
        public void tracks_properties()
        {
            //setup
            var nameValue = Guid.NewGuid().ToString();
            var entity = new Gender();
            entity.Name = nameValue;
            var context = CreateObjectContext();
            context.Genders.AddObject(entity);
            var objectStateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);
            context.SaveChanges();

            //act
            var subject = new EntityAddedAudit(objectStateEntry);
            subject.TrackPropertiesAfterAdd();

            //assert
            Assert.AreNotEqual(noId, subject.EntityIdentifier);

            var namePropertyAudit = subject.AuditEntityProperties.Where(p => p.PropertyName == "Name").SingleOrDefault();
            Assert.IsNotNull(namePropertyAudit);
            Assert.AreEqual(nameValue, namePropertyAudit.NewValue);

            var isEnabledPropertyAudit = subject.AuditEntityProperties.Where(p => p.PropertyName == "IsEnabled").SingleOrDefault();
            Assert.IsNotNull(isEnabledPropertyAudit);
            Assert.AreEqual(false.ToString(), isEnabledPropertyAudit.NewValue);

            var versionPropertyAudit = subject.AuditEntityProperties.Where(p => p.PropertyName == "Version").SingleOrDefault();
            Assert.IsNull(versionPropertyAudit);
        }
        public void does_not_track_database_generated_properties()
        {
            //setup
            EntityUpdatedAudit subject;
            var initialName = Guid.NewGuid().ToString();
            var newName = Guid.NewGuid().ToString();

            var entity = new Gender();
            entity.Name = initialName;
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }

            entity = GetGenderById(id);

            using (var updateContext = CreateObjectContext())
            {
                var currentEntity = updateContext.Genders.Single(g => g.Id == entity.Id);
                updateContext.Genders.ApplyCurrentValues(entity);
                var objectStateEntry = updateContext.ObjectStateManager.GetObjectStateEntry(currentEntity);

                //act
                subject = new EntityUpdatedAudit(objectStateEntry);
            }

            var versionPropertyAudit = subject.AuditEntityProperties.Where(p => p.PropertyName == "Version").SingleOrDefault();
            Assert.IsNull(versionPropertyAudit);
        }
        public void tracks_action()
        {
            EntityDeletedAudit subject;

            //setup
            var initialValue = Guid.NewGuid().ToString();

            var entity = new Gender();
            entity.Name = initialValue;
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }

            using (var deleteContext = CreateObjectContext())
            {
                entity = deleteContext.Genders.Single(g => g.Id == id);
                deleteContext.DeleteObject(entity);
                var objectStateEntry = deleteContext.ObjectStateManager.GetObjectStateEntry(entity);

                //act
                subject = new EntityDeletedAudit(objectStateEntry);
            }

            //assert
            Assert.AreEqual(AuditEntityAction.Delete, subject.AuditEntityAction);
        }
        public void tells_if_does_not_have_changes_when_no_properties_change()
        {
            var initialValue = Guid.NewGuid().ToString();
            var entity = new Gender();
            entity.Name = initialValue;
            var context = CreateObjectContext();
            context.Genders.Attach(entity);
            context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
            var objectStateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);

            //act
            var subject = new TrackingAuditEntityProperty("Name", objectStateEntry);

            Assert.IsFalse(subject.HasChanges);
        }
        public void tracks_entity_type()
        {
            //setup
            var entity = new Gender();
            entity.Name = Guid.NewGuid().ToString();
            var context = CreateObjectContext();
            context.Genders.AddObject(entity);
            var objectStateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);
            context.SaveChanges();

            //act
            var subject = new TrackingAuditEntity(objectStateEntry, AuditEntityAction.Add);

            //assert
            Assert.AreEqual(typeof(Gender).Name, subject.EntityType);
        }
        public void tracks_action()
        {
            //setup
            var entity = new Gender();
            entity.Name = Guid.NewGuid().ToString();
            var context = CreateObjectContext();
            context.Genders.AddObject(entity);
            var objectStateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);
            context.SaveChanges();

            //act
            var subject = new EntityAddedAudit(objectStateEntry);

            //assert
            Assert.AreEqual(AuditEntityAction.Add, subject.AuditEntityAction);
        }
        public void tracks_property_value_on_add()
        {
            //setup
            var newValue = Guid.NewGuid().ToString();
            var entity = new Gender();
            entity.Name = newValue;
            var context = CreateObjectContext();
            context.Genders.AddObject(entity);
            var objectStateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);

            //act
            var subject = new TrackingAuditEntityProperty("Name", objectStateEntry);

            //assert
            Assert.AreEqual("Name", subject.PropertyName);
            Assert.AreEqual(newValue, subject.NewValue);
        }
        public void tracks_add()
        {
            //setup
            var subject = new TrackingAuditEvent(CreateUserContext());

            var entity = new Gender();
            entity.Name = Guid.NewGuid().ToString();
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                //act
                subject.TrackAdd(addContext.ObjectStateManager.GetObjectStateEntry(entity));
            }

            //assert
            Assert.AreEqual(1, subject.AuditEntities.Count);
            var auditEntity = subject.AuditEntities[0];
            Assert.AreEqual(typeof(EntityAddedAudit), auditEntity.GetType());
        }
        public void tracks_property_value_on_update()
        {
            //setup
            var newValue = Guid.NewGuid().ToString();
            var initialValue = Guid.NewGuid().ToString();
            var entity = new Gender();
            entity.Name = initialValue;
            var context = CreateObjectContext();
            context.Genders.Attach(entity);
            entity.Name = newValue;
            context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
            var objectStateEntry = context.ObjectStateManager.GetObjectStateEntry(entity);

            //act
            var subject = new TrackingAuditEntityProperty("Name", objectStateEntry);

            //assert
            Assert.AreEqual("Name", subject.PropertyName);
            Assert.AreEqual(initialValue, subject.OriginalValue);
            Assert.AreEqual(newValue, subject.NewValue);
        }
        public void tracks_add_multiple()
        {
            //setup
            var subject = new TrackingAuditEvent(CreateUserContext());

            for (int x = 0; x < 10; x++)
            {
                var entity = new Gender();
                entity.Name = Guid.NewGuid().ToString();
                using (var addContext = CreateObjectContext())
                {
                    addContext.Genders.AddObject(entity);
                    addContext.SaveChanges();
                    //act
                    subject.TrackAdd(addContext.ObjectStateManager.GetObjectStateEntry(entity));
                }
            }

            //assert
            Assert.AreEqual(10, subject.AuditEntities.Count);
        }
        public void honors_false_configuration_when_adding()
        {
            //setup
            var context = CreateUserContext();
            var mockPublisher = new Mock<IAuditEventPublisher>();

            var mockConfig = new Mock<IAuditConfiguration>();
            mockConfig.Setup(m => m.ContainsEntityType(typeof(Gender))).Returns(false);

            //act
            using (var subject = new TestAuditableContext(GetEFConnectionString(), context, mockPublisher.Object, mockConfig.Object))
            {
                var entity = new Gender { Name = Guid.NewGuid().ToString() };
                subject.Genders.AddObject(entity);
                subject.SaveChanges();
            }

            //assert
            mockPublisher.Verify(m => m.Publish(It.IsAny<AuditEvent>()), Times.Never());
        }
        public void tracks_update()
        {
            //setup
            var subject = new TrackingAuditEvent(CreateUserContext());

            var entity = new Gender();
            entity.Name = Guid.NewGuid().ToString();
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }
            entity = GetGenderById(id);
            entity.Name = Guid.NewGuid().ToString();
            using (var updateContext = CreateObjectContext())
            {
                var currentEntity = updateContext.Genders.Single(g => g.Id == id);
                updateContext.Genders.ApplyCurrentValues(entity);

                //act
                subject.TrackUpdate(updateContext.ObjectStateManager.GetObjectStateEntry(currentEntity));
            }

            //assert
            Assert.AreEqual(1, subject.AuditEntities.Count);
            var auditEntity = subject.AuditEntities[0];
            Assert.AreEqual(typeof(EntityUpdatedAudit), auditEntity.GetType());
        }
        public void honors_true_configuration_when_adding()
        {
            //setup
            var context = CreateUserContext();
            var mockPublisher = new Mock<IAuditEventPublisher>();

            var mockConfig = new Mock<IAuditConfiguration>();
            mockConfig.Setup(m => m.ContainsEntityType(typeof(Gender))).Returns(true);

            //act
            using (var subject = new TestAuditableContext(GetEFConnectionString(), context, mockPublisher.Object, mockConfig.Object))
            {
                var entity = new Gender { Name = Guid.NewGuid().ToString() };
                subject.Genders.AddObject(entity);
                subject.SaveChanges();
            }

            //assert
            mockPublisher.Verify
                (
                m => m.Publish
                    (
                        It.Is<AuditEvent>
                        (
                            auditEvent =>
                            EventMatchesContext(auditEvent, context)
                            &&
                            auditEvent.AuditEntities.Count() == 1
                            &&
                            auditEvent.AuditEntities[0].AuditEntityAction == AuditEntityAction.Add
                        )
                    ),
                    Times.Once()
                );
        }
        public void publishes_add_audit()
        {
            //setup
            var context = CreateUserContext();
            var mockPublisher = new Mock<IAuditEventPublisher>();

            var entity = new Gender { Name = Guid.NewGuid().ToString() };

            //act
            using (var subject = new TestAuditableContext(GetEFConnectionString(), context, mockPublisher.Object, _defaultMockConfiguration.Object))
            {
                subject.Genders.AddObject(entity);
                subject.SaveChanges();
            }

            //assert
            mockPublisher.Verify
                (
                m => m.Publish
                    (
                        It.Is<AuditEvent>
                        (
                            auditEvent =>
                            EventMatchesContext(auditEvent, context)
                            &&
                            auditEvent.AuditEntities.Count() == 1
                            &&
                            auditEvent.AuditEntities[0].AuditEntityAction == AuditEntityAction.Add
                            &&
                            !string.IsNullOrEmpty(auditEvent.AuditEntities[0].EntityIdentifier)
                            &&
                            auditEvent.AuditEntities[0].EntityIdentifier != "0"
                            &&
                            !auditEvent.AuditEntities[0].AuditEntityProperties
                                .Select(p => p.PropertyName)
                                    .Contains("Id")
                        )
                    ),
                    Times.Once()
                );
        }
        public void tracks_properties()
        {
            //setup
            EntityUpdatedAudit subject;
            var initialName = Guid.NewGuid().ToString();
            var newName = Guid.NewGuid().ToString();

            var entity = new Gender();
            entity.Name = initialName;
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }

            entity = GetGenderById(id);
            entity.Name = newName;
            entity.IsEnabled = true;

            using (var updateContext = CreateObjectContext())
            {
                var currentEntity = updateContext.Genders.Single(g => g.Id == entity.Id);
                updateContext.Genders.ApplyCurrentValues(entity);
                var objectStateEntry = updateContext.ObjectStateManager.GetObjectStateEntry(currentEntity);

                //act
                subject = new EntityUpdatedAudit(objectStateEntry);

            }

            //assert
            var namePropertyAudit = subject.AuditEntityProperties.Where(p => p.PropertyName == "Name").SingleOrDefault();
            Assert.IsNotNull(namePropertyAudit);
            Assert.AreEqual(newName, namePropertyAudit.NewValue);
            Assert.AreEqual(initialName, namePropertyAudit.OriginalValue);

            var isEnabledPropertyAudit = subject.AuditEntityProperties.Where(p => p.PropertyName == "IsEnabled").SingleOrDefault();
            Assert.IsNotNull(isEnabledPropertyAudit);
            Assert.AreEqual(true.ToString(), isEnabledPropertyAudit.NewValue);
            Assert.AreEqual(false.ToString(), isEnabledPropertyAudit.OriginalValue);
        }
        public void tracks_action()
        {
            EntityUpdatedAudit subject;

            //setup
            var initialValue = Guid.NewGuid().ToString();

            var entity = new Gender();
            entity.Name = initialValue;
            int id;
            using (var addContext = CreateObjectContext())
            {
                addContext.Genders.AddObject(entity);
                addContext.SaveChanges();
                id = entity.Id;
            }

            entity = GetGenderById(id);
            var newValue = Guid.NewGuid().ToString();
            entity.Name = newValue;

            using (var updateContext = CreateObjectContext())
            {
                var currentEntity = updateContext.Genders.Single(g => g.Id == entity.Id);
                updateContext.Genders.ApplyCurrentValues(entity);
                var objectStateEntry = updateContext.ObjectStateManager.GetObjectStateEntry(currentEntity);

                //act
                subject = new EntityUpdatedAudit(objectStateEntry);
            }

            //assert
            Assert.AreEqual(AuditEntityAction.Update, subject.AuditEntityAction);
        }
        public void works_without_auditing()
        {
            int id;
            Exception noException = null;

            try
            {
                using (var subject = new TestAuditableContext(GetEFConnectionString()))
                {
                    var entity = new Gender { Name = Guid.NewGuid().ToString() };
                    subject.Genders.AddObject(entity);
                    subject.SaveChanges();
                    id = entity.Id;
                }

                Gender toUpdate;
                using (var subject = new TestAuditableContext(GetEFConnectionString()))
                {
                    toUpdate = subject.Genders.Single(g => g.Id == id);
                }
                toUpdate.Name = Guid.NewGuid().ToString();

                using (var subject = new TestAuditableContext(GetEFConnectionString()))
                {
                    var currentEntity = subject.Genders.Single(g => g.Id == id);
                    subject.Genders.ApplyCurrentValues(toUpdate);
                    subject.SaveChanges();
                }

                using (var subject = new TestAuditableContext(GetEFConnectionString()))
                {
                    var currentEntity = subject.Genders.Single(g => g.Id == id);
                    subject.DeleteObject(currentEntity);
                    subject.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                noException = ex;
            }

            Assert.IsNull(noException);
        }
        public void publishes_new_event_each_commit()
        {
            //setup
            var context = CreateUserContext();
            var mockPublisher = new Mock<IAuditEventPublisher>();

            var entityA = new Gender { Name = Guid.NewGuid().ToString() };
            var entityB = new Gender { Name = Guid.NewGuid().ToString() };

            //act
            using (var subject = new TestAuditableContext(GetEFConnectionString(), context, mockPublisher.Object, _defaultMockConfiguration.Object))
            {
                subject.Genders.AddObject(entityA);
                subject.SaveChanges();
                subject.Genders.AddObject(entityB);
                subject.SaveChanges();
            }

            //assert
            mockPublisher.Verify
                (
                m => m.Publish
                    (
                        It.Is<AuditEvent>
                        (
                            auditEvent =>
                            EventMatchesContext(auditEvent, context)
                            &&
                            auditEvent.AuditEntities.Count() == 1
                            &&
                            auditEvent.AuditEntities[0].AuditEntityAction == AuditEntityAction.Add
                            &&
                            auditEvent.AuditEntities[0].AuditEntityProperties.Count == _auditableGenderPropertyCount
                        )
                    ),
                    Times.Exactly(2)
                );
        }