public async void WhenTopicIsRemoved_ThenTopicIsCreatedAgain()
        {
            var settings = TestSettings.TopicSettingsOptions();

            var subscriber = new AzureTopicSubscriber(settings, new AzureBusTopicManagement(settings), Substitute.For <ILogger <AzureTopicSubscriber> >());
            var publisher  = new AzureTopicPublisher(settings, new AzureBusTopicManagement(settings), Substitute.For <ILogger <AzureTopicPublisher> >());

            var id       = Guid.NewGuid();
            var listener = subscriber.Messages <TestMessageForTopic>();

            var message = new TestMessageForTopic
            {
                ExampleId = id
            };

            var nameSpace = NamespaceUtils.GetNamespace(settings.Value);
            var topic     = await nameSpace.Topics.GetByNameAsync(message.TopicName);

            topic.Should().NotBeNull("Topic should exist at this point");

            await nameSpace.Topics.DeleteByNameAsync(message.TopicName);

            Thread.Sleep(TimeSpan.FromSeconds(30));

            await publisher.SendAsync(message);

            await listener
            .Where(x => x.ExampleId == id)
            .Timeout(TimeSpan.FromSeconds(60))
            .FirstAsync();
        }
        public async void WhenFiltersAreSet_ThenDontReturnInvalidTenantMessages()
        {
            // Arrrange.
            var correctTenantId = Guid.NewGuid();
            var invalidTenantId = Guid.NewGuid();

            var settings = TestSettings.TopicSettingsOptions(s =>
            {
                s.AzureMessagePropertyBuilder = message => new Dictionary <string, object> {
                    { "tenant", ((TestMessageForTopic)message).TenantId }
                };
                s.AzureSubscriptionRules.Clear();
                s.AzureSubscriptionRules.Add("filter", new SqlFilter($"user.tenant='{correctTenantId}'"));
            });

            var publisher  = new AzureTopicPublisher(settings, new AzureBusTopicManagement(settings), Substitute.For <ILogger <AzureTopicPublisher> >());
            var subscriber = new AzureTopicSubscriber(settings, new AzureBusTopicManagement(settings), Substitute.For <ILogger <AzureTopicSubscriber> >());

            var id = Guid.NewGuid();
            var invalidTenantMessageId = Guid.NewGuid();
            var listener = subscriber.Messages <TestMessageForTopic>();

            // Act.
            await publisher.SendAsync(new TestMessageForTopic
            {
                ExampleId = id,
                TenantId  = correctTenantId.ToString(),
                Something = "valid"
            });

            await publisher.SendAsync(new TestMessageForTopic
            {
                ExampleId = invalidTenantMessageId,
                TenantId  = invalidTenantId.ToString(),
                Something = "invalid"
            });

            // Assert.
            await listener
            .Where(x => x.ExampleId == id)
            .Timeout(TimeSpan.FromSeconds(10))
            .FirstAsync();

            listener
            .Where(x => x.ExampleId == invalidTenantMessageId)
            .Timeout(TimeSpan.FromSeconds(10))
            .Invoking(x => x.FirstAsync().Wait())
            .Should()
            .Throw <TimeoutException>();
        }
        public async void WhenMessageIsSend_ThenItCanBeReceived()
        {
            var settings   = TestSettings.TopicSettingsOptions();
            var subscriber = new AzureTopicSubscriber(settings, new AzureBusTopicManagement(settings), Substitute.For <ILogger <AzureTopicSubscriber> >());
            var publisher  = new AzureTopicPublisher(settings, new AzureBusTopicManagement(settings), Substitute.For <ILogger <AzureTopicPublisher> >());

            var id       = Guid.NewGuid();
            var listener = subscriber.Messages <TestMessageForTopic>();

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

            await listener
            .Where(x => x.ExampleId == id)
            .Timeout(TimeSpan.FromSeconds(10))
            .FirstAsync();
        }