public void TestProjectionAgentCallsIProjectionHandle()
        {
            var eventStream = Substitute.For <IEventStream>();

            var subscriptions = new List <string> {
                typeof(FooEvent).Name
            };

            eventStream
            .Load(1, 50, subscriptions)
            .Returns(new List <IDomainEvent>
            {
                new FooEvent(1),
            });

            var projection = Substitute.For <IProjection>();

            projection.Subscriptions().Returns(subscriptions);

            var projectionAgent = new ProjectionAgent(eventStream, new[] { projection });

            projectionAgent.Run(config =>
            {
                config.BatchSize       = 50;
                config.PollingInterval = 1;
            });

            Thread.Sleep(1000);

            projectionAgent.Dispose();

            projection.Received().HandleEvent(Arg.Any <IDomainEvent>());
        }
Exemple #2
0
        public void TestProjectionAppliesOneEventForSameSequence()
        {
            var eventStream = Substitute.For <IEventStream>();

            eventStream
            .Load(1, 50)
            .Returns(new List <IDomainEvent>
            {
                new FooEvent(1),
                new FooEvent(1),
                new FooEvent(1),
                new FooEvent(1),
                new FooEvent(1),
            });

            var projectionState = Substitute.For <IProjectionStateRepository>();

            projectionState.GetOffset(Arg.Any <string>()).Returns(0);

            var projection1 = new FooProjection(projectionState);

            var projectionAgent = new ProjectionAgent(eventStream, new IProjection[] { projection1 });

            var disposable = projectionAgent.Run(config =>
            {
                config.BatchSize = 50;
                config.PeekIntervalMilliseconds = 1;
            });

            Thread.Sleep(100);

            disposable.Dispose();

            Assert.AreEqual(1, projection1.Called);
        }
        public void TestProjectionAgentQueriesEventStreamByCorrespondingProjectionOffset()
        {
            var eventStream = Substitute.For <IEventStream>();

            var subscriptions1 = new List <string> {
                typeof(FooEvent).Name
            };

            var subscriptions2 = new List <string> {
                typeof(BooEvent).Name, typeof(FooEvent).Name
            };

            eventStream
            .Load(1, 3, Arg.Is <List <string> >(x => subscriptions1.SequenceEqual(x)))
            .Returns(new List <IDomainEvent>
            {
                new FooEvent(1),
                new FooEvent(2),
                new FooEvent(3)
            });

            eventStream
            .Load(21, 3, Arg.Is <List <string> >(x => subscriptions2.SequenceEqual(x)))
            .Returns(new List <IDomainEvent>
            {
                new BooEvent(21),
                new BooEvent(22),
                new BooEvent(23)
            });

            var projectionState1 = Substitute.For <IProjectionStateRepository>();

            projectionState1.GetOffset().Returns(0);

            var projectionState2 = Substitute.For <IProjectionStateRepository>();

            projectionState2.GetOffset().Returns(20);

            var projection1 = new FooProjection(projectionState1);
            var projection2 = new BooProjection(projectionState2);

            var projectionAgent = new ProjectionAgent(eventStream, new IProjection[] { projection1, projection2 });

            projectionAgent.Run(config =>
            {
                config.BatchSize       = 3;
                config.PollingInterval = 1;
            });

            Thread.Sleep(100);

            projectionAgent.Dispose();

            eventStream.Received().Load(1, 3, Arg.Is <List <string> >(x => subscriptions1.SequenceEqual(x)));
            eventStream.Received().Load(21, 3, Arg.Is <List <string> >(x => subscriptions2.SequenceEqual(x)));
            eventStream.Received().Load(4, 3, Arg.Is <List <string> >(x => subscriptions1.SequenceEqual(x)));
            eventStream.Received().Load(24, 3, Arg.Is <List <string> >(x => subscriptions2.SequenceEqual(x)));
        }
        public void TestProjectionAgentQueriesEventStreamPerProjection()
        {
            var eventStream = Substitute.For <IEventStream>();

            var subscriptions = new List <string> {
                typeof(FooEvent).Name
            };

            eventStream
            .Load(1, 50, Arg.Is <List <string> >(x => subscriptions.SequenceEqual(x)))
            .Returns(new List <IDomainEvent>()
            {
                new FooEvent(1),
                new FooEvent(2),
                new FooEvent(3),
                new FooEvent(4),
                new FooEvent(5),
            });

            eventStream
            .Load(15, 50, Arg.Is <List <string> >(x => subscriptions.SequenceEqual(x)))
            .Returns(new List <IDomainEvent>()
            {
                new FooEvent(15),
                new FooEvent(16),
                new FooEvent(17),
            });

            var projectionState1 = Substitute.For <IProjectionStateRepository>();

            projectionState1.GetOffset().Returns(0);

            var projectionState2 = Substitute.For <IProjectionStateRepository>();

            projectionState2.GetOffset().Returns(14);

            var projection1 = new FooProjection(projectionState1);
            var projection2 = new FooProjection(projectionState2);

            var projectionAgent = new ProjectionAgent(eventStream, new IProjection[] { projection1, projection2 });

            projectionAgent.Run(config =>
            {
                config.BatchSize       = 50;
                config.PollingInterval = 1;
            });

            Thread.Sleep(100);

            projectionAgent.Dispose();

            eventStream.Received(1).Load(1, 50, Arg.Is <List <string> >(x => subscriptions.SequenceEqual(x)));
            eventStream.Received(1).Load(15, 50, Arg.Is <List <string> >(x => subscriptions.SequenceEqual(x)));
        }
        public void TestProjectionTracksEventSequence()
        {
            var eventStream = Substitute.For <IEventStream>();

            var subscriptions = new List <string> {
                typeof(FooEvent).Name
            };

            eventStream
            .Load(1, 50, Arg.Is <List <string> >(x => subscriptions.SequenceEqual(x)))
            .Returns(new List <IDomainEvent>
            {
                new FooEvent(1),
                new FooEvent(2),
                new FooEvent(3),
                new FooEvent(4),
                new FooEvent(5),
            });

            var projectionState = Substitute.For <IProjectionStateRepository>();

            projectionState.GetOffset().Returns(0);

            var projection1 = new FooProjection(projectionState);
            var projection2 = new FooProjection(projectionState);

            var projectionAgent = new ProjectionAgent(eventStream, new IProjection[] { projection1, projection2 });

            projectionAgent.Run(config =>
            {
                config.BatchSize       = 50;
                config.PollingInterval = 1;
            });

            Thread.Sleep(100);

            projectionAgent.Dispose();

            Assert.AreEqual(5, projection1.Called);
            Assert.AreEqual(5, projection2.Called);
        }
