public async Task WebUptimeMetricLogic_ProcessServer_NoSuccessfulUrls()
        {
            //Arrange
            var server = new Server
            {
                ServerIpAddress = "127.0.0.1",
                ServerName      = "1.com",
                UptimeMonitoringResourceHost     = null,
                UptimeMonitoringResourceUseHttps = null
            };

            SetupHttpClientAdditionalResponses(new Uri("http://127.0.0.1/Relativity/"), HttpStatusCode.NotFound);
            SetupHttpClientAdditionalResponses(new Uri("https://127.0.0.1/Relativity/"), HttpStatusCode.NotFound);
            SetupHttpClientAdditionalResponses(new Uri("http://1.com/Relativity/"), HttpStatusCode.NotFound);
            SetupHttpClientAdditionalResponses(new Uri("https://1.com/Relativity/"), HttpStatusCode.NotFound);

            httpClient = new HttpClient(httpClientHandler.Object);
            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.ProcessServer(server, httpClient);

            //Assert
            Assert.That(result, Is.Null);
            httpClientHandler.Protected()
            .Verify <Task <HttpResponseMessage> >("SendAsync", Times.Exactly(4), ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>());
            this.logger.Verify(l => l.LogVerboseAsync("ProcessServer Called for Web - Failure. Server: 1.com. Details: Web server unreachable.", It.IsAny <List <string> >()));
        }
        public async Task WebUptimeMetricLogic_ProcessServer_RequestThrowsException()
        {
            //Arrange
            var server = new Server
            {
                ServerIpAddress = "127.0.0.1",
                ServerName      = "1.com",
                UptimeMonitoringResourceHost     = null,
                UptimeMonitoringResourceUseHttps = null
            };

            SetupHttpClientAdditionalResponses(new Uri("http://127.0.0.1/Relativity/"), HttpStatusCode.NotFound);
            httpClientHandler.Protected()
            .Setup <Task <HttpResponseMessage> >("SendAsync", ItExpr.Is <HttpRequestMessage>(r => r.RequestUri == new Uri("https://127.0.0.1/Relativity/")), ItExpr.IsAny <CancellationToken>())
            .Throws(new HttpRequestException("An error occurred while sending the request."));

            httpClient = new HttpClient(httpClientHandler.Object);
            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.ProcessServer(server, httpClient);

            //Assert
            Assert.That(result, Is.Not.Null);
            httpClientHandler.Protected()
            .Verify <Task <HttpResponseMessage> >("SendAsync", Times.Exactly(3), ItExpr.IsAny <HttpRequestMessage>(), ItExpr.IsAny <CancellationToken>());
        }
        public async Task WebUptimeMetricLogic_CollectMetricData_NoWebServers()
        {
            //Arrange
            var metricData = new MetricData();
            var webUptime  = new WebUptime {
                SuccessfulSamples = 9, TotalSamples = 10
            };

            metricDataService.Setup(s => s.GetData <WebUptime>(metricData)).Returns(webUptime);

            serverRepository.Setup(r => r.ReadAllActiveAsync()).ReturnsAsync(new List <Server>());

            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.CollectMetricData(metricData);

            //Assert
            var resultWebUptime = (WebUptime)result;

            Assert.That(result, Is.Not.Null);
            Assert.That(resultWebUptime, Is.Not.Null);
            Assert.That(resultWebUptime.SuccessfulSamples, Is.EqualTo(9));
            Assert.That(resultWebUptime.TotalSamples, Is.EqualTo(11));
        }
        public async Task WebUptimeMetricLogic_CollectMetricData_SomeServersDown()
        {
            //Arrange
            var metricData = new MetricData();
            var webUptime  = new WebUptime {
                SuccessfulSamples = 9, TotalSamples = 10
            };

            metricDataService.Setup(s => s.GetData <WebUptime>(metricData)).Returns(webUptime);
            SetupHttpClientAdditionalResponses(new Uri("http://127.0.0.1/Relativity/"), HttpStatusCode.NotFound);
            SetupHttpClientAdditionalResponses(new Uri("https://127.0.0.1/Relativity/"), HttpStatusCode.NotFound);
            SetupHttpClientAdditionalResponses(new Uri("http://1.com/Relativity/"), HttpStatusCode.NotFound);
            SetupHttpClientAdditionalResponses(new Uri("https://1.com/Relativity/"), HttpStatusCode.NotFound);

            serverRepository.Setup(r => r.ReadAllActiveAsync()).ReturnsAsync(servers);

            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.CollectMetricData(metricData);

            //Assert
            var resultWebUptime = (WebUptime)result;

            Assert.That(result, Is.Not.Null);
            Assert.That(resultWebUptime, Is.Not.Null);
            Assert.That(resultWebUptime.SuccessfulSamples, Is.EqualTo(10));
            Assert.That(resultWebUptime.TotalSamples, Is.EqualTo(11));
        }
        public async Task WebUptimeMetricLogic_CollectMetricData_SuggestedUrl()
        {
            //Arrange
            var metricData = new MetricData();
            var webUptime  = new WebUptime {
                SuccessfulSamples = 9, TotalSamples = 10
            };
            var suggestedUrl = "http://www.google.com";

            SetupHttpClientAdditionalResponses(new Uri(suggestedUrl), HttpStatusCode.OK);
            metricDataService.Setup(s => s.GetData <WebUptime>(metricData)).Returns(webUptime);
            configRepository.Setup(r => r.ReadConfigurationValue(ConfigurationKeys.Section, ConfigurationKeys.WebUptimeUserAgent)).Returns("Chrome");
            configRepository.Setup(r => r.ReadConfigurationValue(ConfigurationKeys.Section, ConfigurationKeys.SuggestedWebUptimeUrl)).Returns(suggestedUrl);

            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.CollectMetricData(metricData);

            //Assert
            var resultWebUptime = (WebUptime)result;

            Assert.That(result, Is.Not.Null);
            Assert.That(resultWebUptime, Is.Not.Null);
            Assert.That(resultWebUptime.SuccessfulSamples, Is.EqualTo(10));
            Assert.That(resultWebUptime.TotalSamples, Is.EqualTo(11));
        }
        public async Task WebUptimeMetricLogic_ScoreMetric_NoUptime()
        {
            //Arrange
            var metricData = new MetricData();
            var logic      = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.ScoreMetric(metricData);

            //Assert
            Assert.That(result, Is.EqualTo(Defaults.Scores.Uptime));
        }
        public async Task WebUptimeMetricLogic_ScoreMetric()
        {
            //Arrange
            var metricData = new MetricData();
            var webUptime  = new WebUptime {
                SuccessfulSamples = 9, TotalSamples = 10
            };

            metricDataService.Setup(s => s.GetData <WebUptime>(metricData)).Returns(webUptime);
            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.ScoreMetric(metricData);

            //Assert
            Assert.That(result, Is.EqualTo(90.0m));
        }
        public void WebUptimeMetricLogic_GetRequestResourcesToTry(string previousHost, bool?previousHttps, string[] expectedResults)
        {
            //Arrange
            var server = new Server
            {
                ServerIpAddress = "127.0.0.1",
                ServerName      = "stuff.com",
                UptimeMonitoringResourceHost     = previousHost,
                UptimeMonitoringResourceUseHttps = previousHttps
            };

            //Act
            var result = WebUptimeMetricLogic.GetRequestResourcesToTry(server);

            //Assert
            Assert.That(result[0].AbsoluteUri, Is.EqualTo(expectedResults[0] + "/Relativity/"));
            Assert.That(result[1].AbsoluteUri, Is.EqualTo(expectedResults[1] + "/Relativity/"));
            Assert.That(result[2].AbsoluteUri, Is.EqualTo(expectedResults[2] + "/Relativity/"));
            Assert.That(result[3].AbsoluteUri, Is.EqualTo(expectedResults[3] + "/Relativity/"));
        }
        public async Task WebUptimeMetricLogic_CollectMetricData_NewDataSource()
        {
            //Arrange
            var metricData = new MetricData();

            serverRepository.Setup(r => r.ReadAllActiveAsync()).ReturnsAsync(servers);
            configRepository.Setup(r => r.ReadConfigurationValue(ConfigurationKeys.Section, ConfigurationKeys.WebUptimeUserAgent)).Returns("Chrome");

            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            //Act
            var result = await logic.CollectMetricData(metricData);


            //Assert
            var resultWebUptime = (WebUptime)result;

            Assert.That(result, Is.Not.Null);
            Assert.That(resultWebUptime, Is.Not.Null);
            Assert.That(resultWebUptime.SuccessfulSamples, Is.EqualTo(1));
            Assert.That(resultWebUptime.TotalSamples, Is.EqualTo(1));
        }
        public async Task WebUptimeMetricLogic_SaveNewRequestSettings(string previousHost, bool previousHttps, string urlScheme, string urlDomain, bool expectedResult)
        {
            //Arrange
            var server = new Server {
                UptimeMonitoringResourceHost = previousHost, UptimeMonitoringResourceUseHttps = previousHttps
            };
            var logic = new WebUptimeMetricLogic(httpClientFactoryMock.Object, serverRepository.Object, metricDataService.Object, configRepository.Object, logger.Object);

            serverRepository.Setup(r => r.UpdateAsync(It.IsAny <Server>())).Returns(Task.Delay(100));

            //Act
            await logic.SaveNewRequestSettings(server, new Uri($"{urlScheme}://{urlDomain}"));

            //Assert
            if (expectedResult)
            {
                serverRepository.Verify(r => r.UpdateAsync(It.IsAny <Server>()), Times.Once);
            }
            else
            {
                serverRepository.Verify(r => r.UpdateAsync(It.IsAny <Server>()), Times.Never);
            }
        }