private ExchangeRatesResponse MapECBResposne(List <ECBCsvResponseModel> ecbCsbRows) { ExchangeRatesResponse preparedResponse = new ExchangeRatesResponse { ExchangeRates = new List <ExchangeRates>() }; preparedResponse.ExchangeRates.AddRange((from r in ecbCsbRows group r by(r.CURRENCY, r.CURRENCY_DENOM) into rs select new ExchangeRates() { BaseCurrency = rs.Key.CURRENCY, DenominatedCurrency = rs.Key.CURRENCY_DENOM, ExchangeRatesByDays = new List <RateByDay>( (from e in ecbCsbRows where e.CURRENCY == rs.Key.CURRENCY & e.CURRENCY_DENOM == rs.Key.CURRENCY_DENOM select new RateByDay() { Day = e.TIME_PERIOD.Date, Rate = e.OBS_VALUE }) ) }).ToList()); return(preparedResponse); }
public async Task WhenManagerReturnsCurrentRates_ThenResponseIsUsedToBuildDto() { var currentRates = new ExchangeRatesResponse("EUR", DateTime.Now, new Dictionary <string, decimal>()); var manager = new Mock <IExchangeRatesManager>(); manager.Setup(m => m.GetLatestRates()).ReturnsAsync(currentRates); ExchangeRatesResponse buildDtoInput = null; var dtoFactory = new Mock <IExchangeRatesDtoFactory>(); dtoFactory.Setup(m => m.BuildDto(It.IsAny <ExchangeRatesResponse>())) .Callback <ExchangeRatesResponse>(input => buildDtoInput = input) .Returns(new ExchangeRatesResponseDto( "base", DateTime.UtcNow, new Dictionary <string, decimal>())); var controller = new ExchangeRatesController(manager.Object, dtoFactory.Object); await controller.Index(); buildDtoInput.Should().Be(currentRates); }
public ExchangeRatesResponse ParseResponse(string apiResponse) { if (string.IsNullOrWhiteSpace(apiResponse)) { throw new ArgumentNullException(nameof(apiResponse)); } var jobject = JObject.Parse(apiResponse); var baseCurrency = jobject["base"].ToString(); var responseDateComponents = jobject["date"].ToString().Split('-'); var responseDate = new DateTime( int.Parse(responseDateComponents[0]), int.Parse(responseDateComponents[1]), int.Parse(responseDateComponents[2])); var rates = jobject["rates"].ToObject <Dictionary <string, decimal> >(); var exchangeRates = new ExchangeRatesResponse( baseCurrency: baseCurrency, date: responseDate, rates: rates); return(exchangeRates); }
private ExchangeRatesResponse FillSkippedDays(ExchangeRatesResponse ecbResponse, DateTime start, DateTime end) { List <DateTime> fullDatesSequence = Enumerable.Range(0, 1 + end.Subtract(start).Days) .Select(offset => start.AddDays(offset)) .ToList(); List <DateTime> responseDays = ecbResponse.ExchangeRates.First() .ExchangeRatesByDays.Select(x => x.Day) .ToList(); List <DateTime> lackingDays = fullDatesSequence .Where(f => !responseDays.Any(d => d.Date == f.Date)) .ToList(); foreach (ExchangeRates exchangeRate in ecbResponse.ExchangeRates) { foreach (DateTime date in lackingDays) { exchangeRate.ExchangeRatesByDays.Add(GetRateForEarlierDay(date, exchangeRate.ExchangeRatesByDays)); } exchangeRate.ExchangeRatesByDays.Sort((x, y) => { if (x.Day.Date < y.Day.Date) { return(-1); } if (x.Day.Date > y.Day.Date) { return(1); } return(0); }); } return(ecbResponse); }
public void WhenSecondResponseIsNull_ThenEqualsReturnsFalse() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); response1.Equals(null).Should().BeFalse(); }
public void WhenTwoResponsesAreTheSameReference_ThenEqualsReturnsTrue() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); var response2 = response1; response1.Equals(response2).Should().BeTrue(); }
public void WhenTwoResponsesHaveTheSameBaseAndDate_ThenTheyAreEquivalent() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); var response2 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); response1.Should().BeEquivalentTo(response2); }
public void WhenTwoResponsesHaveTheSameBaseAndDate_ThenHashCodesAreEqual() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); var response2 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); response1.GetHashCode().Should().Be(response2.GetHashCode()); }
public void WhenTwoResponsesHaveTheSameBaseAndDate_ThenObjectEqualityIsTrue() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); object response2 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); response1.Equals(response2).Should().BeTrue(); }
public void WhenResponseIsCheckedForEqualityOfObjectOfDifferentType_ThenReturnsFalse() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); var response2 = (object)"STRING!"; response1.Equals(response2).Should().BeFalse(); }
public void WhenResponseIsCheckedForEqualityOfNullObject_ThenReturnsFalse() { var baseCurrency = "BASE"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(baseCurrency, date, new Dictionary <string, decimal>()); object response2 = null; response1.Equals(response2).Should().BeFalse(); }
public void WhenTwoResponsesDifferOnlyInBase_ThenEqualsReturnsFalse() { var base1 = "BASE"; var base2 = "EUR"; var date = DateTime.UtcNow; var response1 = new ExchangeRatesResponse(base1, date, new Dictionary <string, decimal>()); var response2 = new ExchangeRatesResponse(base2, date, new Dictionary <string, decimal>()); response1.Equals(response2).Should().BeFalse(); }
public ExchangeRatesResponseDto BuildDto(ExchangeRatesResponse exchangeRates) { if (exchangeRates is null) { throw new ArgumentNullException(nameof(exchangeRates)); } var dto = new ExchangeRatesResponseDto( exchangeRates.BaseCurrency, exchangeRates.Date, exchangeRates.Rates); return(dto); }
public void WhenDtoIsBuilt_ThenPropertiesMatchInputObject() { var input = new ExchangeRatesResponse( "base base and base", DateTime.UtcNow, new Dictionary <string, decimal> { { "curr 1", 11546.55555m }, { "curr 2", 555.446m } }); var factory = new ExchangeRatesDtoFactory(); var dto = factory.BuildDto(input); dto.BaseCurrency.Should().Be(input.BaseCurrency); dto.Date.Should().Be(input.Date); dto.Rates.Should().BeEquivalentTo(input.Rates); }
public void CacheResponse(string key, ExchangeRatesResponse response) { _logger.LogInformation("Write response to dbcache."); Barrel.Current.Add(key: key, data: response, expireIn: TimeSpan.FromDays(_configuration.CacheTTLinDays)); }