Пример #1
0
        public void SetHeaders_AddValueToHeadersDictionary(
            JournaledEvent journaledEvent,
            string headerName,
            string headerValue)
        {
            journaledEvent.SetHeader(headerName, headerValue);

            Assert.Equal(journaledEvent.Headers[headerName], headerValue);
        }
Пример #2
0
        private static Fixture PrepareFixture()
        {
            var fixture = new Fixture();

            fixture.Customize <JournaledEvent>(
                composer => composer.FromFactory((object stub) => JournaledEvent.Create(stub, Serialize)));

            return(fixture);
        }
        public async Task PublishAsync_AppendsEventsToStreamUsingStreamWriter(
            [Frozen] Mock<IEventStreamWriter> writerMock,
            JournaledEvent[] events,
            EventStreamProducer producer)
        {
            await producer.PublishAsync(events);

            writerMock.Verify(self => self.AppendEventsAsync(events));
        }
        protected override Task ProcessEventAsync(JournaledEvent journaledEvent)
        {
            if (Exception != null)
            {
                throw Exception;
            }

            return(TaskDone.Done);
        }
Пример #5
0
        public void Customize(IFixture fixture)
        {
            fixture.Customize <JournaledEvent>(composer => composer
                                               .FromFactory(() => JournaledEvent.Create(
                                                                new object(),
                                                                (_, type, writer) => writer.WriteLine(fixture.Create("EventPayload")))));

            fixture.Customize <IReadOnlyList <JournaledEvent> >(composer => composer
                                                                .FromFactory((JournaledEvent[] events) => events));
        }
Пример #6
0
        public void GetEventPayload_ReturnsStreamWithPayloadContent(string payload)
        {
            var journaledEvent = JournaledEvent.Create(new object(), (evt, type, writer) => writer.Write(payload));

            using (var payloadStream = journaledEvent.GetEventPayload())
                using (var reader = new StreamReader(payloadStream))
                {
                    Assert.Equal(payload, reader.ReadToEnd());
                }
        }
Пример #7
0
        public void SetHeaders_WhenValueIsNull_RemovesHeader(
            JournaledEvent journaledEvent,
            string headerName,
            string headerValue)
        {
            journaledEvent.SetHeader(headerName, headerValue);

            journaledEvent.SetHeader(headerName, null);

            Assert.False(journaledEvent.Headers.ContainsKey(headerName));
        }
Пример #8
0
        public async Task AppendEvents_AppendEventsToJournal(
            [Frozen] EventStreamPosition position,
            [Frozen] Mock<IEventJournal> journalMock,
            EventStreamWriter writer,
            JournaledEvent[] events)
        {
            await writer.AppendEventsAsync(events);

            journalMock.Verify(journal => journal.AppendEventsAsync(
                writer.StreamName,
                position,
                It.Is<IReadOnlyCollection<JournaledEvent>>(e => e.Count == events.Length)));
        }
Пример #9
0
        public void GetEventPayload_ForRestoredEvents_ReturnsStreamWithPayloadContent(string payload)
        {
            var journaledEvent = JournaledEvent.Create(new object(), (evt, type, writer) => writer.Write(payload));

            var eventProperties = journaledEvent.ToDictionary();
            var restoredEvent   = JournaledEvent.Create(eventProperties);

            using (var payloadStream = restoredEvent.GetEventPayload())
                using (var reader = new StreamReader(payloadStream))
                {
                    Assert.Equal(payload, reader.ReadToEnd());
                }
        }
Пример #10
0
        public void RestoredEvent_ShouldRestoreHeaders(string payload)
        {
            var journaledEvent = JournaledEvent.Create(new object(), (evt, type, writer) => writer.Write(payload));

            journaledEvent.SetHeader("A", "A");
            journaledEvent.SetHeader("B", "B");

            var eventProperties = journaledEvent.ToDictionary();
            var restoredEvent   = JournaledEvent.Create(eventProperties);

            Assert.Equal("A", restoredEvent.Headers["A"]);
            Assert.Equal("B", restoredEvent.Headers["B"]);
        }
