public async Task HappyPathNewSetting()
        {
            var receiver = new FakeReceiver("fake");

            MessagingConfigurationProvider provider = typeof(MessagingConfigurationProvider).New(receiver, null);

            var newSettings = @"{
  ""foo"": ""abc""
}";
            var message     = new FakeReceiverMessage(newSettings);

            var reloaded = false;

            ChangeToken.OnChange(provider.GetReloadToken, () => reloaded = true);

            var dataBefore = GetData(provider);

            // Simulate the FakeReceiver receiving a message.
            await receiver.MessageHandler.OnMessageReceivedAsync(receiver, message);

            // The protected Data property should have been replaced.
            GetData(provider).Should().NotBeSameAs(dataBefore);

            // Data should contain the new settings.
            GetData(provider).Should().ContainKey("foo");
            GetData(provider)["foo"].Should().Be("abc");

            // It should report that it has been reloaded.
            reloaded.Should().BeTrue();

            // The received message should have been handled by acknowledging it.
            message.Handled.Should().BeTrue();
            message.HandledBy.Should().Be(nameof(message.AcknowledgeAsync));
        }
        public async Task InvalidMessage()
        {
            var receiver = new FakeReceiver("fake");

            MessagingConfigurationProvider provider = typeof(MessagingConfigurationProvider).New(receiver, null);

            var reloaded = false;

            ChangeToken.OnChange(provider.GetReloadToken, () => reloaded = true);

            var newSettings = "This is {not] a [valid} JSON string: \"";

            var message = new FakeReceiverMessage(newSettings);

            var dataBefore = GetData(provider);

            // Simulate the FakeReceiver receiving a message.
            await receiver.MessageHandler.OnMessageReceivedAsync(receiver, message);

            // The protected Data property should not have been replaced.
            GetData(provider).Should().BeSameAs(dataBefore);

            // It should report that it has been reloaded.
            reloaded.Should().BeFalse();

            // The received message should have been handled by acknowledging it.
            message.Handled.Should().BeTrue();
            message.HandledBy.Should().Be(nameof(message.RejectAsync));
        }
        public void ConstructorSetsReceiverProperty()
        {
            var receiver = new FakeReceiver("fake");

            var source = new MessagingConfigurationSource(receiver);

            source.Receiver.Should().BeSameAs(receiver);
        }
        public void ConstructorLeavesDataEmpty()
        {
            var receiver = new FakeReceiver("fake");

            MessagingConfigurationProvider provider = typeof(MessagingConfigurationProvider).New(receiver, null);

            GetData(provider).Should().BeEmpty();
        }
        public void ConstructorSetsReceiverProperty()
        {
            var receiver = new FakeReceiver("fake");

            MessagingConfigurationProvider provider = typeof(MessagingConfigurationProvider).New(receiver, null);

            provider.Receiver.Should().BeSameAs(receiver);
        }
        public void ConstructorSetsSettingFilterProperty()
        {
            var receiver = new FakeReceiver("fake");
            var filter   = new FakeSettingFilter();

            MessagingConfigurationProvider provider = typeof(MessagingConfigurationProvider).New(receiver, filter);

            provider.SettingFilter.Should().BeSameAs(filter);
        }
        public void ConstructorThrowsIfReceiverIsAlreadyStarted()
        {
            var receiver = new FakeReceiver("fake");

            receiver.Start(m => m.AcknowledgeAsync());

            Action action = () => new MessagingConfigurationSource(receiver);

            action.Should().ThrowExactly <ArgumentException>().WithMessage("The receiver is already started.*receiver*");
        }
        public void ConstructorStartsTheReceiver()
        {
            var receiver = new FakeReceiver("fake");

            receiver.MessageHandler.Should().BeNull();

            MessagingConfigurationProvider provider = typeof(MessagingConfigurationProvider).New(receiver, null);

            receiver.MessageHandler.Should().NotBeNull();
        }
        public void BuildMethodReturnsSameMessagingConfigurationProviderEachTime()
        {
            var receiver = new FakeReceiver("fake");

            var source = new MessagingConfigurationSource(receiver);

            var provider1 = source.Build(null);
            var provider2 = source.Build(null);

            provider1.Should().BeSameAs(provider2);
        }
        public void ConstructorThrowsIfReceiverIsUsedByAnotherMessagingConfigurationSource()
        {
            var receiver = new FakeReceiver("fake");

            // Create a source with the receiver and throw it away.
            new MessagingConfigurationSource(receiver);

            // Passing the same receiver to another source causes it to throw.
            Action action = () => new MessagingConfigurationSource(receiver);

            action.Should().ThrowExactly <ArgumentException>().WithMessage("The same instance of IReceiver cannot be used to create multiple instances of MessagingConfigurationSource.*receiver*");
        }
        public void BuildMethodReturnsMessagingConfigurationProvider()
        {
            var receiver = new FakeReceiver("fake");
            var filter   = new FakeSettingFilter();

            var source = new MessagingConfigurationSource(receiver, filter);

            var provider = source.Build(null);

            provider.Should().BeOfType <MessagingConfigurationProvider>();

            var messagingProvider = (MessagingConfigurationProvider)provider;

            messagingProvider.Receiver.Should().BeSameAs(receiver);
            messagingProvider.SettingFilter.Should().BeSameAs(filter);
        }
        public void AddRockLibMessagingProviderExtensionMethod2AddsAMessagingConfigurationSourceToTheConfigurationBuilder()
        {
            var receiver = new FakeReceiver("fake");
            var filter   = new FakeSettingFilter();

            var builder = new ConfigurationBuilder();

            builder.AddRockLibMessagingProvider(receiver, filter);

            builder.Sources.Should().HaveCount(1);
            builder.Sources[0].Should().BeOfType <MessagingConfigurationSource>();

            var source = (MessagingConfigurationSource)builder.Sources[0];

            source.Receiver.Should().BeSameAs(receiver);
            source.SettingFilter.Should().BeSameAs(filter);
        }