Esempio n. 1
0
        public RatesResponse GetShippingRates(RatesRequest request)
        {
            RatesResponse response = null;


            //Calculate rates based on the request shippingfrom and shippingto information
            //Do something here....

            //Hardcoding shipping rates for this sample app
            List <Shippingmethod> shippingmethods = new List <Shippingmethod>();

            shippingmethods.Add(new Shippingmethod()
            {
                methodname = "DHL Priority", rate = 32.00
            });
            shippingmethods.Add(new Shippingmethod()
            {
                methodname = "USPS First Class", rate = 3.00
            });
            shippingmethods.Add(new Shippingmethod()
            {
                methodname = "UPS Ground", rate = 12.00
            });

            response = new RatesResponse()
            {
                shippingmethods = shippingmethods
            };

            return(response);
        }
Esempio n. 2
0
        public async Task ExchangeCurrencyAsync_WhenGBPBaseRequestReceived_AndTargetIsEuro_ThenReturnConvertedValue()
        {
            // Arrange
            var request = new CurrencyRequest()
            {
                TargetCurrency = "EUR",
                SourceCurrency = "GBP",
                Amount         = 10,
            };

            var rateResponse = new RatesResponse()
            {
                Base  = "GBP",
                Date  = Some <string>(),
                Rates = new Dictionary <string, decimal>()
                {
                    { "EUR", 2 },
                }
            };

            GetMock <IRatesService>()
            .Setup(x => x.GetRatesAsync(request.SourceCurrency))
            .ReturnsAsync(rateResponse);

            // Act
            var response = await SystemUnderTest.GetConvertedCurrencyAsync(request);

            // Assert
            Assert.IsType <ConvertedCurrencyResponse>(response);
            Assert.Equal(20, response.ConvertedAmount);
        }
        public void GetRates()
        {
            RatesRequest ratesRequest = CreateGetRatesRequest();

            VisibleRequest visibleRequest = new VisibleRequest(ratesRequest, "Rates/Retrieve");
            RatesResponse  ratesResponse  = visibleRequest.Execute <RatesResponse>();

            Assert.AreEqual(0, ratesResponse.ResultCode);
        }
Esempio n. 4
0
        static async Task Main(string[] args)
        {
            var           currency           = "USD";
            var           exchangeRateClient = new ExchangeRateServiceClient("https://localhost:50051");
            RatesResponse result             = await exchangeRateClient.GetRates(currency);

            Console.WriteLine(JsonSerializer.Serialize(result, new JsonSerializerOptions()
            {
                WriteIndented = true
            }));
        }
        private async Task <IEnumerable <Rate> > GetMissingRates(RateFilterModel filterModel,
                                                                 IEnumerable <Rate> cachingRates)
        {
            var response = new RatesResponse();

            if (!cachingRates.Any())
            {
                response = await _externalRatesService.GetRatesAsync(filterModel.DateFrom,
                                                                     filterModel.DateTo,
                                                                     filterModel.BaseCurrency.Code,
                                                                     filterModel.ResultCurrencyList.Select(x => x.Code));
            }
            else
            {
                var groupingCachingRates      = cachingRates.GroupBy(x => x.ResultCurrencyId);
                var fullMissingResultCurrency =
                    GetFullMissingResultCurrencyCodes(groupingCachingRates.Select(x => x.First().ResultCurrency.Code),
                                                      filterModel.ResultCurrencyList.Select(x => x.Code));
                var partiallyMissingResultCurrency =
                    GetPartiallyMissingResultCurrencyCodes(groupingCachingRates, filterModel.DateFrom, filterModel.DateTo);
                var minMaxUpdatingInterval = new Tuple <DateTime?, DateTime?>(null, null);
                if (!partiallyMissingResultCurrency.Any() && !fullMissingResultCurrency.Any())
                {
                    return(new List <Rate>());
                }

                if (fullMissingResultCurrency.Any())
                {
                    minMaxUpdatingInterval = new Tuple <DateTime?, DateTime?>(filterModel.DateFrom, filterModel.DateTo);
                }
                else
                {
                    if (partiallyMissingResultCurrency.Any())
                    {
                        minMaxUpdatingInterval = GetMinMaxMissingIntervalByCachingItems(cachingRates, filterModel.DateFrom, filterModel.DateTo);
                    }
                }


                if (!minMaxUpdatingInterval.Item1.HasValue || !minMaxUpdatingInterval.Item2.HasValue)
                {
                    throw new ArgumentException("Nothing to search. Min/Max interval not found");
                }

                var missingCurrencyCodes = new List <string>(fullMissingResultCurrency);
                missingCurrencyCodes.AddRange(partiallyMissingResultCurrency);
                response = await _externalRatesService.GetRatesAsync(minMaxUpdatingInterval.Item1.Value, minMaxUpdatingInterval.Item2.Value,
                                                                     filterModel.BaseCurrency.Code,
                                                                     missingCurrencyCodes);
            }
            return(await ConvertResponseToList(response));
        }
