public async Task WhenMessageIsLockedByAnotherHandler_MessageWillBeLeftInTheQueue()
        {
            var messageLock = new FakeMessageLock(false);

            var testResolver = new InMemoryServiceResolver(sc => sc
                .AddLogging(l =>
                    l.AddXUnit(_outputHelper))
                .AddSingleton<IMessageLockAsync>(messageLock));

            var monitor = new TrackingLoggingMonitor(LoggerFactory.Create(lf => lf.AddXUnit()).CreateLogger<TrackingLoggingMonitor>());
            var handler = new InspectableHandler<OrderAccepted>();

            var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver)
                .UseExactlyOnce<OrderAccepted>(nameof(InspectableHandler<OrderAccepted>),
                    TimeSpan.FromSeconds(1))
                .UseHandler(ctx => handler)
                .Build();

            var context = TestHandleContexts.From<OrderAccepted>();

            var result = await middleware.RunAsync(context, null, CancellationToken.None);

            handler.ReceivedMessages.ShouldBeEmpty();
            result.ShouldBeFalse();
        }
コード例 #2
0
        public async Task MiddlewareBuilder_WithoutDefaults_ShouldExecute()
        {
            var callRecord = new List <string>();

            void Before(string id) => callRecord.Add($"Before_{id}");
            void After(string id) => callRecord.Add($"After_{id}");

            var outer = new TrackingMiddleware("outer", Before, After);
            var inner = new TrackingMiddleware("inner", Before, After);

            var handler = new InspectableHandler <SimpleMessage>();

            var middlewareBuilder = new HandlerMiddlewareBuilder(_resolver, _resolver)
                                    .Configure(hmb =>
                                               hmb.Use(outer)
                                               .Use(inner)
                                               .UseHandler(ctx => handler));

            var handlerMiddleware = middlewareBuilder.Build();

            var context = TestHandleContexts.From <SimpleMessage>();

            await handlerMiddleware.RunAsync(context, null, CancellationToken.None);

            callRecord.ShouldBe(new[] { "Before_outer", "Before_inner", "After_inner", "After_outer" });
            handler.ReceivedMessages.ShouldHaveSingleItem();
        }
コード例 #3
0
    public async Task Then_Both_Handlers_Receive_Messages()
    {
        // Arrange
        var genericHandler    = new InspectableHandler <GenericMessage <SimpleMessage> >();
        var nonGenericHandler = new InspectableHandler <SimpleMessage>();

        var services = GivenJustSaying()
                       .ConfigureJustSaying((builder) => builder.WithLoopbackTopic <GenericMessage <SimpleMessage> >($"{UniqueName}-generic"))
                       .ConfigureJustSaying((builder) => builder.WithLoopbackTopic <SimpleMessage>($"{UniqueName}-nongeneric"))
                       .AddSingleton <IHandlerAsync <GenericMessage <SimpleMessage> > >(genericHandler)
                       .AddSingleton <IHandlerAsync <SimpleMessage> >(nonGenericHandler);

        await WhenAsync(
            services,
            async (publisher, listener, serviceProvider, cancellationToken) =>
        {
            await listener.StartAsync(cancellationToken);
            await publisher.StartAsync(cancellationToken);

            // Act
            await publisher.PublishAsync(new GenericMessage <SimpleMessage>(), cancellationToken);
            await publisher.PublishAsync(new SimpleMessage(), cancellationToken);

            await Patiently.AssertThatAsync(OutputHelper,
                                            () =>
            {
                genericHandler.ReceivedMessages.ShouldHaveSingleItem();
                nonGenericHandler.ReceivedMessages.ShouldHaveSingleItem();
            });
        });
    }
