Esempio n. 1
0
        public async Task EventBus_Should_Invoke_Event_Handlers_Implicit_Topic()
        {
            // Create handlers
            var state = new FakeState {
                Data = "A"
            };
            var fakeHandler1 = new FakeEventHandler1(state);
            var fakeHandler2 = new FakeEventHandler2(state);

            // Create message broker
            var messageBroker = new FakeMessageBroker();

            messageBroker.Subscribe(fakeHandler1);
            messageBroker.Subscribe(fakeHandler2);

            // Create service bus
            var eventBus = new FakeEventBus(messageBroker);

            eventBus.Subscribe(fakeHandler1);
            eventBus.Subscribe(fakeHandler2);

            // Publish to service bus
            var @event = new FakeIntegrationEvent("B");
            await eventBus.PublishAsync(@event);

            // Assert
            Assert.Equal(@event.CreationDate, state.Date);
            Assert.Equal("B", state.Data);
        }
Esempio n. 2
0
        public async Task ServiceBus_PublishIntegrationEventsAsyncPersistsChangesToContext()
        {
            var @event  = new FakeIntegrationEvent("Fake Value");
            var options = SetupContext();

            using (var context = new InfrastructureContext(options))
            {
                var mockSerializer = new Mock <IMessageSerializer>();
                var sut            = new ServiceBus(
                    Mock.Of <IMessageSerializer>(),
                    Mock.Of <IHttpContextAccessor>(),
                    Mock.Of <IQueueClient>(),
                    Mock.Of <ITopicClient>(),
                    Mock.Of <ILogger>(),
                    context);


                await sut.PublishEventsAsync(@event);
            }

            using (var context = new InfrastructureContext(options))
            {
                var eventEntity = await context.IntegrationEvents.FindAsync(@event.MessageId);

                Assert.NotNull(eventEntity);
                Assert.Equal(@event.MessageId, eventEntity.Id);
            }
        }
    public async Task OnProcessMessageAsync_MessageProcessing_Fails_And_MaxDeliveryCount_Reached_Should_DeadLetter_Message()
    {
        // Arrange
        var eventName        = nameof(FakeIntegrationEvent);
        var eventId          = Guid.NewGuid();
        var eventIdAsString  = eventId.ToString();
        var integrationEvent = new FakeIntegrationEvent(eventId);
        var payload          = JsonSerializer.Serialize(integrationEvent);

        Mock.Get(_fixture.ProcessingPipeline)
        .Setup(s => s
               .Handle(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), CancellationToken.None))
        .ReturnsAsync(false);

        await _fixture.Processor.Start(CancellationToken.None);

        // Act
        var args = await _fixture.ServiceBusProcessor.SimulateMessageReceivingOf(
            messageId : eventIdAsString,
            subject : eventName,
            payload,
            attempt : EventsProcessor.MaxDeliveryCount + 1);

        // Assert
        args
        .WasDeadLettered
        .Should()
        .Be(true);
    }
    public async Task OnProcessMessageAsync_ProcessingPipeline_Throws_Exception_Should_Not_Swallow_It()
    {
        // Arrange
        var eventName        = nameof(FakeIntegrationEvent);
        var eventId          = Guid.NewGuid();
        var eventIdAsString  = eventId.ToString();
        var integrationEvent = new FakeIntegrationEvent(eventId);
        var payload          = JsonSerializer.Serialize(integrationEvent);

        Mock.Get(_fixture.ProcessingPipeline)
        .Setup(s => s
               .Handle(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), CancellationToken.None))
        .Throws(new Exception("Unit tests exception"));

        await _fixture.Processor.Start(CancellationToken.None);

        // Act

        // Assert
        await Assert.ThrowsAsync <Exception>(async() =>
        {
            await _fixture.ServiceBusProcessor.SimulateMessageReceivingOf(
                messageId: eventIdAsString,
                subject: eventName,
                payload,
                rethrowExceptions: true);
        });
    }
    public async Task OnProcessMessageAsync_MessageProcessing_Is_Successful_Should_Complete_Message()
    {
        // Arrange
        var eventName        = nameof(FakeIntegrationEvent);
        var eventId          = Guid.NewGuid();
        var eventIdAsString  = eventId.ToString();
        var integrationEvent = new FakeIntegrationEvent(eventId);
        var payload          = JsonSerializer.Serialize(integrationEvent);

        Mock.Get(_fixture.ProcessingPipeline)
        .Setup(s => s
               .Handle(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), CancellationToken.None))
        .ReturnsAsync(true);

        await _fixture.Processor.Start(CancellationToken.None);

        // Act
        var args = await _fixture.ServiceBusProcessor.SimulateMessageReceivingOf(
            messageId : eventIdAsString,
            subject : eventName,
            payload);

        // Assert
        args
        .WasCompleted
        .Should()
        .Be(true);
    }
