Exemplo n.º 1
0
        public async Task GetCurrencyRateAsync_WithTwoCorrectCurrencyPairs_ShouldReturnTwoCurrencyRates()
        {
            CurrencyRateFilter currencyRateFilter = CreateBasicCurrencyRateFilter();

            currencyRateFilter.CurrencyCodes.Add("PLN", "EUR");
            await SetApiKey();

            string stringQuery = CreateStringQuery(currencyRateFilter);
            var    response    = await TestClient.GetAsync($"api/Currency?{stringQuery}");

            var respnseAsString = await response.Content.ReadAsStringAsync();

            var responseAsCurrencyRates = JsonConvert.DeserializeObject <List <CurrencyRatesDto> >(respnseAsString);

            response.StatusCode.Should().Be(HttpStatusCode.OK);
            responseAsCurrencyRates.Count.Should().Be(2);
            responseAsCurrencyRates.First().SourceCurrencyCode.Should().Be("USD");
            responseAsCurrencyRates.First().DestinationCurrencyCode.Should().Be("EUR");
            responseAsCurrencyRates.Last().SourceCurrencyCode.Should().Be("PLN");
            responseAsCurrencyRates.Last().DestinationCurrencyCode.Should().Be("EUR");
            responseAsCurrencyRates.First().Values.First().Date.Should().BeOnOrBefore(currencyRateFilter.StartDate);
            responseAsCurrencyRates.First().Values.Last().Date.Should().BeOnOrBefore(currencyRateFilter.EndDate);
            responseAsCurrencyRates.First().Values.First().Date.Should().BeOnOrBefore(currencyRateFilter.StartDate);
            responseAsCurrencyRates.First().Values.Last().Date.Should().BeOnOrBefore(currencyRateFilter.EndDate);
        }
        /// <summary>
        /// Grouping all currency codes by target currency to fetch all exchange rates once 
        /// Checking if cache contains data for selected currency pair, if not they are fetched from api. 
        /// API return all available data to minimize request amount. All data are saved into cache
        /// Validate start and end date of currency rates, setting correct date in case of day off 
        /// </summary>
        /// <param name="currencyRateFilter"></param>
        /// <returns></returns>
        public async Task<List<CurrencyRatesDto>> GetCurrencyRatesAsync(CurrencyRateFilter currencyRateFilter)
        {
            _groupedCurrencyPairToDownload = currencyRateFilter.CurrencyCodes
                .GroupBy(cc => cc.Value)
                .ToDictionary(cc => cc.Key, g => g.Select(cc => cc.Key).ToList());
            _logger.LogInformation($"Grouped all currency codes by target currency");

            foreach (var targetCurrencyCode in _groupedCurrencyPairToDownload.Keys)
            {
                var currencyPairToDownload = new List<string>(_groupedCurrencyPairToDownload[targetCurrencyCode]);
                foreach (var sourceCurrencyCode in currencyPairToDownload)
                {
                    await GetExchangeRateFromCacheAsync(targetCurrencyCode, sourceCurrencyCode);
                }

                var sourceCurrencyCodesToFetchFromApi = _groupedCurrencyPairToDownload[targetCurrencyCode];
                if (sourceCurrencyCodesToFetchFromApi.Count > 0)
                {
                    await GetExchangeRateFromApiAsync(targetCurrencyCode, sourceCurrencyCodesToFetchFromApi);
                }
            }

            GetExchangeRateForSpecifiedPeriod(currencyRateFilter);

            return _downloadedCurrencyRates;
        }
Exemplo n.º 3
0
        public async Task GetCurrencyRateAsync_WithDateFromTheFuture_ShouldReturnNotFound()
        {
            CurrencyRateFilter currencyRateFilter = CreateBasicCurrencyRateFilter();

            currencyRateFilter.EndDate = DateTime.UtcNow.AddDays(2);
            await SetApiKey();

            string stringQuery = CreateStringQuery(currencyRateFilter);
            var    response    = await TestClient.GetAsync($"api/Currency?{stringQuery}");

            response.StatusCode.Should().Be(HttpStatusCode.NotFound);
        }
Exemplo n.º 4
0
        private string CreateStringQuery(CurrencyRateFilter currencyRateFilter)
        {
            var stringQueryBuilder = new StringBuilder($"StartDate={currencyRateFilter.StartDate:yyy-MM-dd}&EndDate={currencyRateFilter.EndDate:yyy-MM-dd}");

            foreach (var key in currencyRateFilter.CurrencyCodes.Keys)
            {
                stringQueryBuilder.Append($"&CurrencyCodes[{key}]={currencyRateFilter.CurrencyCodes[key]}");
            }
            var stringQuery = stringQueryBuilder.ToString();

            return(stringQuery);
        }