コード例 #4
0
        public async Task Then_The_Defaults_Are_The_Defaults_For_Sure()
        {
            // Arrange
            var handler = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName))
                           .AddJustSayingHandlers(new[] { handler });

            string json = "";

            await WhenAsync(
                services,
                (_, listener, _, _) =>
            {
                dynamic interrogation = listener.Interrogate();
                dynamic middlewares   = interrogation.Data.Middleware;

                json = JsonConvert.SerializeObject(middlewares, Formatting.Indented)
                       .Replace(UniqueName, "TestQueueName");

                return(Task.CompletedTask);
            });

            json.ShouldMatchApproved(c => c.SubFolder("Approvals"));
        }
        public async Task Then_The_Handler_Only_Receives_The_Message_Once()
        {
            // Arrange
            var messageLock = new MessageLockStore();
            var handler     = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .AddSingleton <IMessageLockAsync>(messageLock)
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          c =>
                                                                                          c.WithReadConfiguration(rc =>
                                                                                                                  rc.WithMiddlewareConfiguration(m =>
                                                                                                                                                 m.UseExactlyOnce <SimpleMessage>("simple-message-lock")))))
                           .AddJustSayingHandlers(new[] { handler });

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                var message = new SimpleMessage();

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await publisher.PublishAsync(message, cancellationToken);
                await Task.Delay(1.Seconds(), cancellationToken);

                handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey())
                .ShouldHaveSingleItem();
            });
        }
コード例 #6
0
        public async Task Then_Both_Handlers_Receive_The_Message()
        {
            var messageLock = new MessageLockStore();

            var handler1 = new InspectableHandler <SimpleMessage>();
            var handler2 = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .AddSingleton <IMessageLockAsync>(messageLock)
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          t => t.WithReadConfiguration(rc =>
                                                                                                                       rc.WithMiddlewareConfiguration(m =>
                                                                                                                                                      m.UseExactlyOnce <SimpleMessage>("some-key")))))
                           .AddJustSayingHandlers(new[] { handler1, handler2 });

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                var message = new SimpleMessage();

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await Task.Delay(1.Seconds(), cancellationToken);

                // Assert
                handler1.ReceivedMessages.ShouldHaveSingleItem().Id.ShouldBe(message.Id);
                handler2.ReceivedMessages.ShouldHaveSingleItem().Id.ShouldBe(message.Id);
            });
        }
        public async Task Then_The_Message_Is_Handled()
        {
            // Arrange
            var handler = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .ConfigureJustSaying(
                (builder) => builder.WithLoopbackTopic <SimpleMessage>(UniqueName))
                           .AddSingleton <IMessageSerializationFactory, SystemTextJsonSerializationFactory>()
                           .AddSingleton <IHandlerAsync <SimpleMessage> >(handler);

            string content = Guid.NewGuid().ToString();

            var message = new SimpleMessage()
            {
                Content = content
            };

            await WhenAsync(
                services,
                async (publisher, listener, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                // Act
                await publisher.PublishAsync(message, cancellationToken);

                // Assert
                await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);

                handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content);
            });
        }
コード例 #8
0
    public async Task Then_The_Pipeline_Should_Only_Contain_User_Specified_Middlewares()
    {
        // Arrange
        var handler        = new InspectableHandler <SimpleMessage>();
        var testMiddleware = new InspectableMiddleware <SimpleMessage>();

        var services = GivenJustSaying()
                       .ConfigureJustSaying((builder) =>
                                            MessagingBusBuilderTestExtensions.WithLoopbackTopic <SimpleMessage>(builder,
                                                                                                                UniqueName,
                                                                                                                c => c.WithMiddlewareConfiguration(m =>
        {
            m.Use(testMiddleware);
            m.UseHandler(_ => handler);
        })))
                       .AddJustSayingHandlers(new[] { handler });

        string json = "";

        await WhenAsync(
            services,
            (_, listener, _, _) =>
        {
            dynamic middlewares = ((dynamic)listener.Interrogate().Data).Middleware;

            json = JsonConvert.SerializeObject(middlewares, Formatting.Indented)
                   .Replace(UniqueName, "TestQueueName");

            return(Task.CompletedTask);
        });

        json.ShouldMatchApproved(c => c.SubFolder("Approvals"));
    }
