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; }
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); }
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); }
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); }
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); }
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); }
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)); }