Beispiel #1
0
        public void ParseCurrenciesSource_WithProvidedCorrectSource_ReturnExpectedResults()
        {
            string source = new TestDailySource().CorrectSource;

            CurrencyParsingService        parsingService = new CurrencyParsingService();
            HashSet <SingleDayCurrencies> result         = parsingService.ParseCurrenciesSource(source);

            SingleDayCurrencies expected = new SingleDayCurrencies
            {
                Date       = "2020-07-16",
                Currencies = new List <Currency>
                {
                    new Currency
                    {
                        Code  = "USD",
                        Ratio = 1.1414m
                    }
                }
            };

            Assert.AreEqual(result.Count, 1);
            Assert.AreEqual(result.First().Date, expected.Date);
            Assert.AreEqual(result.First().Currencies.Count, 1);
            Assert.AreEqual(result.First().Currencies.First().Code, expected.Currencies.First().Code);
            Assert.AreEqual(result.First().Currencies.First().Ratio, expected.Currencies.First().Ratio);
        }
        public void SaveCurrenciesToCache_AndTryGetCurrenciesFromCache_ShouldReturnExpectedResult()
        {
            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());
            CurrencyCacheHandlingService currencyCacheHandlingService = new CurrencyCacheHandlingService(memoryCache);

            string key = "testKey";
            SingleDayCurrencies expected = new SingleDayCurrencies
            {
                Date       = "2020-07-16",
                Currencies = new List <Currency>
                {
                    new Currency
                    {
                        Code  = "TEST",
                        Ratio = 1
                    }
                }
            };

            bool saveCacheStatus = currencyCacheHandlingService.TrySaveCurrenciesToCache(key, expected, out string error);

            Assert.IsTrue(saveCacheStatus);
            Assert.IsNull(error);

            bool getCacheStatus = currencyCacheHandlingService.TryGetCurrenciesFromCache(key, out SingleDayCurrencies result, out error);

            Assert.IsTrue(getCacheStatus);
            Assert.AreEqual(expected, result);
        }
        private bool TryGetDailyCurrencies(out SingleDayCurrencies result, out string error)
        {
            result = null;
            error  = null;
            RestRequest requestDetails   = new RestRequest(Method.GET);
            string      currenciesSource = null;

            try
            {
                currenciesSource = LoadCurrenciesSource(_urlsConfig.DailyCurrencies, requestDetails);
            }
            catch (Exception e)
            {
                error = "Failed to load daily currencies";
                _logger.LogWarning(error, e);
                return(false);
            }

            try
            {
                result = _currencyParsingService.ParseCurrenciesSource(currenciesSource).First();
            }
            catch (Exception e)
            {
                error = "Failed to parse daily currencies";
                _logger.LogError(error, e);
                return(false);
            }

            return(true);
        }
Beispiel #4
0
        public bool TryGetCurrenciesFromCache(string key, out SingleDayCurrencies result, out string error)
        {
            error  = null;
            result = null;

            if (string.IsNullOrEmpty(key))
            {
                error = "No key provided";
                return(false);
            }

            return(_cache.TryGetValue(key, out result));
        }
        private void AddEurCurrency(SingleDayCurrencies result)
        {
            if (result == null || !result.Currencies.Any() || result.Currencies.Any(x => x.Code.Equals("EUR", StringComparison.OrdinalIgnoreCase)))
            {
                return;
            }

            result.Currencies.Insert(0, new Currency
            {
                Code  = "EUR",
                Ratio = 1
            });
        }
        private bool TryGetOldCurrencies(DateTime date, out SingleDayCurrencies result, out string error)
        {
            result = null;
            error  = null;
            RestRequest requestDetails   = new RestRequest(Method.GET);
            string      currenciesSource = null;
            string      key = date.ToString(_cacheKeyConfig.Format, CultureInfo.InvariantCulture);

            try
            {
                if (_currencyCachingService.TryGetCurrenciesFromCache(key, out result, out error))
                {
                    return(true);
                }

                currenciesSource = LoadCurrenciesSource(_urlsConfig.CurrenciesHistory, requestDetails);
            }
            catch (Exception e)
            {
                error = "Failed to load currencies history";
                _logger.LogError(error, e);
                return(false);
            }

            try
            {
                HashSet <SingleDayCurrencies> parsedCurrencies = _currencyParsingService.ParseCurrenciesSource(currenciesSource);
                foreach (SingleDayCurrencies singleDay in parsedCurrencies)
                {
                    if (!_currencyCachingService.TrySaveCurrenciesToCache(singleDay.Date, singleDay, out error))
                    {
                        _logger.LogError(error);
                    }
                }

                if (_currencyCachingService.TryGetCurrenciesFromCache(key, out result, out error))
                {
                    return(true);
                }
            }
            catch (Exception e)
            {
                error = "Failed to parse currencies history";
                _logger.LogError(error, e);
                return(false);
            }

            return(true);
        }
