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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
        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();
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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());
        }
Esempio n. 9
0
        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();
        }
Esempio n. 10
0
        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();
        }
Esempio n. 11
0
        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();
        }
Esempio n. 12
0
        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);
        }
Esempio n. 14
0
        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);
        }
Esempio n. 15
0
 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));
 }