public void ScheduledJobsWorkerConfigurationLoaderInitialiseWithConfigSectionSucceeds()
        {
            // Arrange
            var username = "******";
            var password = "******";
            var domain = "arbitrary-domain";
            var appclusiveCredentialSection = new AppclusiveCredentialSection();
            appclusiveCredentialSection.Username = username;
            appclusiveCredentialSection.Password = password;
            appclusiveCredentialSection.Domain = domain;
            
            Mock.SetupStatic(typeof(ConfigurationManager));
            Mock.Arrange(() => ConfigurationManager.GetSection(Arg.Is<string>(AppclusiveCredentialSection.SECTION_NAME)))
                .Returns(appclusiveCredentialSection)
                .MustBeCalled();

            Mock.Arrange(() => ConfigurationManager.AppSettings["ExtensionsFolder"])
                .IgnoreInstance()
                .Returns("..\\..\\..\\biz.dfch.CS.Appclusive.Scheduler.Extensions\\bin\\Debug");
            Mock.Arrange(() => ConfigurationManager.AppSettings["PluginTypes"])
                .IgnoreInstance()
                .Returns("*");
            Mock.Arrange(() => ConfigurationManager.AppSettings["UpdateIntervalMinutes"])
                .IgnoreInstance()
                .Returns("0");
            Mock.Arrange(() => ConfigurationManager.AppSettings["ServerNotReachableRetries"])
                .IgnoreInstance()
                .Returns("0");

            var uri = "http://www.example.com/arbitrary-path/";
            var mgmtUriName = "arbitrary-management-uri-name";
            string[] args = { uri, mgmtUriName };
            var sut = new ScheduledJobsWorkerConfigurationLoader();
            
            // Act
            // sut.Initialise() is implicitly called by ScheduledJobsWorkerConfiguration
            var config = new ScheduledJobsWorkerConfiguration(sut, args);

            // Assert
            Mock.Assert(() => ConfigurationManager.GetSection(Arg.Is<string>(AppclusiveCredentialSection.SECTION_NAME)));
            
            Assert.AreEqual(uri, config.Uri.AbsoluteUri);
            Assert.AreEqual(mgmtUriName, config.ManagementUriName);
            Assert.AreEqual(username, config.Credential.UserName);
            Assert.AreEqual(password, config.Credential.Password);
            Assert.AreEqual(domain, config.Credential.Domain);
        }
        public void TestInitialize()
        {
            var loader = new ScheduledJobsWorkerConfigurationLoader();

            configuration = Mock.Create<ScheduledJobsWorkerConfiguration>(Constructor.Mocked);
            Mock.Arrange(() => configuration.Logger).IgnoreInstance().Returns(new Logger());
            Mock.Arrange(() => configuration.Uri).IgnoreInstance().Returns(new Uri("http://www.example.com/arbitrary-folder"));
            Mock.Arrange(() => configuration.ManagementUriName).IgnoreInstance().Returns("ManagementUriName");
            Mock.Arrange(() => configuration.ManagementUriType).IgnoreInstance().Returns("ManagementUriName");
            Mock.Arrange(() => configuration.ServerNotReachableRetries).IgnoreInstance().Returns(5);
            Mock.Arrange(() => configuration.UpdateIntervalInMinutes).IgnoreInstance().Returns(1);
            Mock.Arrange(() => configuration.IsValid()).IgnoreInstance().Returns(true);

            var timer = Mock.Create<ScheduledJobsWorkerTimerFactory>();
            Mock.Arrange(() => timer.CreateTimer(Arg.IsAny<TimerCallback>(), Arg.IsAny<object>(), Arg.IsAny<int>(), Arg.IsAny<int>()))
                .IgnoreInstance()
                .Returns(default(Timer));
        }
        public void ScheduledJobsWorkerConfigurationLoaderWithoutConfigSectionInitialiseSucceeds()
        {
            // Arrange
            Mock.SetupStatic(typeof(ConfigurationManager));
            Mock.Arrange(() => ConfigurationManager.GetSection(Arg.Is<string>(AppclusiveCredentialSection.SECTION_NAME)))
                .Returns(default(object))
                .MustBeCalled();

            Mock.Arrange(() => ConfigurationManager.AppSettings["ExtensionsFolder"])
                .IgnoreInstance()
                .Returns("..\\..\\..\\biz.dfch.CS.Appclusive.Scheduler.Extensions\\bin\\Debug");
            Mock.Arrange(() => ConfigurationManager.AppSettings["PluginTypes"])
                .IgnoreInstance()
                .Returns("*");
            Mock.Arrange(() => ConfigurationManager.AppSettings["UpdateIntervalMinutes"])
                .IgnoreInstance()
                .Returns("0");
            Mock.Arrange(() => ConfigurationManager.AppSettings["ServerNotReachableRetries"])
                .IgnoreInstance()
                .Returns("0");

            var uri = "http://www.example.com/arbitrary-path/";
            var mgmtUriName = "arbitrary-management-uri-name";
            string[] args = { uri, mgmtUriName };
            var sut = new ScheduledJobsWorkerConfigurationLoader();
            
            // Act
            // sut.Initialise() is implicitly called by ScheduledJobsWorkerConfiguration
            var config = new ScheduledJobsWorkerConfiguration(sut, args);

            // Assert
            Mock.Assert(() => ConfigurationManager.GetSection(Arg.Is<string>(AppclusiveCredentialSection.SECTION_NAME)));

            Assert.AreEqual(uri, config.Uri.AbsoluteUri);
            Assert.AreEqual(mgmtUriName, config.ManagementUriName);
            Assert.AreEqual(System.Net.CredentialCache.DefaultNetworkCredentials, config.Credential);
        }
        public void InitialiseWithValidConfigurationSucceeds()
        {
            // Arrange
            Mock.SetupStatic(typeof(ConfigurationManager));
            Mock.Arrange(() => ConfigurationManager.AppSettings["UpdateIntervalMinutes"])
                .Returns("5");
            Mock.Arrange(() => ConfigurationManager.AppSettings["ServerNotReachableRetries"])
                .Returns("5");
            Mock.Arrange(() => ConfigurationManager.AppSettings["ManagementUri"])
                .Returns("ManagementUri");
            Mock.Arrange(() => ConfigurationManager.AppSettings["Uri"])
                .Returns("http://www.example.com/arbitrary-path/");

            var plugin = Mock.Create<Lazy<IAppclusivePlugin, IAppclusivePluginData>>();
            var plugins = new List<Lazy<IAppclusivePlugin, IAppclusivePluginData>>();
            plugins.Add(plugin);
            var pluginLoader = Mock.Create<PluginLoader>(Constructor.Mocked);
            Mock.Arrange(() => pluginLoader.InitialiseAndLoad())
                .IgnoreInstance()
                .Returns(plugins);

            var configuration = Mock.Create<ScheduledJobsWorkerConfiguration>(Constructor.NotMocked);
            Mock.Arrange(() => configuration.ManagementUriType)
                .IgnoreInstance()
                .Returns("ManagementUriType");
            Mock.Arrange(() => configuration.Uri)
                .IgnoreInstance()
                .Returns(new Uri("http://www.example.com/arbitrary-path/"));
            Mock.Arrange(() => configuration.IsValid())
                .IgnoreInstance()
                .Returns(true);
            var parameters = new DictionaryParameters();

            var sut = new ScheduledJobsWorkerConfigurationLoader();

            // Act
            sut.Initialise(configuration, parameters);

            // Assert
            // N/A
        }
        public void InitialiseWithInvalidConfigurationThrowsContractException()
        {
            var configuration = Mock.Create<ScheduledJobsWorkerConfiguration>();
            var parameters = new DictionaryParameters();

            var sut = new ScheduledJobsWorkerConfigurationLoader();
            sut.Initialise(configuration, parameters);
        }