Example #1
0
        public ProjectionSubscriptionRequest(ProjectionStreamQuery query, int lastKnownSequence)
        {
            Argument.RequiresNotNull(query, nameof(query));
            Argument.Requires(lastKnownSequence >= 0, nameof(lastKnownSequence));

            Query = query;
            LastKnownSequence = lastKnownSequence;
        }
Example #2
0
        public ProjectionSubscriptionRequest(ProjectionStreamQuery query, int lastKnownSequence)
        {
            Argument.RequiresNotNull(query, nameof(query));
            Argument.Requires(lastKnownSequence >= 0, nameof(lastKnownSequence));

            Query             = query;
            LastKnownSequence = lastKnownSequence;
        }
Example #3
0
        public static Props CreateProps(ProjectionStreamQuery query, IActorRef reader, IActorRef writer, GlobalOptions options, Props replayWorkerProps = null)
        {
            Argument.RequiresNotNull(query, nameof(query));
            Argument.RequiresNotNull(reader, nameof(reader));
            Argument.RequiresNotNull(writer, nameof(writer));
            Argument.RequiresNotNull(options, nameof(options));

            return Props.Create<ProjectionStream>(query, reader, writer, options, replayWorkerProps);
        }
Example #4
0
            public TestContainer(TestKitBase testKit, GlobalOptions options = null, Type replayWorkerType = null)
            {
                var query = new ProjectionStreamQuery();
                Reader = testKit.CreateTestProbe();
                Writer = testKit.CreateTestProbe();
                options = options ?? new GlobalOptions();

                var props = Even.ProjectionStream.CreateProps(query, Reader, Writer, options);
                ProjectionStream = testKit.Sys.ActorOf(props);
            }
Example #5
0
        public void Sends_ProjectionReplayFinished_to_uptodate_subscriber()
        {
            var reader     = CreateWorkingReader();
            var query      = new ProjectionStreamQuery();
            var props      = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps         = Sys.ActorOf(props);
            var subscriber = CreateTestProbe();

            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);
            subscriber.ExpectMsg <ProjectionReplayFinished>();
        }
Example #6
0
        public void Sends_RebuildProjection_to_subscriber_with_unknown_sequence()
        {
            var reader     = CreateWorkingReader(0);
            var query      = new ProjectionStreamQuery();
            var props      = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps         = Sys.ActorOf(props);
            var subscriber = CreateTestProbe();

            // projection stream only knows event 0, projection says it knows 99
            ps.Tell(new ProjectionSubscriptionRequest(query, 99), subscriber);
            subscriber.ExpectMsg <RebuildProjection>();
        }
Example #7
0
            public TestContainer(TestKitBase testKit, GlobalOptions options = null, Type replayWorkerType = null)
            {
                var query = new ProjectionStreamQuery();

                Reader  = testKit.CreateTestProbe();
                Writer  = testKit.CreateTestProbe();
                options = options ?? new GlobalOptions();

                var props = Even.ProjectionStream.CreateProps(query, Reader, Writer, options);

                ProjectionStream = testKit.Sys.ActorOf(props);
            }
Example #8
0
        public void SubscriptionRequest_with_past_sequence_starts_projection_replay_worker()
        {
            var workerProps = Props.Create <ProbeRelay>(TestActor);

            var reader = CreateWorkingReader(1);
            var query  = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var props  = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions(), workerProps);
            var ps     = Sys.ActorOf(props);

            var subscriber = CreateTestProbe();

            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);

            ExpectMsg <InitializeProjectionReplayWorker>();
        }
Example #9
0
        public void Requests_matched_events_be_written_to_index()
        {
            var query  = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var writer = CreateTestProbe();
            var props  = ProjectionStream.CreateProps(query, CreateWorkingReader(), writer, new GlobalOptions());
            var ps     = Sys.ActorOf(props);

            ps.Tell(MockPersistedEvent.Create(new object(), 1));
            ps.Tell(MockPersistedEvent.Create(new TestEvent(), 2));
            ps.Tell(MockPersistedEvent.Create(new object(), 3));
            ps.Tell(MockPersistedEvent.Create(new TestEvent(), 4));
            ps.Tell(MockPersistedEvent.Create(new object(), 5));

            writer.ExpectMsg <ProjectionIndexPersistenceRequest>(m => m.ProjectionStream.Equals(query.ProjectionStream) && m.ProjectionStreamSequence == 1 && m.GlobalSequence == 2);
            writer.ExpectMsg <ProjectionIndexPersistenceRequest>(m => m.ProjectionStream.Equals(query.ProjectionStream) && m.ProjectionStreamSequence == 2 && m.GlobalSequence == 4);
            writer.ExpectNoMsg(TimeSpan.FromMilliseconds(500));
        }
