public void GivenExistingAggregateWithUnseenChanges_WhenSaving_ThenShouldCheckConcurrencyWithCorrectEvents() { // Arrange var userId = Guid.NewGuid(); var eventStore = new InMemoryEventStore(); eventStore.Store(userId, new UserRegistered(userId)); var concurrencyMonitor = new Mock <IConcurrencyMonitor>(); var repository = new EventSourcingRepository <User>(eventStore, concurrencyMonitor.Object); var user = repository.Get(userId); // Now another user changes the password before we get chance to save our changes: eventStore.Store(userId, new UserChangedPassword("adifferentpassword")); user.ChangePassword("newpassword"); // Act repository.Save(user); // Assert concurrencyMonitor.Verify( monitor => monitor.CheckForConflicts( It.Is <IEnumerable <object> >( unseenEvents => (unseenEvents.Single() as UserChangedPassword).NewPassword == "adifferentpassword"), It.Is <IEnumerable <object> >( uncommittedEvents => (uncommittedEvents.Single() as UserChangedPassword).NewPassword == "newpassword"))); }
public void GivenExistingAggregateWithUnseenChanges_WhenSaving_ThenShouldCheckConcurrencyWithCorrectEvents() { // Arrange var eventStore = new InMemoryEventStore(new ConsoleLogger()); // Register and save a new user var user = new User(); user.Register(); var concurrencyMonitor = new StrictConcurrencyMonitor(); var repository = new EventSourcingRepository <User>(eventStore, concurrencyMonitor, _logger); repository.Save(user); var userVersion = user.Version; // We change password... var repository1 = new EventSourcingRepository <User>(eventStore, concurrencyMonitor, _logger); var user1 = repository1.Get(user.Id, userVersion); user1.ChangePassword("newpassword"); // ...but so does someone else, who saves their changes before we have a chance to save ours... var repository2 = new EventSourcingRepository <User>(eventStore, concurrencyMonitor, _logger); var user2 = repository.Get(user.Id, userVersion); user2.ChangePassword("newpassword"); repository2.Save(user2); // ...so we should get a concurrency exception when we try to save Assert.Throws <ConcurrencyConflictsDetectedException>(() => repository1.Save(user1)); }
public void GivenAggregateWithUncommittedEvents_WhenSaved_ThenBaseVersionShouldMatchCurrentVersion() { // Arrange var eventStore = new InMemoryEventStore(new ConsoleLogger()); var user = new User(); user.Register(); var repository = new EventSourcingRepository <User>(eventStore, new Mock <IConcurrencyMonitor>().Object, _logger); repository.Save(user); user.ChangePassword("newpassword"); var versionAfterChange = user.GetUncommittedEvents().Last().Version; // Act repository.Save(user); // Assert Assert.AreEqual(versionAfterChange, user.BaseVersion, "User's base version has not been updated to match current version on successful save."); }
public void GivenNewAggreateWithNoEvents_WhenSaving_ThenShouldNotBotherCheckingConcurrency() { // Arrange var user = new User(); var concurrencyMonitor = new Mock <IConcurrencyMonitor>(); var repository = new EventSourcingRepository <User>(new InMemoryEventStore(), concurrencyMonitor.Object); // Act repository.Save(user); // Assert concurrencyMonitor.Verify(monitor => monitor.CheckForConflicts(It.IsAny <IEnumerable <object> >(), It.IsAny <IEnumerable <object> >()), Times.Never()); }
public void GivenAggregateWithUncommittedEvents_WhenSaving_ThenUncommittedEventsShouldBeAccepted() { // Arrange var user = new User(); user.Register(); var repository = new EventSourcingRepository<User>(new InMemoryEventStore(), new Mock<IConcurrencyMonitor>().Object); // Act repository.Save(user); // Assert CollectionAssert.IsEmpty(user.GetUncommittedEvents()); }
public void GivenAggregateWithUncommittedEvents_WhenSaving_ThenUncommittedEventsShouldBeAccepted() { // Arrange var user = new User(); user.Register(); var repository = new EventSourcingRepository <User>(new InMemoryEventStore(), new Mock <IConcurrencyMonitor>().Object); // Act repository.Save(user); // Assert CollectionAssert.IsEmpty(user.GetUncommittedEvents()); }
public void GivenAggregateWithNoUncommittedEvents_WhenSaved_ThenEventStoreShouldContainNoAdditionalEvents() { // Arrange var eventStore = new InMemoryEventStore(); var repository = new EventSourcingRepository <User>(eventStore, new Mock <IConcurrencyMonitor>().Object); var user = new User(); var expectedEvents = Enumerable.Empty <object>(); // Act repository.Save(user); // Assert CollectionAssertAreJsonEqual(expectedEvents, eventStore.Events); }
public void GivenAggregateWithNoUncommittedEvents_WhenSaved_ThenEventStoreShouldContainNoAdditionalEvents() { // Arrange var eventStore = new InMemoryEventStore(); var repository = new EventSourcingRepository<User>(eventStore, new Mock<IConcurrencyMonitor>().Object); var user = new User(); var expectedEvents = Enumerable.Empty<object>(); // Act repository.Save(user); // Assert CollectionAssertAreJsonEqual(expectedEvents, eventStore.Events); }
public void GivenAggregateWithUncommittedEvents_WhenSaved_ThenEventStoreShouldContainThoseEvents() { // Arrange var eventStore = new InMemoryEventStore(); IRepository<User> repository = new EventSourcingRepository<User>(eventStore, new Mock<IConcurrencyMonitor>().Object); var user = new User(); user.Register(); var expectedEvents = new object[] { new UserRegistered(user.Id) }; // Act repository.Save(user); // Assert CollectionAssertAreJsonEqual(expectedEvents, eventStore.Events); }
public void GivenAggregateWithUncommittedEvents_WhenSaved_ThenEventStoreShouldContainThoseEvents() { // Arrange var eventStore = new InMemoryEventStore(); IRepository <User> repository = new EventSourcingRepository <User>(eventStore, new Mock <IConcurrencyMonitor>().Object); var user = new User(); user.Register(); var expectedEvents = new object[] { new UserRegistered(user.Id) }; // Act repository.Save(user); // Assert CollectionAssertAreJsonEqual(expectedEvents, eventStore.Events); }
public void GivenAggregateWithUncommittedEvents_WhenSaved_ThenEventStoreShouldContainThoseEvents() { // Arrange var eventStore = new InMemoryEventStore(new ConsoleLogger()); IRepository <User> repository = new EventSourcingRepository <User>(eventStore, new Mock <IConcurrencyMonitor>().Object, _logger); var user = new User(); user.Register(); var expectedEvents = new object[] { new UserRegistered(user.Id) }; // Act repository.Save(user); // Assert var comparisonResult = _comparer.AreEqual(expectedEvents, eventStore.GetAllEvents()); Assert.That(comparisonResult.AreEqual, comparisonResult.InequalityReason); }
public void GivenAggregateWithUncommittedEvents_WhenSaved_ThenBaseVersionShouldMatchCurrentVersion() { // Arrange var userId = Guid.NewGuid(); var eventStore = new InMemoryEventStore(); var userRegistered = new UserRegistered(userId); eventStore.Update(userId, userRegistered); var repository = new EventSourcingRepository<User>(eventStore, new Mock<IConcurrencyMonitor>().Object); var user = repository.Get(userId); user.ChangePassword("newpassword"); var currentVersion = user.GetUncommittedEvents().Cast<Event>().Last().Version; // Act repository.Save(user); // Assert Assert.AreEqual(currentVersion, user.BaseVersion, "User's base version has not been updated to match current version on successful save."); }
public void GivenAggregateWithUncommittedEvents_WhenSaved_ThenBaseVersionShouldMatchCurrentVersion() { // Arrange var userId = Guid.NewGuid(); var eventStore = new InMemoryEventStore(); var userRegistered = new UserRegistered(userId); eventStore.Store(userId, userRegistered); var repository = new EventSourcingRepository <User>(eventStore, new Mock <IConcurrencyMonitor>().Object); var user = repository.Get(userId); user.ChangePassword("newpassword"); var currentVersion = user.GetUncommittedEvents().Cast <Event>().Last().Version; // Act repository.Save(user); // Assert Assert.AreEqual(currentVersion, user.BaseVersion, "User's base version has not been updated to match current version on successful save."); }
public void GivenNewAggreateWithNoEvents_WhenSaving_ThenShouldNotBotherCheckingConcurrency() { // Arrange var user = new User(); var concurrencyMonitor = new Mock<IConcurrencyMonitor>(); var repository = new EventSourcingRepository<User>(new InMemoryEventStore(), concurrencyMonitor.Object); // Act repository.Save(user); // Assert concurrencyMonitor.Verify(monitor => monitor.CheckForConflicts(It.IsAny<IEnumerable<object>>(), It.IsAny<IEnumerable<object>>()), Times.Never()); }
public void GivenExistingAggregateWithUnseenChanges_WhenSaving_ThenShouldCheckConcurrencyWithCorrectEvents() { // Arrange var userId = Guid.NewGuid(); var eventStore = new InMemoryEventStore(); eventStore.Update(userId, new UserRegistered(userId)); var concurrencyMonitor = new Mock<IConcurrencyMonitor>(); var repository = new EventSourcingRepository<User>(eventStore, concurrencyMonitor.Object); var user = repository.Get(userId); // Now another user changes the password before we get chance to save our changes: eventStore.Update(userId, new UserChangedPassword("adifferentpassword")); user.ChangePassword("newpassword"); // Act repository.Save(user); // Assert concurrencyMonitor.Verify( monitor => monitor.CheckForConflicts( It.Is<IEnumerable<object>>( unseenEvents => (unseenEvents.Single() as UserChangedPassword).NewPassword == "adifferentpassword"), It.Is<IEnumerable<object>>( uncommittedEvents => (uncommittedEvents.Single() as UserChangedPassword).NewPassword == "newpassword"))); }