public DashboardModel GetDashboardModel(string ipAddress) { var ipStackDetails = _ipStackConnector.GetIpStackDetails(ipAddress); var isNorthKorea = ipStackDetails.CountryCode == "KP"; var timeZoneDbDetails = _timeZoneDbConnector.GetTimeZoneDbDetails(ipStackDetails.Latitude, ipStackDetails.Longitude); var openWeatherMapDetails = _openWeatherMapConnector.GetOpenWeatherMapDetails(ipStackDetails.Latitude, ipStackDetails.Longitude, timeZoneDbDetails.GmtOffset); var newsArticles = !isNorthKorea ? _newsApiOrgConnector.GetNewsArticles(ipStackDetails.CountryCode, timeZoneDbDetails.GmtOffset) : null; var isTheSunUp = _dateHelper.IsTheSunUp(timeZoneDbDetails.LocalTime, openWeatherMapDetails.SunRiseTime, openWeatherMapDetails.SunSetTime); var result = new DashboardModel { IpAddress = ipAddress, LocalTime = timeZoneDbDetails.LocalTime, Temperature = openWeatherMapDetails.Temperature, WeatherDescription = openWeatherMapDetails.Description, NewsMessage = isNorthKorea ? "It would be pointless to display the news because it would be censored propaganda anyway." : string.Empty, WeatherMessage = isTheSunUp ? string.Empty : "The sun has set so the risk of shark attack is higher", NewsArticles = newsArticles }; return(result); }
public void GetDashboardModel_WhenCalled_ReturnsDashboardModel() { // Arrange var ipAddress = "1.1.1.1"; var ipStackDetails = new IpStackDetails { CountryCode = "GB", Latitude = "5.2", Longitude = "-2.4" }; _ipStackConnector.GetIpStackDetails(Arg.Any <string>()).Returns(ipStackDetails); var localTime = new DateTime(2019, 2, 1, 13, 45, 23); var timeZoneDbDetails = new TimeZoneDbDetails { GmtOffset = 0, LocalTime = localTime }; _timeZoneDbConnector.GetTimeZoneDbDetails(Arg.Any <string>(), Arg.Any <string>()).Returns(timeZoneDbDetails); var openWeatherMapDetails = new OpenWeatherMapDetails { SunRiseTime = localTime.AddHours(-1), SunSetTime = localTime.AddHours(-1), Description = "Rain", Temperature = 23 }; _openWeatherMapConnector.GetOpenWeatherMapDetails(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <int>()).Returns(openWeatherMapDetails); var newsArticles = new List <NewsArticle> { new NewsArticle { Source = "source 1", Url = "Url 1", Title = "Title 1", Description = "Desc 1", PublishedDateLocalTime = new DateTime(2019, 1, 1) } }; _newsApiOrgConnector.GetNewsArticles(Arg.Any <string>(), Arg.Any <int>()).Returns(newsArticles); _dateHelper.IsTheSunUp(Arg.Any <DateTime>(), Arg.Any <DateTime>(), Arg.Any <DateTime>()).Returns(true); // Act var result = _dashboardService.GetDashboardModel(ipAddress); // Assert _ipStackConnector.Received().GetIpStackDetails(ipAddress); _timeZoneDbConnector.Received().GetTimeZoneDbDetails(ipStackDetails.Latitude, ipStackDetails.Longitude); _openWeatherMapConnector.Received().GetOpenWeatherMapDetails(ipStackDetails.Latitude, ipStackDetails.Longitude, timeZoneDbDetails.GmtOffset); _newsApiOrgConnector.Received().GetNewsArticles(ipStackDetails.CountryCode, timeZoneDbDetails.GmtOffset); _dateHelper.Received().IsTheSunUp(timeZoneDbDetails.LocalTime, openWeatherMapDetails.SunRiseTime, openWeatherMapDetails.SunSetTime); Assert.AreEqual(ipAddress, result.IpAddress); Assert.AreEqual(timeZoneDbDetails.LocalTime, result.LocalTime); Assert.AreEqual(openWeatherMapDetails.Description, result.WeatherDescription); Assert.AreEqual(openWeatherMapDetails.Temperature, result.Temperature); Assert.IsTrue(string.IsNullOrWhiteSpace(result.NewsMessage)); Assert.IsTrue(string.IsNullOrWhiteSpace(result.WeatherMessage)); Assert.AreEqual(newsArticles.First().Source, result.NewsArticles.First().Source); Assert.AreEqual(newsArticles.First().Url, result.NewsArticles.First().Url); Assert.AreEqual(newsArticles.First().Title, result.NewsArticles.First().Title); Assert.AreEqual(newsArticles.First().Description, result.NewsArticles.First().Description); Assert.AreEqual($"{newsArticles.First().PublishedDateLocalTime:yyyy-MM-dd HH:mm:ss}", result.NewsArticles.First().PublishedDateLocalTime); }