Esempio n. 6
0
    public async Task Publish_Message_Serialized_Should_Be_Sent()
    {
        // Arrange
        _fixture
        .SetupMessageSerializerToReturnJson(out var json);

        var integrationEvent = new FakeIntegrationEvent();

        // Act
        var result = await _fixture.Publisher
                     .Publish(integrationEvent, CancellationToken.None);

        // Assert
        result.Should().Be(true);

        _fixture.SentMessage
        .Subject
        .Should()
        .Be(nameof(FakeIntegrationEvent));

        _fixture.SentMessage
        .Body.ToString()
        .Should()
        .Be(json);

        _fixture.SentMessage
        .MessageId
        .Should()
        .Be(integrationEvent.Id.ToString());
    }
Esempio n. 7
0
        public async Task EventBus_Should_Invoke_Event_Handlers(TopicType topicType, string prefix)
        {
            // Topic name
            var topicName = topicType == TopicType.Explicit ? "my-topic" : null;

            // Create handlers
            var state = new FakeState {
                Data = "A"
            };
            var fakeHandler1 = new FakeEventHandler1(state);
            var fakeHandler2 = new FakeEventHandler2(state);

            // Create message broker
            var messageBroker = new FakeMessageBroker();

            messageBroker.Subscribe(fakeHandler1, topicName, prefix);
            messageBroker.Subscribe(fakeHandler2, topicName, prefix);

            // Create service bus
            var eventBus = new FakeEventBus(messageBroker);

            eventBus.Subscribe(fakeHandler1, topicName, prefix);
            eventBus.Subscribe(fakeHandler2, topicName, prefix);

            // Publish to service bus
            var @event = new FakeIntegrationEvent("B");
            await eventBus.PublishAsync(@event, topicName, prefix);

            // Assert
            Assert.Equal(@event.CreationDate, state.Date);
            Assert.Equal("B", state.Data);
        }
        /// <summary>
        /// Setup message serializer to return instance of <see cref="FakeIntegrationEvent"/>
        /// and save in memento state, so it can be accessed later on.
        /// </summary>
        /// <returns></returns>
        public EventProcessingPipelineFixture SetupMessageSerializerToReturnMessages()
        {
            var message = new FakeIntegrationEvent();

            Mock.Get(MessageSerializer)
            .Setup(s => s
                   .UnpackFromJson(It.IsAny <string>(), It.IsAny <Type>()))
            .Returns(message);

            Memento
            .Save(message);

            return(this);
        }
Esempio n. 9
0
    public async Task AddEventAsync_Should_Add_Entry_To_IntegrationEventLogs()
    {
        // Arrange
        var initialRecords   = _fixture.OperationalDbContext.IntegrationEventLogs.Count();
        var integrationEvent = new FakeIntegrationEvent();

        // Act
        await _fixture.EventLogService.AddEventAsync(integrationEvent, CancellationToken.None);

        await _fixture.OperationalDbContext.SaveChangesAsync(CancellationToken.None);

        // Assert
        var resultingTotal = _fixture.OperationalDbContext.IntegrationEventLogs.Count();

        resultingTotal.Should().Be(initialRecords + 1);
    }
Esempio n. 10
0
    public async Task MarkEventAsInProgressAsync_Should_Mark_Event_AsInProgress()
    {
        // Arrange
        var integrationEvent = new FakeIntegrationEvent();
        await _fixture.EventLogService.AddEventAsync(integrationEvent, CancellationToken.None);

        await _fixture.OperationalDbContext.SaveChangesAsync(CancellationToken.None);

        // Act
        await _fixture.EventLogService.MarkEventAsInProgressAsync(integrationEvent.Id);

        // Assert
        var eventEntry = _fixture.OperationalDbContext
                         .IntegrationEventLogs.First(e => e.EventId == integrationEvent.Id);

        eventEntry.State.Should().Be(EventStateEnum.InProgress);
    }