Beispiel #7
0
        public bool TrySaveCurrenciesToCache(string key, SingleDayCurrencies source, out string error)
        {
            error = null;

            if (string.IsNullOrEmpty(key))
            {
                error = "No key provided";
                return(false);
            }

            if (_cache.TryGetValue(key, out SingleDayCurrencies cachedCurrencies))
            {
                return(true);
            }

            _cache.Set(key, source);
            return(true);
        }
        public HashSet <SingleDayCurrencies> ParseCurrenciesSource(string source)
        {
            HashSet <SingleDayCurrencies> results = new HashSet <SingleDayCurrencies>();

            XmlDocument xDoc = new XmlDocument();

            xDoc.LoadXml(source);

            XmlNamespaceManager manager = new XmlNamespaceManager(xDoc.NameTable);

            manager.AddNamespace("ns", "http://www.gesmes.org/xml/2002-08-01");
            manager.AddNamespace("ns2", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");

            XmlNodeList calendar = xDoc.SelectNodes("ns:Envelope/ns2:Cube/ns2:Cube", manager);

            foreach (XmlNode singleDay in calendar)
            {
                string date = singleDay.Attributes["time"].Value;
                SingleDayCurrencies singleDayCurrencies = new SingleDayCurrencies
                {
                    Date       = date,
                    Currencies = new List <Currency>()
                };

                foreach (XmlNode singleCurrency in singleDay)
                {
                    decimal parsedRatio = XmlConvert.ToDecimal(singleCurrency.Attributes["rate"].Value);
                    singleDayCurrencies.Currencies.Add(new Currency
                    {
                        Code  = singleCurrency.Attributes["currency"].Value,
                        Ratio = parsedRatio,
                    });
                }

                results.Add(singleDayCurrencies);
            }

            return(results);
        }
        public bool TryGetCurrencies(DateTime?date, out SingleDayCurrencies result, out string error)
        {
            error  = null;
            result = new SingleDayCurrencies();

            if (date == null)
            {
                if (!TryGetDailyCurrencies(out result, out error))
                {
                    return(false);
                }
            }
            else
            {
                if (!TryGetOldCurrencies((DateTime)date, out result, out error))
                {
                    return(false);
                }
            }

            AddEurCurrency(result);
            return(true);
        }
        public void SaveCurrenciesToCache_WithNoKeyProvided_ShouldReturnError()
        {
            MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());
            CurrencyCacheHandlingService currencyCacheHandlingService = new CurrencyCacheHandlingService(memoryCache);

            SingleDayCurrencies source = new SingleDayCurrencies
            {
                Date       = "2020-07-16",
                Currencies = new List <Currency>
                {
                    new Currency
                    {
                        Code  = "TEST",
                        Ratio = 1
                    }
                }
            };

            string key             = "";
            bool   saveCacheStatus = currencyCacheHandlingService.TrySaveCurrenciesToCache(key, source, out string error);

            Assert.IsFalse(saveCacheStatus);
            Assert.IsNotNull(error);
        }