예제 #1
0
        public async Task GetNextSequenceNumber_CallMethodTwice_ShouldNotIncrement()
        {
            var projections = new HashSet <IProjection <string, FakeMessageEnvelope> > {
                new TestProjection("A"), new TestProjection("B")
            };
            var projector = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            Assert.That(await projector.GetNextSequenceNumber(), Is.EqualTo(1));
            Assert.That(await projector.GetNextSequenceNumber(), Is.EqualTo(1));
        }
예제 #2
0
        public async Task GetNextSequenceNumber_GetAfterConstructionWithEmptyRepository_ShouldReturnOne()
        {
            var projections = new HashSet <IProjection <string, FakeMessageEnvelope> > {
                new TestProjection("A"), new TestProjection("B")
            };
            var projector = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            Assert.That(await projector.GetNextSequenceNumber(), Is.EqualTo(1));
        }
예제 #3
0
        public async Task Project_MessageWithCorrectSequenceNumber_ShouldIncrementSequenceNumber()
        {
            await _sequenceNumberRepository.Store(new Dictionary <string, int> {
                { "A", 5 }, { "B", 6 }, { "C", 3 }
            });

            _projectionMocks[0].SetupGet(x => x.Key).Returns("A");
            _projectionMocks[1].SetupGet(x => x.Key).Returns("B");
            _projectionMocks[2].SetupGet(x => x.Key).Returns("C");

            var messageEnvelope = new FakeMessageEnvelope(3, new RegisteredMessageA());
            var projections     = new HashSet <IProjection <string, FakeMessageEnvelope> >(_projectionMocks.Select(x => x.Object));
            var projector       = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            Assert.That(await projector.GetNextSequenceNumber(), Is.EqualTo(3));
            await projector.Project(messageEnvelope);

            Assert.That(await projector.GetNextSequenceNumber(), Is.EqualTo(4));
        }
예제 #4
0
        public async Task GetNextSequenceNumber_CallMethodTwice_ShouldOnlyFetchFromRepositoryOnce()
        {
            await _sequenceNumberRepository.Store(new Dictionary <string, int> {
                { "A", 17 }, { "B", 5 }, { "C", 3 }
            });

            var projections = new HashSet <IProjection <string, FakeMessageEnvelope> > {
                new TestProjection("A"), new TestProjection("B")
            };
            var projector = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            Assert.That(_sequenceNumberRepository.NumberOfFetchCalls, Is.EqualTo(0));

            await projector.GetNextSequenceNumber();

            await projector.GetNextSequenceNumber();

            Assert.That(_sequenceNumberRepository.NumberOfFetchCalls, Is.EqualTo(1));
        }
예제 #5
0
        public async Task Project_WithProjectionThatResolvesConnection_ShouldCreateResolveDisposeLifetimeScopeInCorrectOrder()
        {
            await _sequenceNumberRepository.Store(new Dictionary <string, int> {
                { "A", 5 }
            });

            var messageEnvelope = new FakeMessageEnvelope(5, new RegisteredMessageA());
            var connectionType  = typeof(ConnectionA);

            _projectionMocks[0].SetupGet(x => x.Key).Returns("A");
            _projectionMocks[0].SetupGet(x => x.ConnectionType).Returns(connectionType);
            _projectionMocks[0]
            .Setup(x => x.Handle(It.IsAny <Func <object> >(), messageEnvelope, CancellationToken.None))
            .Callback <Func <object>, FakeMessageEnvelope, CancellationToken>((connectionResolver, _, __) =>
            {
                Assert.That(connectionResolver(), Is.Not.Null);
            })
            .Returns(() => Task.FromResult(true));

            var projections = new HashSet <IProjection <string, FakeMessageEnvelope> >(_projectionMocks.Take(1).Select(x => x.Object));
            var projector   = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            // Get the sequence number first so this scope creation/disposal does not influence our test
            await projector.GetNextSequenceNumber();

            var executionOrder = 0;

            _factoryMock.Reset();
            _factoryMock
            .Setup(x => x.BeginLifetimeScope())
            .Callback(() => Assert.That(executionOrder++, Is.EqualTo(0)))
            .Returns(() =>
            {
                var scopeMock = new Mock <IDependencyLifetimeScope>();

                scopeMock
                .Setup(x => x.Resolve(typeof(TestNextSequenceNumberRepository)))
                .Returns(_sequenceNumberRepository);

                scopeMock
                .Setup(x => x.Resolve(connectionType))
                .Callback(() => Assert.That(executionOrder++, Is.EqualTo(1)))
                .Returns(() => new FakeConnection());

                scopeMock
                .Setup(x => x.Dispose())
                .Callback(() => Assert.That(executionOrder++, Is.EqualTo(2)));
                return(scopeMock.Object);
            });

            // ReSharper disable once MethodSupportsCancellation
            await projector.Project(messageEnvelope);

            Assert.That(executionOrder, Is.EqualTo(3));
        }
예제 #6
0
        public async Task GetNextSequenceNumber_GetAfterConstruction_ShouldReturnLowestNextSequence()
        {
            await _sequenceNumberRepository.Store(new Dictionary <string, int> {
                { "A", 17 }, { "B", 5 }, { "C", 3 }
            });

            var projections = new HashSet <IProjection <string, FakeMessageEnvelope> > {
                new TestProjection("A"), new TestProjection("B")
            };
            var projector = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            Assert.That(await projector.GetNextSequenceNumber(), Is.EqualTo(5));
        }
예제 #7
0
        public async Task GetNextSequenceNumber_GetAfterConstruction_ShouldCreateResolveDisposeLifetimeScopeInCorrectOrder()
        {
            await _sequenceNumberRepository.Store(new Dictionary <string, int> {
                { "A", 17 }, { "B", 5 }, { "C", 3 }
            });

            var projections = new HashSet <IProjection <string, FakeMessageEnvelope> > {
                new TestProjection("A"), new TestProjection("B")
            };
            var projector = new Projector <string, FakeMessageEnvelope, TestNextSequenceNumberRepository>(projections, _factoryMock.Object);

            var executionOrder = 0;

            _factoryMock.Reset();
            _factoryMock
            .Setup(x => x.BeginLifetimeScope())
            .Callback(() => Assert.That(executionOrder++, Is.EqualTo(0)))
            .Returns(() =>
            {
                var scopeMock = new Mock <IDependencyLifetimeScope>();

                scopeMock
                .Setup(x => x.Resolve(typeof(TestNextSequenceNumberRepository)))
                .Callback(() => Assert.That(executionOrder++, Is.EqualTo(1)))
                .Returns(_sequenceNumberRepository);

                scopeMock
                .Setup(x => x.Dispose())
                .Callback(() => Assert.That(executionOrder++, Is.EqualTo(2)));
                return(scopeMock.Object);
            });

            await projector.GetNextSequenceNumber();

            Assert.That(executionOrder, Is.EqualTo(3));
        }