示例#1
0
        public void When_multiple_projector_handlers_are_chained_then_the_last_added_is_called_first()
        {
            // arrange
            var bus = new InProcessEventBus();

            var handlerCalls = new List <string>();

            // act
            var handler = new TestProjector()
                          .WrapAll((e, next) =>
            {
                handlerCalls.Add("c");
                next(e);
            })
                          .WrapAll((e, next) =>
            {
                handlerCalls.Add("b");
                next(e);
            })
                          .WrapAll((e, next) =>
            {
                handlerCalls.Add("a");
                next(e);
            });

            bus.Subscribe(handler);

            bus.PublishAsync(new Order.Created()).Wait();

            // assert
            handlerCalls.Should().BeInAscendingOrder();
        }
        public void Basic_persistence_of_snapshot_memento()
        {
            const string  streamId = "test2_a";
            TestProjector unfolder = new TestProjector();

            unfolder.ApplyEvent(new TestDomainEvent()
            {
                Value = 42
            });
            var      memento = unfolder.GetSnapshot();
            Snapshot s       = new Snapshot(_bucket, streamId, 1, memento);

            sut.Persist(s, _type);

            var reloaded = sut.Load(streamId, 1, _type);

            Assert.That(reloaded, Is.Not.Null);
            Assert.That(reloaded.BucketId, Is.EqualTo(_bucket));
            Assert.That(reloaded.StreamId, Is.EqualTo(streamId));
            Assert.That(reloaded.StreamRevision, Is.EqualTo(1));

            TestProjector unfolderReloaded = new TestProjector();

            unfolderReloaded.Restore((IMementoEx)reloaded.Payload);
            var readmodel = unfolderReloaded.GetProjection();

            Assert.That(readmodel.Sum, Is.EqualTo(42));
        }
示例#3
0
        public void Handler_chains_can_be_specified_for_all_event_types_on_a_single_projector()
        {
            // arrange
            var bus = new InProcessEventBus();
            var createdWasCalled   = false;
            var cancelledWasCalled = false;
            var deliveredWasCalled = false;

            var handledEvents = new List <IEvent>();

            // act
            var handler = new TestProjector(
                onCreated: e => createdWasCalled     = true,
                onCancelled: e => cancelledWasCalled = true,
                onDelivered: e => deliveredWasCalled = true)
                          .WrapAll((e, nextHandler) =>
            {
                handledEvents.Add(e);
                nextHandler(e);
            });

            bus.Subscribe(handler);

            bus.PublishAsync(new Order.Created()).Wait();
            bus.PublishAsync(new Order.Cancelled()).Wait();
            bus.PublishAsync(new Order.Delivered()).Wait();

            // assert
            handledEvents.Count.Should().Be(3);
            createdWasCalled.Should().BeTrue("created was called");
            cancelledWasCalled.Should().BeTrue("cancelled was called");
            deliveredWasCalled.Should().BeTrue("delivered was called");
        }
示例#4
0
        public async Task invoke_business_event_handler()
        {
            var mockSubFactory = new Mock <ISubscriberFactory>();
            var businessEvent  = new TestEvent();
            var streamId       = "s";
            var position       = 5;
            var subEvent       = new SubscriberEvent(null, streamId, position, null, businessEvent);
            var dependencies   = new ProjectorDependencies(null, mockSubFactory.Object, null, null, null, null, null);
            var projector      = new TestProjector(dependencies);
            var token          = CancellationToken.None;
            var called         = false;

            projector.MockBusinessEventHandler = (pStreamId, pPosition, pEvent, pToken) =>
            {
                Assert.Equal(streamId, pStreamId);
                Assert.Equal(position, pPosition);
                Assert.Equal(businessEvent, pEvent);
                Assert.Equal(token, pToken);
                called = true;
                return(Task.CompletedTask);
            };

            await projector.HandleSubscriberEventAsync(subEvent, token);

            Assert.True(called);
        }
        public void Smoke_persistence_of_memento_snapshot()
        {
            TestProjector unfolder = new TestProjector();

            unfolder.ApplyEvent(new TestDomainEvent()
            {
                Value = 42
            });
            var      memento = unfolder.GetSnapshot();
            Snapshot s       = new Snapshot("test1_a", 1, memento);

            sut.Persist(s, _type);
        }