Esempio n. 6
0
        // GET: Rates
        public ActionResult GetRates(RatesRequest jsonRatesRequest)
        {
            RatesResponse jsonRatesResponse = null;
            bool          isValid           = false;

            //Validate credentials
            try
            {
                isValid = _ratesService.ValidateCredentials();
            }
            catch (Exception ex)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.Unauthorized, ex.Message));
            }

            if (!isValid)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.Unauthorized, "Invalid Credentials"));
            }

            //Validate request
            try
            {
                isValid = _ratesService.ValidateRequest(jsonRatesRequest);
            }
            catch (Exception ex)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, ex.Message));
            }

            if (!isValid)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request"));
            }

            //Proceed to calculates the rates
            try
            {
                jsonRatesResponse = _ratesService.GetShippingRates(jsonRatesRequest);
            }
            catch { }

            if (jsonRatesResponse == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            return(Json(jsonRatesResponse));
        }
Esempio n. 7
0
        public RatesResponse GetExchange(RatesRequest request)
        {
            var response = new RatesResponse();

            var sourceCurrency = SupportedCurrencies.Currencies.Find(c => c.Code == request.From?.ToUpper());
            var targetCurrency = SupportedCurrencies.Currencies.Find(c => c.Code == request.To?.ToUpper());


            if (sourceCurrency != null && targetCurrency != null)
            {
                response.From = new Exchange(sourceCurrency, request.Amount);
                response.To   = _quotes.GetExchanges(sourceCurrency, targetCurrency, request.Amount);

                return(response);
            }

            throw new ApplicationException(string.Format("Conversão de {0} para {1} não suportada!", request.From, request.To));
        }
        private async Task <IEnumerable <Rate> > ConvertResponseToList(RatesResponse response)
        {
            var currenciesMap = (await _ratesRepository.GetAllCurrencyAsync()).ToDictionary(key => key.Code, value => value);
            var results       = response.RatesDictionary.Select(x => x.Value.Select(y => new Rate
            {
                BaseCurrencyId   = currenciesMap[response.BaseCurrencyCode].Id,
                BaseCurrency     = currenciesMap[response.BaseCurrencyCode],
                ResultCurrencyId = currenciesMap[y.Key].Id,
                ResultCurrency   = currenciesMap[y.Key],
                RateDate         = DateTime.Parse(x.Key),
                RateValue        = y.Value
            }));
            var resultingRates = new List <Rate>();

            foreach (var result in results)
            {
                resultingRates.AddRange(result);
            }
            return(resultingRates);
        }
Esempio n. 9
0
        public static IExchangeRatesProvider GrpcClientMock()
        {
            var mockFX = new Mock <IExchangeRatesProvider>();

            mockFX.Setup(instance => instance.GetRates(It.IsAny <string>())).Returns(() =>
            {
                var ratesResponse = new RatesResponse()
                {
                    BaseCurrency = TestConstants.BaseCurrency,
                };
                var rates = new Dictionary <string, double>()
                {
                    { TestConstants.TargetCurrency, TestConstants.AudUsdConversionRate }
                };
                ratesResponse.Rates.Add(rates);

                return(Task.FromResult(ratesResponse));
            });

            return(mockFX.Object);
        }
Esempio n. 10
0
        public override async Task <RatesResponse> GetRates(RatesRequest request, ServerCallContext context)
        {
            var serializeOptions = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };

            var httpClient = _httpClientFactory.CreateClient("ExchangeRateHttpClient");
            var uri        = $"https://api.exchangeratesapi.io/latest?base={request.BaseCurrency}";

            var apiResponse = await httpClient.GetFromJsonAsync <FxResponse>(uri, serializeOptions);

            var result = new RatesResponse()
            {
                BaseCurrency = request.BaseCurrency, Date = apiResponse.Date
            };

            result.Rates.Add(apiResponse.Rates);

            //TODO: cache this result.

            return(result);
        }
Esempio n. 11
0
        public async Task <Dictionary <Currencies, decimal> > GetLatestAsync(Currencies baseCurrency)
        {
            string cacheName = $"FER-RATES-{baseCurrency}";

            if (_memoryCache.TryGetValue(cacheName, out Dictionary <Currencies, decimal> rates))
            {
                return(rates);
            }

            var result = await _httpClient.GetAsync($"{baseUrl}/latest?base={baseCurrency}").ConfigureAwait(false);

            if (result.IsSuccessStatusCode)
            {
                string rawContent = await result.Content.ReadAsStringAsync().ConfigureAwait(false);

                RatesResponse ratesResponse = JsonConvert.DeserializeObject <RatesResponse>(rawContent);
                if (ratesResponse != null && ratesResponse.Rates.Any())
                {
                    return(_memoryCache.Set(cacheName, ratesResponse.Rates, GetNextRefreshDateTime(ratesResponse.Date).Subtract(DateTime.UtcNow.AddHours(1))));
                }
            }
            return(new Dictionary <Currencies, decimal>());
        }
        public void Init()
        {
            this.apiClient = Setup.GetClient();
            this.request   = new RatesRequest()
            {
                pickupDate         = new DateTime(2014, 12, 1)
                , originPostalCode = "30303"
                , originType       = "business dock"
                , destPostalCode   = "60606"
                , destType         = "business dock"
                , paymentTerms     = "Outbound Prepaid"
                , items            = new List <QuoteItem>()
                {
                    new QuoteItem()
                    {
                        freightClass = 50
                        , weight     = 500
                        , length     = 48
                        , width      = 48
                        , height     = 48
                        , hazardous  = false
                        , pieces     = 1
                        , package    = "Pallets_other"
                    }
                }
                , charges = new List <string>()
                {
                    "liftgate pickup"
                }
            };

            var task = apiClient.GetRates(request);

            task.Wait(30000);
            this.result = task.Result;
        }