Example #10
0
        public ProjectionStream(ProjectionStreamQuery query, IActorRef reader, IActorRef writer, GlobalOptions options, Props replayWorkerProps)
        {
            _query = query;
            _reader = reader;
            _writer = writer;
            _options = options;
            _replayWorkerProps = replayWorkerProps ?? Props.Create<ProjectionReplayWorker>();

            // subscribe to events in the stream
            Context.System.EventStream.Subscribe(Self, typeof(IPersistedEvent));

            // request checkpoint
            var request = new ReadProjectionCheckpointRequest(_query.ProjectionStream);
            _lastRequestId = request.RequestID;
            _reader.Tell(request);

            Become(AwaitingCheckpoint);
        }
Example #11
0
        public async Task Sends_ProjectionUnsubscribed_to_subscribers_on_restart()
        {
            var query  = new ProjectionStreamQuery();
            var reader = CreateWorkingReader();
            var props  = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps     = Sys.ActorOf(props);

            var subscriber = Sys.ActorOf(conf =>
            {
                conf.Receive <ProjectionReplayFinished>((m, ctx) => { });
                conf.ReceiveAny((o, ctx) => TestActor.Forward(o));
            });

            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);
            await Task.Delay(100);

            ps.Tell(Kill.Instance);

            ExpectMsg <ProjectionUnsubscribed>();
        }
Example #12
0
        public void Publishes_events_from_eventstream_to_subscribers()
        {
            var reader = CreateWorkingReader();
            var query  = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var props  = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps     = Sys.ActorOf(props);

            var subscriber = Sys.ActorOf(conf =>
            {
                conf.Receive <ProjectionReplayFinished>((r, ctx) => { });
                conf.ReceiveAny((o, ctx) => TestActor.Forward(o));
            });

            // subscribe
            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);

            //publish to event stream
            var e = MockPersistedEvent.Create(new TestEvent());

            Sys.EventStream.Publish(e);

            // expects the domain event to be the same
            ExpectMsg <IPersistedStreamEvent>(m => m.DomainEvent == e.DomainEvent, TimeSpan.FromSeconds(15));
        }
Example #13
0
        public void Subscribers_that_received_RebuildProjection_need_to_resubscribe_to_receive_messages()
        {
            var reader = CreateWorkingReader();
            var query  = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var props  = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps     = Sys.ActorOf(props);

            var subscriber = Sys.ActorOf(conf =>
            {
                conf.Receive <RebuildProjection>((r, ctx) => { });
                conf.ReceiveAny((o, ctx) => TestActor.Forward(o));
            });

            // subscribe with invalid sequence
            ps.Tell(new ProjectionSubscriptionRequest(query, 10), subscriber);

            //publish to event stream
            var e = MockPersistedEvent.Create(new TestEvent());

            Sys.EventStream.Publish(e);

            // expects the domain event to be the same
            ExpectNoMsg(TimeSpan.FromSeconds(1));
        }
Example #14
0
        public async Task Sends_ProjectionUnsubscribed_to_subscribers_on_restart()
        {
            var query = new ProjectionStreamQuery();
            var reader = CreateWorkingReader();
            var props = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps = Sys.ActorOf(props);

            var subscriber = Sys.ActorOf(conf =>
            {
                conf.Receive<ProjectionReplayFinished>((m, ctx) => { });
                conf.ReceiveAny((o, ctx) => TestActor.Forward(o));
            });

            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);
            await Task.Delay(100);
            ps.Tell(Kill.Instance);

            ExpectMsg<ProjectionUnsubscribed>();
        }