示例#6
0
        public async Task ShouldProjectMessages()
        {
            var cancellationSource = new CancellationTokenSource();
            var completionSource   = new TaskCompletionSource <bool>();

            cancellationSource.Token.Register(s => ((TaskCompletionSource <bool>)s).SetResult(true), completionSource);

            _events
            .Watch(Arg.Any <Checkpoint?>(), Arg.Any <CancellationToken>())
            .Returns(new[] {
                new Envelope(
                    "invariantId1",
                    "Invariant",
                    0,
                    new ChooseProduct("customerId", "productId")
                    ),
                new Envelope(
                    "invariantId2",
                    "Invariant",
                    0,
                    new ChooseProduct("customerId", "productId")
                    )
            }.ToAsync());

            var envelopes   = new List <Envelope>();
            var projections = default(Projection[]);

            var processor = new TestProjector(
                _logger,
                _events,
                new TestProject(async e => {
                envelopes.Add(e);
            }),
                2,
                TimeSpan.FromMilliseconds(100),
                async results => {
                projections = results.Select(r => r.Projection).ToArray();
                cancellationSource.Cancel();
            }
                );
            await processor.ExecuteAsync(cancellationSource.Token);

            await await Task.WhenAny(
                completionSource.Task,
                Task.Delay(10000)
                );

            envelopes.Count.ShouldBe(2);
            projections.ShouldNotBeNull();
        }
示例#7
0
        public async Task subscribe_when_run()
        {
            var mockSubFactory = new Mock <ISubscriberFactory>();
            var mockSubscriber = new Mock <ISubscriber>();

            mockSubFactory.Setup(x => x.Create(
                                     It.IsAny <IStandardLogger>(), It.IsAny <IStreamClientFactory>(), It.IsAny <IStreamStateRepo>(),
                                     It.IsAny <IBusinessEventResolver>(), It.IsAny <ISubscriberEventSorter>(), It.IsAny <ISubscriberEventHandler>(),
                                     It.IsAny <SubscriberFactoryOptions>(), It.IsAny <IList <SubscriptionStreamId> >()
                                     )).Returns(mockSubscriber.Object);

            var dependencies = new ProjectorDependencies(null, mockSubFactory.Object, null, null, null, null, null);
            var projector    = new TestProjector(dependencies);

            var tokenSource = new CancellationTokenSource(5000);

            await projector.RunAsync(tokenSource.Token);

            Assert.False(tokenSource.IsCancellationRequested);

            mockSubscriber.Verify(x => x.SubscribeAsync(tokenSource.Token));
        }
示例#8
0
        public void create_subscriber_when_construct()
        {
            var mockLogger              = new Mock <IStandardLogger>();
            var mockSubFactory          = new Mock <ISubscriberFactory>();
            var subFactoryOptions       = new SubscriberFactoryOptions(0, 0, 0, 0);
            var mockStreamClientFactory = new Mock <IStreamClientFactory>();
            var mockStreamStateRepo     = new Mock <IStreamStateRepo>();
            var mockEventResolver       = new Mock <IBusinessEventResolver>();
            var streamIds = new List <SubscriptionStreamId>();

            var dependencies = new ProjectorDependencies(
                mockLogger.Object, mockSubFactory.Object, subFactoryOptions, mockStreamClientFactory.Object, mockStreamStateRepo.Object,
                mockEventResolver.Object, streamIds
                );

            var projector = new TestProjector(dependencies);

            mockSubFactory.Verify(x => x.Create(
                                      mockLogger.Object, mockStreamClientFactory.Object, mockStreamStateRepo.Object,
                                      mockEventResolver.Object, projector, projector, subFactoryOptions, streamIds
                                      ));
        }
示例#9
0
 public EF6EntityEventProjectorTests()
 {
     ef6CrudRepository = Substitute.ForPartsOf <EF6InMemoryCrudRepository>();
     sut = new TestProjector(ef6CrudRepository);
 }