コード例 #9
0
        public async Task HandleMessageFromQueueLogs_ShouldHaveContext(bool handlerShouldSucceed, LogLevel level, string status, string exceptionMessage)
        {
            var handler = new InspectableHandler <SimpleMessage>()
            {
                ShouldSucceed = handlerShouldSucceed,
            };

            if (exceptionMessage != null)
            {
                handler.OnHandle = msg => throw new Exception(exceptionMessage);
            }

            var services = GivenJustSaying(levelOverride: LogLevel.Information)
                           .ConfigureJustSaying(
                (builder) => builder.WithLoopbackQueue <SimpleMessage>(UniqueName)
                .Subscriptions(sub => sub.WithDefaults(sgb =>
                                                       sgb.WithDefaultConcurrencyLimit(10))))
                           .AddSingleton <IHandlerAsync <SimpleMessage> >(handler);

            var sp = services.BuildServiceProvider();

            var cts = new CancellationTokenSource();

            var publisher = sp.GetRequiredService <IMessagePublisher>();
            await publisher.StartAsync(cts.Token);

            await sp.GetRequiredService <IMessagingBus>().StartAsync(cts.Token);

            var message = new SimpleMessage();
            await publisher.PublishAsync(message, cts.Token);

            await Patiently.AssertThatAsync(() => handler.ReceivedMessages
                                            .ShouldHaveSingleItem()
                                            .Id.ShouldBe(message.Id));

            var testLogger = sp.GetRequiredService <ITestLoggerSink>();

            await Patiently.AssertThatAsync(() =>
            {
                var handleMessage = testLogger.LogEntries
                                    .SingleOrDefault(le => le.OriginalFormat == "{Status} handling message with Id '{MessageId}' of type {MessageType} in {TimeToHandle}ms.");

                handleMessage.ShouldNotBeNull();

                handleMessage.LogLevel.ShouldBe(level);
                handleMessage.Exception?.Message.ShouldBe(exceptionMessage);

                var propertyMap = new Dictionary <string, object>(handleMessage.Properties);
                propertyMap.ShouldContainKeyAndValue("Status", status);
                propertyMap.ShouldContainKeyAndValue("MessageId", message.Id);
                propertyMap.ShouldContainKeyAndValue("MessageType", message.GetType().FullName);
                propertyMap.ShouldContainKey("TimeToHandle");
            });

            cts.Cancel();
        }
コード例 #10
0
    public async Task CanSubscribeUsingQueueArn()
    {
        IAwsClientFactory clientFactory = CreateClientFactory();
        var sqsClient     = clientFactory.GetSqsClient(Region);
        var snsClient     = clientFactory.GetSnsClient(Region);
        var queueResponse = await sqsClient.CreateQueueAsync(UniqueName);

        var anotherUniqueName = $"{Guid.NewGuid():N}-integration-tests";
        var topicResponse     = await snsClient.CreateTopicAsync(anotherUniqueName);

        var subscriptionArn = await snsClient.SubscribeQueueAsync(topicResponse.TopicArn, sqsClient, queueResponse.QueueUrl);

        var queueArn = (await sqsClient.GetQueueAttributesAsync(queueResponse.QueueUrl, new List <string> {
            SQSConstants.ATTRIBUTE_QUEUE_ARN
        })).Attributes[SQSConstants.ATTRIBUTE_QUEUE_ARN];

        var handler = new InspectableHandler <SimpleMessage>();

        var services = GivenJustSaying()
                       .ConfigureJustSaying(builder =>
                                            builder
                                            .Subscriptions(c =>
                                                           c.ForQueueArn <SimpleMessage>(queueArn))
                                            .Publications(c =>
                                                          c.WithTopicArn <SimpleMessage>(topicResponse.TopicArn)
                                                          )
                                            )
                       .AddJustSayingHandlers(new[] { handler });

        string content = Guid.NewGuid().ToString();

        var message = new SimpleMessage
        {
            Content = content
        };

        await WhenAsync(
            services,
            async (publisher, listener, serviceProvider, cancellationToken) =>
        {
            await listener.StartAsync(cancellationToken);
            await publisher.StartAsync(cancellationToken);

            await publisher.PublishAsync(message, cancellationToken);

            // Assert
            await Patiently.AssertThatAsync(OutputHelper,
                                            () =>
            {
                handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content);
            });
        });
    }
コード例 #11
0
 public ChannelInitializerTest()
 {
     _group  = new DefaultEventLoopGroup(1);
     _server = new ServerBootstrap()
               .Group(_group)
               .Channel <LocalServerChannel>()
               .LocalAddress(SERVER_ADDRESS);
     _client = new Bootstrap()
               .Group(_group)
               .Channel <LocalChannel>()
               .Handler(new ChannelHandlerAdapter());
     _testHandler = new InspectableHandler();
 }