Пример #11
0
        public void Customize(IFixture fixture)
        {
            fixture.Customize <JournaledEvent>(composer => composer
                                               .FromFactory((Guid headerName, string headerValue) =>
            {
                var result = JournaledEvent.Create(
                    new object(),
                    (_, type, writer) => writer.WriteLine(fixture.Create("EventPayload")));

                result.SetHeader(headerName.ToString("N"), headerValue);

                return(result);
            }));
        }
        protected override Task ProcessEventAsync(JournaledEvent journaledEvent)
        {
            if (m_throwException)
            {
                m_throwException = false;
                throw new Exception();
            }

            Events.Add(journaledEvent);

            if (++m_eventCount == ExpectedEventCount)
            {
                Events.CompleteAdding();
            }

            return(TaskDone.Done);
        }
Пример #13
0
        public async Task StreamPosition_AfterWriteAsyncCall_UpdatedStreamVersionValue(
            [Frozen] Mock<IEventJournal> journalMock,
            EventStreamPosition position,
            EventStreamWriter writer,
            JournaledEvent[] events)
        {
            journalMock
                .Setup(self => self.AppendEventsAsync(
                    It.IsAny<string>(),
                    It.IsAny<EventStreamPosition>(),
                    It.IsAny<IReadOnlyCollection<JournaledEvent>>()))
                .Returns(position.YieldTask());

            await writer.AppendEventsAsync(events);

            Assert.Equal(position.Version, writer.StreamVersion);
        }
        public async Task PublishAsync_WhenWriterThrows_MovesItToTheEndOfStreamAndTriesAppendAgain(
            [Frozen] Mock<IEventStreamWriter> writerMock,
            [Frozen] RetryPolicyStub retryPolicy,
            JournaledEvent[] events,
            EventStreamProducer producer)
        {
            var expectedAttemptsCount = 5;

            retryPolicy.ConfigureMaxAttemptNumber(expectedAttemptsCount);

            writerMock
                .Setup(self => self.AppendEventsAsync(events))
                .Throws<EventStreamConcurrencyException>();

            await Assert.ThrowsAsync<EventStreamConcurrencyException>(() => producer.PublishAsync(events));

            writerMock.Verify(self => self.MoveToEndOfStreamAsync());
            writerMock.Verify(self => self.AppendEventsAsync(events), Times.Exactly(expectedAttemptsCount));
        }
        public JournaledEvent Mutate(JournaledEvent journaledEvent)
        {
            Require.NotNull(journaledEvent, "journaledEvent");

            return(m_mutators.Aggregate(journaledEvent, (current, mutator) => mutator.Mutate(current)));
        }
Пример #16
0
 protected abstract Task ProcessEventAsync(JournaledEvent journaledEvent);
Пример #17
0
        public async Task <FetchEventsResult> FetchStreamEvents(string stream, EventStreamHeader header, StreamVersion fromVersion, int sliceSize)
        {
            // fromVersion already in slice
            var isFetchingCompleted = false;
            var nextSliceVersion    = fromVersion.Increment(sliceSize - 1);

            if (nextSliceVersion >= header.Version)
            {
                nextSliceVersion    = header.Version;
                isFetchingCompleted = true;
            }

            const string queryTemplate =
                "((PartitionKey eq '{0}') and (RowKey eq 'HEAD')) or " +
                "((PartitionKey eq '{0}') and (RowKey ge '{1}' and RowKey le '{2}'))";

            var query = m_table.PrepareEntityFilterRangeQuery(
                queryTemplate.FormatString(
                    stream,
                    fromVersion.ToString(),
                    nextSliceVersion.ToString()));

            var queryResult = await query.ExecuteAsync();

            var events = new SortedList <StreamVersion, JournaledEvent>(sliceSize);

            foreach (var properties in queryResult)
            {
                var rowKey = (string)properties[KnownProperties.RowKey];
                if (!rowKey.EqualsCi("HEAD"))
                {
                    events.Add(StreamVersion.Parse((string)properties[KnownProperties.RowKey]), JournaledEvent.Create(properties));
                }
            }

            return(new FetchEventsResult(isFetchingCompleted, events));
        }
Пример #18
0
        public JournaledEvent Mutate(JournaledEvent journaledEvent)
        {
            journaledEvent.SetHeader(m_headerName, "A");

            return(journaledEvent);
        }