Esempio n. 11
0
    public async Task MarkEventAsInProgressAsync_Called_2_Times_Should_Increment_TimesSent_Counter()
    {
        // Arrange
        var integrationEvent = new FakeIntegrationEvent();
        await _fixture.EventLogService.AddEventAsync(integrationEvent, CancellationToken.None);

        await _fixture.OperationalDbContext.SaveChangesAsync(CancellationToken.None);

        // Act
        await _fixture.EventLogService.MarkEventAsInProgressAsync(integrationEvent.Id);

        await _fixture.EventLogService.MarkEventAsInProgressAsync(integrationEvent.Id);

        // Assert
        var eventEntry = _fixture.OperationalDbContext
                         .IntegrationEventLogs.First(e => e.EventId == integrationEvent.Id);

        eventEntry.TimesSent.Should().Be(2);
    }
Esempio n. 12
0
    public async Task Publish_Has_3_PreSending_Steps_Should_Execute_Them()
    {
        // Arrange
        var @event = new FakeIntegrationEvent();

        _fixture
        .Setup3PreSendingSteps();

        // Act
        await _fixture.Publisher
        .Publish(@event, CancellationToken.None);

        // Assert
        foreach (var preSendingStep in _fixture.PreSendingSteps)
        {
            Mock.Get(preSendingStep)
            .Verify(v => v.Execute(@event, CancellationToken.None));
        }
    }
Esempio n. 13
0
        public async Task ServiceBus_PublishIntegrationEventsAsyncInvokesSerializeOnIMessageSerializer()
        {
            var @event  = new FakeIntegrationEvent("Fake Value");
            var options = SetupContext();

            using (var context = new InfrastructureContext(options))
            {
                var mockSerializer = new Mock <IMessageSerializer>();
                var sut            = new ServiceBus(mockSerializer.Object,
                                                    Mock.Of <IHttpContextAccessor>(),
                                                    Mock.Of <IQueueClient>(),
                                                    Mock.Of <ITopicClient>(),
                                                    Mock.Of <ILogger>(),
                                                    context);


                await sut.PublishEventsAsync(@event);

                mockSerializer.Verify(s => s.Serialize <IntegrationEvent>(@event));
            }
        }
Esempio n. 14
0
    public async Task OnProcessMessageAsync_Should_Trigger_Message_ProcessingPipeline()
    {
        // Arrange
        var eventName        = nameof(FakeIntegrationEvent);
        var eventId          = Guid.NewGuid();
        var eventIdAsString  = eventId.ToString();
        var integrationEvent = new FakeIntegrationEvent(eventId);
        var payload          = JsonSerializer.Serialize(integrationEvent);

        await _fixture.Processor.Start(CancellationToken.None);

        // Act
        await _fixture.ServiceBusProcessor.SimulateMessageReceivingOf(
            messageId : eventIdAsString,
            subject : eventName,
            payload);

        // Assert
        Mock.Get(_fixture.ProcessingPipeline)
        .Verify(v => v
                .Handle(eventIdAsString, eventName, payload, CancellationToken.None), Times.Once);
    }
Esempio n. 15
0
    public async Task OnProcessMessageAsync_Should_Call_ProcessingMessage_Callback()
    {
        // Arrange
        var eventName        = nameof(FakeIntegrationEvent);
        var eventId          = Guid.NewGuid();
        var eventIdAsString  = eventId.ToString();
        var integrationEvent = new FakeIntegrationEvent(eventId);
        var payload          = JsonSerializer.Serialize(integrationEvent);

        await _fixture.Processor.Start(CancellationToken.None);

        // Act
        await _fixture.ServiceBusProcessor.SimulateMessageReceivingOf(
            messageId : eventIdAsString,
            subject : eventName,
            payload);

        // Assert
        _fixture
        .ServiceBusProcessor
        .WasProcessingCallbackCalled
        .Should()
        .Be(true);
    }
 /// <summary>
 /// Saves <see cref="FakeIntegrationEvent"/> message in collection of
 /// processed messages in memento state.
 /// </summary>
 /// <param name="message"></param>
 public void Save(FakeIntegrationEvent message)
 => _messages.Add(message);