コード例 #12
0
        public async Task ThenItIsUsed()
        {
            // Arrange
            var handler  = new InspectableHandler <SimpleMessage>();
            var accessor = new RecordingMessageContextAccessor(new MessageContextAccessor());

            var subject         = Guid.NewGuid().ToString();
            var subjectProvider = new ConstantSubjectProvider(subject);

            var services = GivenJustSaying()
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName))
                           .ConfigureJustSaying(builder =>
                                                builder.Services(s => s.WithMessageContextAccessor(() => accessor)))
                           .ConfigureJustSaying((builder) =>
                                                builder.Messaging(m =>
                                                                  m.WithMessageSubjectProvider(subjectProvider)))
                           .AddSingleton <IHandlerAsync <SimpleMessage> >(handler);

            var id      = Guid.NewGuid();
            var message = new SimpleMessage()
            {
                Id = id
            };

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));

            await WhenAsync(
                services,
                async (publisher, listener, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                // Let's send an OrderPlaced, but the subject will be a GUID
                // because of the custom subject provider
                await publisher.PublishAsync(message, cancellationToken);

                await Patiently.AssertThatAsync(OutputHelper,
                                                () =>
                {
                    var receivedMessage = handler.ReceivedMessages.ShouldHaveSingleItem();
                    receivedMessage.Id.ShouldBe(id);

                    var context    = accessor.ValuesWritten.ShouldHaveSingleItem();
                    dynamic json   = JsonConvert.DeserializeObject(context.Message.Body);
                    string subject = json.Subject;
                    subject.ShouldBe(subject);
                });
            });
        }
コード例 #13
0
        public async Task Add_Different_Handler_Per_Queue()
        {
            // Arrange
            string group1     = "group1";
            string group2     = "group2";
            string queueName1 = "queue1";
            string queueName2 = "queue2";

            JustSaying.JustSayingBus bus = CreateBus();

            var handler1 = new InspectableHandler <TestJustSayingMessage>();
            var handler2 = new InspectableHandler <TestJustSayingMessage>();

            bus.AddMessageHandler(queueName1, () => handler1);
            bus.AddMessageHandler(queueName2, () => handler2);

            ISqsQueue queue1 = TestQueue(bus.SerializationRegister, queueName1);
            ISqsQueue queue2 = TestQueue(bus.SerializationRegister, queueName2);

            bus.AddQueue(group1, queue1);
            bus.AddQueue(group2, queue2);

            using var cts = new CancellationTokenSource();

            // Act
            await bus.StartAsync(cts.Token);

            await Patiently.AssertThatAsync(_outputHelper,
                                            () =>
            {
                handler1.ReceivedMessages.Count.ShouldBeGreaterThan(0);
                handler2.ReceivedMessages.Count.ShouldBeGreaterThan(0);
            });

            cts.Cancel();
            await bus.Completion;

            foreach (var message in handler1.ReceivedMessages)
            {
                message.QueueName.ShouldBe(queueName1);
            }

            foreach (var message in handler2.ReceivedMessages)
            {
                message.QueueName.ShouldBe(queueName2);
            }

            bus.Dispose();
        }
コード例 #14
0
        private void GivenInternal()
        {
            Queues  = new List <ISqsQueue>();
            Handler = new InspectableHandler <SimpleMessage>();

            var testResolver = new FakeServiceResolver(sc => sc
                                                       .AddLogging(l => l.AddXUnit(OutputHelper)));

            Middleware            = new HandlerMiddlewareBuilder(testResolver, testResolver).UseHandler(ctx => Handler).Build();
            Monitor               = new TrackingLoggingMonitor(LoggerFactory.CreateLogger <TrackingLoggingMonitor>());
            SerializationRegister = new FakeSerializationRegister();
            MiddlewareMap         = new MiddlewareMap();

            Given();
        }
コード例 #15
0
        public StopwatchMiddlewareTests(ITestOutputHelper outputHelper)
        {
            var loggerFactory = LoggerFactory.Create(lf => lf.AddXUnit(outputHelper));

            _handler = new InspectableHandler <OrderAccepted>();
            _monitor = new TrackingLoggingMonitor(loggerFactory.CreateLogger <TrackingLoggingMonitor>());
            var serviceResolver = new FakeServiceResolver(c =>
                                                          c.AddSingleton <IHandlerAsync <OrderAccepted> >(_handler)
                                                          .AddSingleton <IMessageMonitor>(_monitor));

            _middleware = new HandlerMiddlewareBuilder(serviceResolver, serviceResolver)
                          .UseHandler <OrderAccepted>()
                          .UseStopwatch(_handler.GetType())
                          .Build();
        }
