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