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 GivenUnseenEventsAndNoUncommittedEvents_WhenTestingForConflicts_ThenFindNoConflicts() { // Arrange IConcurrencyMonitor monitor = new StrictConcurrencyMonitor(); IEnumerable <object> unseenEvents = new[] { new UserRegistered(Guid.NewGuid()) }; IEnumerable <object> uncommittedEvents = Enumerable.Empty <object>(); // Act IEnumerable <ConcurrencyConflict> conflicts = monitor.CheckForConflicts(unseenEvents, uncommittedEvents); // Assert CollectionAssert.IsEmpty(conflicts, "Conflicts have been returned where there should be none."); }
public void GivenUnseenEvents_WhenTestingForConflicts_ThenFindConflicts() { // Arrange var userId = Guid.NewGuid(); IConcurrencyMonitor monitor = new StrictConcurrencyMonitor(); IEnumerable <object> unseenEvents = new[] { new UserChangedPassword("newpassword") }; IEnumerable <object> uncommittedEvents = new[] { new UserChangedPassword("differentnewpassword") }; // Act IList <ConcurrencyConflict> conflicts = monitor.CheckForConflicts(unseenEvents, uncommittedEvents).ToList(); // Assert Assert.AreEqual(1, conflicts.Count, "Expected one and only one conflict."); var conflict = conflicts.Single(); CollectionAssert.AreEqual(unseenEvents, conflict.UnseenEvents); CollectionAssert.AreEqual(uncommittedEvents, conflict.UncommittedEvents); Assert.AreEqual("Changes conflict with one or more committed events.", conflict.Message); }