public async void WhenQueueDoesntExistYet_ThenCreateNew()
        {
            // Arrange.
            var testQueueName = $"testque_{Guid.NewGuid()}";

            var settings = TestSettings.QueueSettingsOptions();

            settings.Value.QueueNameBuilderForPublisher  = _ => testQueueName;
            settings.Value.QueueNameBuilderForSubscriber = _ => testQueueName;

            var publisher = new AzureQueuePublisher(settings, new AzureBusQueueManagement(settings), Substitute.For <ILogger <AzureQueuePublisher> >());
            var receiver  = new AzureQueueSubscriber(settings, new AzureBusQueueManagement(settings), Substitute.For <ILogger <AzureQueueSubscriber> >());

            var message = new TestMessage
            {
                ExampleId = Guid.NewGuid(),
                Something = "abc"
            };

            // Act.
            publisher
            .Invoking(x => x.SendAsync(message).Wait(TimeSpan.FromSeconds(10)))
            .Should().NotThrow <Exception>();

            // Assert.
            var result = await receiver.Messages <TestMessage>()
                         .Timeout(TimeSpan.FromSeconds(20))
                         .FirstAsync();

            result.ExampleId.Should().Be(message.ExampleId);
        }
Exemplo n.º 2
0
        private async Task <(Microsoft.Extensions.Logging.LogLevel logLevel, ISlackNotificationsSender sender)> InitSender(
            Microsoft.Extensions.Logging.LogLevel level,
            SlackNotificationsSerializer serializer,
            [NotNull] string azureQueueConnectionString,
            [NotNull] string azureQueuesBaseName)
        {
            return(await Task.Run(() =>
            {
                var azureQueuePublisher = new AzureQueuePublisher <SlackMessageQueueEntity>(
                    LogFactory.LastResort,
                    serializer,
                    $"Slack log [{level}]",
                    new AzureQueueSettings
                {
                    ConnectionString = azureQueueConnectionString,
                    QueueName = $"{azureQueuesBaseName}-{level}"
                },
                    fireNForgetQueueExistenceCheck: true)
                                          .Start();

                var sender = new SlackNotificationsSender(azureQueuePublisher, ownQueue: true);

                return (level, sender);
            }));
        }
        public async void WhenDynamicQueuesAreUsed_ThenDeliverMessagesCorrectly()
        {
            var tenant2 = Guid.NewGuid();

            // Arrange.
            var settings = TestSettings.QueueSettingsOptions();

            settings.Value.QueueNameBuilderForPublisher = x =>
            {
                if (x is TestMessage m)
                {
                    return(m.QueueName + "_" + m.TenantId);
                }
                throw new InvalidOperationException();
            };

            settings.Value.QueueNameBuilderForSubscriber = type =>
            {
                var instance = Activator.CreateInstance(type);

                if (instance is TestMessage m)
                {
                    return(m.QueueName + "_" + tenant2);
                }
                throw new InvalidOperationException();
            };

            var publisher = new AzureQueuePublisher(settings, new AzureBusQueueManagement(settings), Substitute.For <ILogger <AzureQueuePublisher> >());
            var receiver  = new AzureQueueSubscriber(settings, new AzureBusQueueManagement(settings), Substitute.For <ILogger <AzureQueueSubscriber> >());

            var message = new TestMessage
            {
                ExampleId = Guid.NewGuid(),
                Something = "abc",
                TenantId  = tenant2.ToString()
            };

            // Act.
            publisher
            .Invoking(x => x.SendAsync(message).Wait(TimeSpan.FromSeconds(10)))
            .Should().NotThrow <Exception>();

            // Assert.
            var result = await receiver.Messages <TestMessage>()
                         .Timeout(TimeSpan.FromSeconds(20))
                         .FirstAsync();

            result.ExampleId.Should().Be(message.ExampleId);
        }
        public async void WhenMessageIsSend_ThenItCanBeReceived()
        {
            var subscriber = new AzureQueueSubscriber(TestSettings.QueueSettingsOptions(), new AzureBusQueueManagement(TestSettings.QueueSettingsOptions()), Substitute.For <ILogger <AzureQueueSubscriber> >());
            var publisher  = new AzureQueuePublisher(TestSettings.QueueSettingsOptions(), new AzureBusQueueManagement(TestSettings.QueueSettingsOptions()), Substitute.For <ILogger <AzureQueuePublisher> >());

            var id = Guid.NewGuid();

            await publisher.SendAsync(new TestMessage
            {
                ExampleId = id
            });

            await subscriber.Messages <TestMessage>()
            .Where(x => x.ExampleId == id)
            .Timeout(TimeSpan.FromSeconds(30))
            .FirstAsync();
        }
        public static ISlackNotificationsSender UseSlackNotificationsSenderViaAzureQueue(
            this ContainerBuilder containerBuilder,
            AzureQueueSettings settings,
            ILog log = null)
        {
            var applicationName = PlatformServices.Default.Application.ApplicationName;

            var azureQueuePublisher =
                new AzureQueuePublisher <SlackMessageQueueEntity>(applicationName, settings)
                .SetLogger(log)
                .SetSerializer(new SlackNotificationsSerializer())
                .Start();

            var result = new SlackNotificationsSender(azureQueuePublisher);

            containerBuilder.RegisterInstance(result).As <ISlackNotificationsSender>().SingleInstance();

            return(result);
        }
        public static ISlackNotificationsSender UseSlackNotificationsSenderViaAzureQueue(
            this IServiceCollection serviceCollection,
            AzureQueueSettings settings,
            ILog log = null)
        {
            var applicationName = PlatformServices.Default.Application.ApplicationName;

            var azureQueuePublisher =
                new AzureQueuePublisher <SlackMessageQueueEntity>(applicationName, settings)
                .SetLogger(log)
                .SetSerializer(new SlackNotificationsSerializer())
                .Start();

            var result = new SlackNotificationsSender(azureQueuePublisher, ownQueue: true);

            serviceCollection.AddSingleton <ISlackNotificationsSender>(result);

            return(result);
        }
        /// <inheritdoc />
        public ISlackNotificationsSender Create(string azureQueueConnectionString, string azureQueuesBaseName)
        {
            if (string.IsNullOrWhiteSpace(azureQueueConnectionString))
            {
                throw new ArgumentNullException(nameof(azureQueueConnectionString));
            }
            if (string.IsNullOrWhiteSpace(azureQueuesBaseName))
            {
                throw new ArgumentNullException(nameof(azureQueuesBaseName));
            }

            var azureQueuePublisher = new AzureQueuePublisher <SlackMessageQueueEntity>(
                LogFactory.LastResort,
                new SlackNotificationsSerializer(),
                "Health notifier",
                new AzureQueueSettings
            {
                ConnectionString = azureQueueConnectionString,
                QueueName        = $"{azureQueuesBaseName}-monitor"
            })
                                      .Start();

            return(new SlackNotificationsSender(azureQueuePublisher, ownQueue: true));
        }