Exemplo n.º 5
0
        private CurrencyRateFilter CreateBasicCurrencyRateFilter()
        {
            var currencyRateFilter = new CurrencyRateFilter
            {
                StartDate     = DateTime.UtcNow.AddMonths(-1),
                EndDate       = DateTime.UtcNow,
                CurrencyCodes = new Dictionary <string, string>()
            };

            currencyRateFilter.CurrencyCodes.Add("USD", "EUR");

            return(currencyRateFilter);
        }
Exemplo n.º 6
0
        public async Task GetCurrencyRateAsync_WithVeryOldDate_ShouldReturnbadRequest()
        {
            CurrencyRateFilter currencyRateFilter = CreateBasicCurrencyRateFilter();

            currencyRateFilter.StartDate = new DateTime(1020, 5, 1);
            currencyRateFilter.EndDate   = new DateTime(1021, 5, 1);
            await SetApiKey();

            string stringQuery = CreateStringQuery(currencyRateFilter);
            var    response    = await TestClient.GetAsync($"api/Currency?{stringQuery}");

            response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
        }
Exemplo n.º 7
0
        public async Task GetCurrencyRateAsync_WithDateInFreeDayOfWorkFirstOfMay_ShouldReturnValuesFromLastDayOfApril()
        {
            CurrencyRateFilter currencyRateFilter = CreateBasicCurrencyRateFilter();

            currencyRateFilter.StartDate = new DateTime(2020, 5, 1);
            currencyRateFilter.EndDate   = new DateTime(2020, 5, 1);
            await SetApiKey();

            string stringQuery = CreateStringQuery(currencyRateFilter);
            var    response    = await TestClient.GetAsync($"api/Currency?{stringQuery}");

            response.StatusCode.Should().Be(HttpStatusCode.OK);
            var respnseAsString = await response.Content.ReadAsStringAsync();

            var responseAsCurrencyRates = JsonConvert.DeserializeObject <List <CurrencyRatesDto> >(respnseAsString);

            responseAsCurrencyRates.Count.Should().Be(1);
            responseAsCurrencyRates.First().Values.First().Date.Should().Be(currencyRateFilter.StartDate.AddDays(-1));
        }
        private void GetExchangeRateForSpecifiedPeriod(CurrencyRateFilter currencyRateFilter)
        {
            if (_downloadedCurrencyRates.Count > 0)
            {
                var startDate = GetFirstDate(currencyRateFilter.StartDate.Date);
                _logger.LogInformation($"Set started date to: {startDate}");

                foreach (var currencyRate in _downloadedCurrencyRates)
                {
                    var currencyRatesFromSpecifiedPeriod = currencyRate.Values.Where(v => v.Date <= currencyRateFilter.EndDate.Date && 
                        v.Date >= startDate).ToList();
                    if (currencyRatesFromSpecifiedPeriod.Count == 0)
                    {
                        currencyRate.Message = "There is no exchangeRates for specified period";
                    }
                    currencyRate.Values = currencyRatesFromSpecifiedPeriod;
                }
                _logger.LogInformation($"Get exchange rate for specified period from: {startDate} to: {currencyRateFilter.EndDate.Date}");
            }
        }
        public virtual async System.Threading.Tasks.Task <GetCurrencyRateResult> getCurrencyRateAsync(CurrencyRateFilter currencyRateFilter)
        {
            var request = new getCurrencyRateRequest()
            {
                passport           = passport,
                tokenPassport      = tokenPassport,
                applicationInfo    = applicationInfo,
                partnerInfo        = partnerInfo,
                preferences        = preferences,
                currencyRateFilter = currencyRateFilter,
            };
            var response = await((NetSuitePortType)this).getCurrencyRateAsync(request);

            return(response.getCurrencyRateResult);
        }
Exemplo n.º 10
0
        public async Task <ActionResult <List <CurrencyRatesDto> > > GetCurrencyRateAsync([FromQuery] CurrencyRateFilter currencyRateFilter)
        {
            Logger.LogInformation("Started fetching data for exchange rates");
            var result = await _exchangeService.GetCurrencyRatesAsync(currencyRateFilter);

            Logger.LogInformation("Fetched data for exchange rates");
            return(Ok(result));
        }