Example #15
0
        public void Sends_ProjectionReplayFinished_to_uptodate_subscriber()
        {
            var reader = CreateWorkingReader();
            var query = new ProjectionStreamQuery();
            var props = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps = Sys.ActorOf(props);
            var subscriber = CreateTestProbe();

            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);
            subscriber.ExpectMsg<ProjectionReplayFinished>();
        }
Example #16
0
        public void Sends_RebuildProjection_to_subscriber_with_unknown_sequence()
        {
            var reader = CreateWorkingReader(0);
            var query = new ProjectionStreamQuery();
            var props = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps = Sys.ActorOf(props);
            var subscriber = CreateTestProbe();

            // projection stream only knows event 0, projection says it knows 99
            ps.Tell(new ProjectionSubscriptionRequest(query, 99), subscriber);
            subscriber.ExpectMsg<RebuildProjection>();
        }
Example #17
0
        public void Subscribers_that_received_RebuildProjection_need_to_resubscribe_to_receive_messages()
        {
            var reader = CreateWorkingReader();
            var query = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var props = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps = Sys.ActorOf(props);

            var subscriber = Sys.ActorOf(conf =>
            {
                conf.Receive<RebuildProjection>((r, ctx) => { });
                conf.ReceiveAny((o, ctx) => TestActor.Forward(o));
            });

            // subscribe with invalid sequence
            ps.Tell(new ProjectionSubscriptionRequest(query, 10), subscriber);

            //publish to event stream
            var e = MockPersistedEvent.Create(new TestEvent());
            Sys.EventStream.Publish(e);

            // expects the domain event to be the same
            ExpectNoMsg(TimeSpan.FromSeconds(1));
        }
Example #18
0
        public void Requests_matched_events_be_written_to_index()
        {
            var query = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var writer = CreateTestProbe();
            var props = ProjectionStream.CreateProps(query, CreateWorkingReader(), writer, new GlobalOptions());
            var ps = Sys.ActorOf(props);

            ps.Tell(MockPersistedEvent.Create(new object(), 1));
            ps.Tell(MockPersistedEvent.Create(new TestEvent(), 2));
            ps.Tell(MockPersistedEvent.Create(new object(), 3));
            ps.Tell(MockPersistedEvent.Create(new TestEvent(), 4));
            ps.Tell(MockPersistedEvent.Create(new object(), 5));

            writer.ExpectMsg<ProjectionIndexPersistenceRequest>(m => m.ProjectionStream.Equals(query.ProjectionStream) && m.ProjectionStreamSequence == 1 && m.GlobalSequence == 2);
            writer.ExpectMsg<ProjectionIndexPersistenceRequest>(m => m.ProjectionStream.Equals(query.ProjectionStream) && m.ProjectionStreamSequence == 2 && m.GlobalSequence == 4);
            writer.ExpectNoMsg(TimeSpan.FromMilliseconds(500));
        }
Example #19
0
        public void Publishes_events_from_eventstream_to_subscribers()
        {
            var reader = CreateWorkingReader();
            var query = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var props = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions());
            var ps = Sys.ActorOf(props);

            var subscriber = Sys.ActorOf(conf =>
            {
                conf.Receive<ProjectionReplayFinished>((r, ctx) => { });
                conf.ReceiveAny((o, ctx) => TestActor.Forward(o));
            });

            // subscribe
            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);

            //publish to event stream
            var e = MockPersistedEvent.Create(new TestEvent());
            Sys.EventStream.Publish(e);

            // expects the domain event to be the same
            ExpectMsg<IPersistedStreamEvent>(m => m.DomainEvent == e.DomainEvent, TimeSpan.FromSeconds(15));
        }
Example #20
0
        public void SubscriptionRequest_with_past_sequence_starts_projection_replay_worker()
        {
            var workerProps = Props.Create<ProbeRelay>(TestActor);

            var reader = CreateWorkingReader(1);
            var query = new ProjectionStreamQuery(new DomainEventPredicate(typeof(TestEvent)));
            var props = ProjectionStream.CreateProps(query, reader, ActorRefs.Nobody, new GlobalOptions(), workerProps);
            var ps = Sys.ActorOf(props);

            var subscriber = CreateTestProbe();

            ps.Tell(new ProjectionSubscriptionRequest(query, 0), subscriber);

            ExpectMsg<InitializeProjectionReplayWorker>();
        }