示例#1
0
        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")));
        }
示例#2
0
        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));
        }
示例#3
0
        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.");
        }
示例#4
0
        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());
        }
示例#5
0
        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());
        }
示例#6
0
        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());
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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.");
        }
示例#13
0
        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.");
        }
示例#14
0
        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());
        }
示例#15
0
        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")));
        }