コード例 #16
0
    public async Task Then_The_Message_Is_Handled()
    {
        // Arrange
        var handler = new InspectableHandler <SimpleMessage>();

        var services = GivenJustSaying()
                       .ConfigureJustSaying((builder) =>
                                            builder
                                            .Publications((options) =>
                                                          options.WithTopic <SimpleMessage>(configure => { configure.WithName("my-special-topic"); }))
                                            .Subscriptions((options) =>
                                                           options.ForTopic <SimpleMessage>("my-special-topic",
                                                                                            subscriptionBuilder => { subscriptionBuilder.WithName(UniqueName); })))
                       .AddSingleton <IHandlerAsync <SimpleMessage> >(handler);

        string content = Guid.NewGuid().ToString();

        var message = new SimpleMessage()
        {
            Content = content
        };

        string json = "";

        await WhenAsync(
            services,
            async (publisher, listener, cancellationToken) =>
        {
            await listener.StartAsync(cancellationToken);
            await publisher.StartAsync(cancellationToken);

            var listenerJson  = JsonConvert.SerializeObject(listener.Interrogate(), Formatting.Indented);
            var publisherJson = JsonConvert.SerializeObject(publisher.Interrogate(), Formatting.Indented);

            await publisher.PublishAsync(message, cancellationToken);

            json = string.Join($"{Environment.NewLine}{Environment.NewLine}",
                               listenerJson,
                               publisherJson)
                   .Replace(UniqueName, "integrationTestQueueName", StringComparison.Ordinal);

            await Patiently.AssertThatAsync(OutputHelper,
                                            () =>
                                            handler.ReceivedMessages.Any(x => x.Content == content).ShouldBeTrue());
        });

        json.ShouldMatchApproved(opt => opt.SubFolder("Approvals"));
    }
コード例 #17
0
            protected override void Given()
            {
                base.Given();

                var handler = new InspectableHandler <SimpleMessage>();

                var testResolver = new InMemoryServiceResolver(_outputHelper,
                                                               _messageMonitor,
                                                               sc => sc.AddSingleton <IHandlerAsync <SimpleMessage> >(handler));

                var middleware = new HandlerMiddlewareBuilder(testResolver, testResolver)
                                 .UseBackoff(MessageBackoffStrategy)
                                 .UseDefaults <SimpleMessage>(handler.GetType())
                                 .Build();

                _middlewareMap.Add <OrderAccepted>(_queue.QueueName, middleware);
            }
コード例 #18
0
    public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue()
    {
        // Arrange
        var handler = new InspectableHandler <SimpleMessage>();

        using var container = new Container(
                  (registry) =>
        {
            registry.For <ILoggerFactory>()
            .Use(() => OutputHelper.ToLoggerFactory())
            .Singleton();

            registry.For <IHandlerAsync <SimpleMessage> >()
            .Use(handler);

            registry.AddJustSaying(
                (builder) =>
            {
                builder.Client((options) =>
                               options.WithBasicCredentials("accessKey", "secretKey")
                               .WithServiceUri(TestEnvironment.SimulatorUrl))
                .Messaging((options) => options.WithRegion("eu-west-1"))
                .Publications((options) => options.WithQueue <SimpleMessage>())
                .Subscriptions((options) => options.ForQueue <SimpleMessage>());
            });
        });

        IMessagePublisher publisher = container.GetInstance <IMessagePublisher>();
        IMessagingBus     listener  = container.GetInstance <IMessagingBus>();

        var message = new SimpleMessage();

        using var source = new CancellationTokenSource(TimeSpan.FromSeconds(20));
        await listener.StartAsync(source.Token);

        await publisher.StartAsync(source.Token);

        // Act
        await publisher.PublishAsync(message, source.Token);

        await Patiently.AssertThatAsync(OutputHelper,
                                        () => handler.ReceivedMessages.Any());

        // Assert
        handler.ReceivedMessages.ShouldContain(x => x.GetType() == typeof(SimpleMessage));
    }
