public void StopsOneProcessor()
        {
            var configChangeManager = new ConfigurationChangeManager();
            var config = new SimpleConfigurationReader
            {
                Configs = new List <ConfigurationEntry> {
                    GetOneConfigurationEntry("#1", false)
                }
            };

            var mockProcessor = new Mock <IQueueProcessor>(MockBehavior.Strict);

            mockProcessor.Setup(x => x.Configuration).Returns(GetOneConfigurationEntry("#1", true)).Verifiable();
            mockProcessor.Setup(x => x.Stop()).Verifiable();
            var processors = new List <IQueueProcessor>
            {
                mockProcessor.Object
            };

            configChangeManager.ReadChanges(config, processors, null, null, null);
            Assert.NotNull(processors);
            Assert.Empty(processors);

            mockProcessor.VerifyGet(x => x.Configuration, Times.AtLeastOnce());
            mockProcessor.Verify(x => x.Stop(), Times.Exactly(1));
        }
        public void StartsOneProcessorAndOptionallyDoesNotRestartTheSameOne(bool readConfigurationAgain)
        {
            var configChangeManager = new ConfigurationChangeManager();
            var config = new SimpleConfigurationReader
            {
                Configs = new List <ConfigurationEntry> {
                    GetOneConfigurationEntry("#1", true)
                }
            };

            var mockProcessor = new Mock <IQueueProcessor>(MockBehavior.Strict);

            mockProcessor.SetupGet(x => x.Configuration).Returns(GetOneConfigurationEntry("#1", true));
            mockProcessor.Setup(x => x.Start()).Verifiable();
            mockProcessor.Setup(x => x.Init(It.IsAny <IQueueClient>(), It.IsAny <IMessageProcessorFactory>(), It.IsAny <ConfigurationEntry>())).Verifiable();

            var mockProcessorFactory = new Mock <IQueueProcessorFactory>(MockBehavior.Strict);

            mockProcessorFactory.Setup(x => x.CreateQueueProcessor()).Returns(mockProcessor.Object).Verifiable();

            var mockClient = new Mock <IQueueClient>(MockBehavior.Strict);

            mockClient.Setup(x => x.Init()).Verifiable();

            var mockClientFactory = new Mock <IQueueClientFactory>(MockBehavior.Strict);

            mockClientFactory.Setup(x => x.CreateClient(It.IsAny <ConfigurationEntry>())).Returns(mockClient.Object).Verifiable();

            var mockMessageProcessorFactory = new Mock <IMessageProcessorFactory>(MockBehavior.Strict);

            var processors = new List <IQueueProcessor>();

            configChangeManager.ReadChanges(config, processors, mockClientFactory.Object, mockMessageProcessorFactory.Object, mockProcessorFactory.Object);
            Assert.NotNull(processors);
            Assert.Single(processors);

            mockClient.Verify(x => x.Init(), Times.Exactly(1));
            mockClientFactory.Verify(x => x.CreateClient(It.IsAny <ConfigurationEntry>()), Times.Exactly(1));
            mockProcessorFactory.Verify(x => x.CreateQueueProcessor(), Times.Exactly(1));
            mockProcessor.Verify(x => x.Start(), Times.Exactly(1));
            mockProcessor.Verify(x => x.Init(It.IsAny <IQueueClient>(), It.IsAny <IMessageProcessorFactory>(), It.IsAny <ConfigurationEntry>()), Times.Exactly(1));

            if (readConfigurationAgain)
            {
                configChangeManager.ReadChanges(config, processors, mockClientFactory.Object,
                                                mockMessageProcessorFactory.Object, mockProcessorFactory.Object);

                mockClient.Verify(x => x.Init(), Times.Exactly(1));
                mockClientFactory.Verify(x => x.CreateClient(It.IsAny <ConfigurationEntry>()), Times.Exactly(1));
                mockProcessorFactory.Verify(x => x.CreateQueueProcessor(), Times.Exactly(1));
                mockProcessor.Verify(x => x.Start(), Times.Exactly(1));
                mockProcessor.Verify(
                    x => x.Init(It.IsAny <IQueueClient>(), It.IsAny <IMessageProcessorFactory>(),
                                It.IsAny <ConfigurationEntry>()), Times.Exactly(1));
            }
        }
        public void DoesNothingWithoutConfigurationAndWithoutProcessors()
        {
            var configChangeManager = new ConfigurationChangeManager();
            var config = new SimpleConfigurationReader {
                Configs = new List <ConfigurationEntry>()
            };
            var processors = new List <IQueueProcessor>();

            configChangeManager.ReadChanges(config, processors, null, null, null);
            Assert.NotNull(processors);
            Assert.Empty(processors);
        }
        public void StartsOneAndStopsOneProcessor()
        {
            var configChangeManager = new ConfigurationChangeManager();
            var config = new SimpleConfigurationReader
            {
                Configs = new List <ConfigurationEntry> {
                    GetOneConfigurationEntry("#1", true)
                }
            };

            var mockNewProcessor = new Mock <IQueueProcessor>(MockBehavior.Strict);

            mockNewProcessor.SetupGet(x => x.Configuration).Returns(GetOneConfigurationEntry("#1", true));
            mockNewProcessor.Setup(x => x.Start()).Verifiable();
            mockNewProcessor.Setup(x => x.Init(It.IsAny <IQueueClient>(), It.IsAny <IMessageProcessorFactory>(), It.IsAny <ConfigurationEntry>())).Verifiable();

            var mockProcessorFactory = new Mock <IQueueProcessorFactory>(MockBehavior.Strict);

            mockProcessorFactory.Setup(x => x.CreateQueueProcessor()).Returns(mockNewProcessor.Object).Verifiable();

            var mockClient = new Mock <IQueueClient>(MockBehavior.Strict);

            mockClient.Setup(x => x.Init()).Verifiable();

            var mockClientFactory = new Mock <IQueueClientFactory>(MockBehavior.Strict);

            mockClientFactory.Setup(x => x.CreateClient(It.IsAny <ConfigurationEntry>())).Returns(mockClient.Object).Verifiable();

            var mockMessageProcessorFactory = new Mock <IMessageProcessorFactory>(MockBehavior.Strict);

            var mockExistingProcessor = new Mock <IQueueProcessor>(MockBehavior.Strict);

            mockExistingProcessor.Setup(x => x.Configuration).Returns(GetOneConfigurationEntry("#2", true)).Verifiable();
            mockExistingProcessor.Setup(x => x.Stop()).Verifiable();
            var processors = new List <IQueueProcessor>
            {
                mockExistingProcessor.Object
            };

            configChangeManager.ReadChanges(config, processors, mockClientFactory.Object, mockMessageProcessorFactory.Object, mockProcessorFactory.Object);
            Assert.NotNull(processors);
            Assert.Single(processors);

            mockClient.Verify(x => x.Init(), Times.Exactly(1));
            mockClientFactory.Verify(x => x.CreateClient(It.IsAny <ConfigurationEntry>()), Times.Exactly(1));
            //mockMessageProcessorFactory.Verify(x => x.CreateMessageProcessor(It.IsAny<ConfigurationEntry>()), Times.Exactly(1));
            mockProcessorFactory.Verify(x => x.CreateQueueProcessor(), Times.Exactly(1));
            mockNewProcessor.Verify(x => x.Start(), Times.Exactly(1));
            mockNewProcessor.Verify(x => x.Init(It.IsAny <IQueueClient>(), It.IsAny <IMessageProcessorFactory>(), It.IsAny <ConfigurationEntry>()), Times.Exactly(1));
            mockExistingProcessor.VerifyGet(x => x.Configuration, Times.AtLeastOnce());
            mockExistingProcessor.Verify(x => x.Stop(), Times.Exactly(1));
        }
        public void IgnoresInactiveEntries()
        {
            var configChangeManager = new ConfigurationChangeManager();
            var config = new SimpleConfigurationReader
            {
                Configs = new List <ConfigurationEntry> {
                    GetOneConfigurationEntry("#1", false)
                }
            };

            var processors = new List <IQueueProcessor>();

            configChangeManager.ReadChanges(config, processors, null, null, null);
            Assert.NotNull(processors);
            Assert.Empty(processors);
        }
        public void DoesNothingWithUnchangedConfigurationEntries()
        {
            var configChangeManager = new ConfigurationChangeManager();
            var config = new SimpleConfigurationReader
            {
                Configs = new List <ConfigurationEntry>
                {
                    GetOneConfigurationEntry("#1", true),
                    GetOneConfigurationEntry("#2", true),
                    GetOneConfigurationEntry("#3", true)
                }
            };

            var mockedProcessors = new List <Mock <IQueueProcessor> >
            {
                GetOneMockedProcessor(config.Configs[0]),
                GetOneMockedProcessor(config.Configs[1]),
                GetOneMockedProcessor(config.Configs[2])
            };

            var processors = new List <IQueueProcessor>
            {
                mockedProcessors[0].Object,
                mockedProcessors[1].Object,
                mockedProcessors[2].Object
            };

            configChangeManager.ReadChanges(config, processors, null, null, null);
            Assert.NotNull(processors);
            Assert.Equal(3, processors.Count);

            foreach (var processor in mockedProcessors)
            {
                processor.VerifyGet(x => x.Configuration, Times.Exactly(18));
            }
        }