Exemple #6
0
        public void TestProjectionAgentQueriesEventStreamByCorrespondingSubscriptions()
        {
            var eventStream = Substitute.For <IEventStream>();

            var subscriptions1 = new List <string> {
                typeof(FooEvent).Name
            };

            var subscriptions2 = new List <string> {
                typeof(BooEvent).Name, typeof(FooEvent).Name
            };

            var projectionState1 = Substitute.For <IProjectionStateRepository>();

            projectionState1.GetOffset(Arg.Any <string>()).Returns(0);

            var projectionState2 = Substitute.For <IProjectionStateRepository>();

            projectionState2.GetOffset(Arg.Any <string>()).Returns(20);

            var projection1 = new FooProjection(projectionState1);
            var projection2 = new BooProjection(projectionState2);

            var projectionAgent = new ProjectionAgent(eventStream, new IProjection[] { projection1, projection2 });

            var disposable = projectionAgent.Run(config =>
            {
                config.BatchSize = 50;
                config.PeekIntervalMilliseconds = 1;
            });

            Thread.Sleep(100);

            disposable.Dispose();

            eventStream.Received().Load(1, 50);
            eventStream.Received().Load(21, 50);
        }
        public void TestProjectionAgentHandlesHighConcurrency()
        {
            var eventStream = Substitute.For <IEventStream>();

            eventStream
            .Load(1, 50, Arg.Any <IEnumerable <string> >())
            .Returns(new List <IDomainEvent>()
            {
                new FooEvent(1),
                new FooEvent(2),
                new FooEvent(3),
                new FooEvent(4),
                new FooEvent(5),
            });

            const string activeIdentity = "identity";

            var projectionRepo = new ProjectionStateRepository();
            var projection     = new FooTrackingProjection(projectionRepo);

            var projectionAgent = new ProjectionAgent(eventStream,
                                                      new[] { projection },
                                                      projectionRepo,
                                                      activeIdentity);

            projectionAgent.Run(config =>
            {
                config.BatchSize       = 50;
                config.PollingInterval = 10;
            });

            Thread.Sleep(3000);

            projectionAgent.Dispose();

            Assert.AreEqual(5, projection.Called);
        }