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); }
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) ); }