コード例 #19
0
        private void GivenInternal()
        {
            Queues  = new List <ISqsQueue>();
            Handler = new InspectableHandler <SimpleMessage>();
            Monitor = new TrackingLoggingMonitor(LoggerFactory.CreateLogger <TrackingLoggingMonitor>());
            SerializationRegister = new FakeSerializationRegister();
            MiddlewareMap         = new MiddlewareMap();
            CompletionMiddleware  = new AwaitableMiddleware(OutputHelper);

            var testResolver = new InMemoryServiceResolver(OutputHelper, Monitor,
                                                           sc => sc.AddSingleton <IHandlerAsync <SimpleMessage> >(Handler));

            Middleware = new HandlerMiddlewareBuilder(testResolver, testResolver)
                         .Use(CompletionMiddleware)
                         .UseDefaults <SimpleMessage>(typeof(InspectableHandler <SimpleMessage>))
                         .Build();

            Given();
        }
        public async Task Then_The_Middlewares_Are_Called()
        {
            var handler = new InspectableHandler <SimpleMessage>();

            var callRecord = new List <string>();

            void Before(string id) => callRecord.Add($"Before_{id}");
            void After(string id) => callRecord.Add($"After_{id}");

            var outerMiddleware  = new TrackingMiddleware("outer", Before, After);
            var middleMiddleware = new TrackingMiddleware("middle", Before, After);
            var innerMiddleware  = new TrackingMiddleware("inner", Before, After);

            var services = GivenJustSaying()
                           .AddSingleton(outerMiddleware)
                           .AddSingleton <IHandlerAsync <SimpleMessage> >(handler)
                           .ConfigureJustSaying(builder =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          topic => topic.WithReadConfiguration(rc =>
                                                                                                                               rc.WithMiddlewareConfiguration(
                                                                                                                                   pipe =>
            {
                pipe.Use <TrackingMiddleware>();               // from DI
                pipe.Use(() => middleMiddleware);              // provide a Func<MiddlewareBase<HandleMessageContext, bool>
                pipe.Use(innerMiddleware);                     // Existing instance
            }))));

            await WhenAsync(services,
                            async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                // Act
                await publisher.PublishAsync(new SimpleMessage(), cancellationToken);

                await Patiently.AssertThatAsync(OutputHelper,
                                                () => handler.ReceivedMessages.Any());
            });

            string.Join(Environment.NewLine, callRecord)
            .ShouldMatchApproved(c => c.SubFolder("Approvals"));
        }
コード例 #21
0
    public async Task CanPublishUsingQueueUrl()
    {
        IAwsClientFactory clientFactory = CreateClientFactory();
        var sqsClient     = clientFactory.GetSqsClient(Region);
        var queueResponse = await sqsClient.CreateQueueAsync(UniqueName);

        var handler = new InspectableHandler <SimpleMessage>();

        var services = GivenJustSaying()
                       .ConfigureJustSaying(builder =>
                                            builder
                                            .Subscriptions(c =>
                                                           c.ForQueueUrl <SimpleMessage>(queueResponse.QueueUrl))
                                            .Publications(c =>
                                                          c.WithQueueUrl <SimpleMessage>(queueResponse.QueueUrl)
                                                          )
                                            )
                       .AddJustSayingHandlers(new[] { handler });

        string content = Guid.NewGuid().ToString();

        var message = new SimpleMessage
        {
            Content = content
        };

        await WhenAsync(
            services,
            async (publisher, listener, serviceProvider, cancellationToken) =>
        {
            await listener.StartAsync(cancellationToken);
            await publisher.StartAsync(cancellationToken);

            await publisher.PublishAsync(message, cancellationToken);

            // Assert
            await Patiently.AssertThatAsync(OutputHelper,
                                            () =>
            {
                handler.ReceivedMessages.ShouldHaveSingleItem().Content.ShouldBe(content);
            });
        });
    }
コード例 #22
0
        public async Task Then_The_Handler_Only_Receives_The_Message_Once()
        {
            // Arrange
            var messageLock = new MessageLockStore();
            var handler     = new InspectableHandler <SimpleMessage>();

            var services = GivenJustSaying()
                           .AddSingleton <IMessageLockAsync>(messageLock)
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          c => c.WithMiddlewareConfiguration(m =>
                                                                                                                             m.UseExactlyOnce <SimpleMessage>("lock-simple-message")
                                                                                                                             .UseDefaults <SimpleMessage>(handler.GetType()))))
                           .AddJustSayingHandlers(new[] { handler });

            var    message = new SimpleMessage();
            string json    = "";

            await WhenAsync(
                services,
                async (publisher, listener, serviceProvider, cancellationToken) =>
            {
                await listener.StartAsync(cancellationToken);
                await publisher.StartAsync(cancellationToken);

                // Act
                await publisher.PublishAsync(message, cancellationToken);
                await publisher.PublishAsync(message, cancellationToken);

                dynamic middlewares = ((dynamic)listener.Interrogate().Data).Middleware;
                json = JsonConvert.SerializeObject(middlewares, Formatting.Indented)
                       .Replace(UniqueName, "TestQueueName");

                await Patiently.AssertThatAsync(() =>
                {
                    handler.ReceivedMessages.Where(m => m.Id.ToString() == message.UniqueKey())
                    .ShouldHaveSingleItem();
                });
            });

            json.ShouldMatchApproved(c => c.SubFolder("Approvals"));
        }
コード例 #23
0
    public async Task Then_The_Message_Is_Handled()
    {
        // Arrange
        var handler = new InspectableHandler <SimpleMessage>();

        string masterKeyId = "alias/aws/sqs";

        var services = GivenJustSaying()
                       .ConfigureJustSaying(
            (builder) => builder.Publications((options) => options.WithQueue <SimpleMessage>(
                                                  (queue) => queue.WithWriteConfiguration(
                                                      (config) => config.WithQueueName(UniqueName).WithEncryption(masterKeyId)))))
                       .ConfigureJustSaying(
            (builder) => builder.Subscriptions((options) => options.ForQueue <SimpleMessage>(
                                                   (queue) => queue.WithName(UniqueName).WithReadConfiguration(
                                                       (config) => config.WithEncryption(masterKeyId)))))
                       .AddSingleton <IHandlerAsync <SimpleMessage> >(handler);

        string content = Guid.NewGuid().ToString();

        var message = new SimpleMessage()
        {
            Content = content
        };

        await WhenAsync(
            services,
            async (publisher, listener, cancellationToken) =>
        {
            await listener.StartAsync(cancellationToken);
            await publisher.StartAsync(cancellationToken);

            // Act
            await publisher.PublishAsync(message, cancellationToken);

            // Assert
            await Patiently.AssertThatAsync(OutputHelper,
                                            () => handler.ReceivedMessages.Any(msg => msg.Content == content));
        });
    }
コード例 #24
0
        public async Task Then_The_Builder_Should_Put_User_Middlewares_In_The_Correct_Order()
        {
            // Arrange
            var handler         = new InspectableHandler <SimpleMessage>();
            var outerMiddleware = new OuterTestMiddleware();
            var innerMiddleware = new InnerTestMiddleware();
            var afterMiddleware = new AfterTestMiddleware();

            var services = GivenJustSaying()
                           .ConfigureJustSaying((builder) =>
                                                builder.WithLoopbackTopic <SimpleMessage>(UniqueName,
                                                                                          c => c.WithMiddlewareConfiguration(m =>
            {
                m.Use(outerMiddleware);
                m.Use(innerMiddleware);
                m.UseDefaults <SimpleMessage>(handler.GetType());
                m.Use(afterMiddleware);
            })))
                           .AddJustSayingHandlers(new[] { handler });

            string json = "";

            await WhenAsync(
                services,
                (_, listener, _, _) =>
            {
                dynamic interrogation = listener.Interrogate();
                dynamic middlewares   = interrogation.Data.Middleware;

                json = JsonConvert.SerializeObject(middlewares, Formatting.Indented)
                       .Replace(UniqueName, "TestQueueName");

                return(Task.CompletedTask);
            });

            json.ShouldMatchApproved(c => c.SubFolder($"Approvals"));
        }
コード例 #25
0
 public InspectableMiddleware()
 {
     Handler = new InspectableHandler <TMessage>();
 }