public async Task GetFetchesFromApi()
        {
            var repo = new ExchangeRateApiCachingDecorator(this.exchangeRates);

            var start = new DateTime(2018, 1, 1);
            var end = new DateTime(2018, 1, 2);

            await repo.GetAsync(start, end);

            A.CallTo(() => this.exchangeRates.GetAsync(start, end)).MustHaveHappenedOnceExactly();
        }
        public async Task GetFetchesFromApiTwiceWithCachingExpiring()
        {
            var repo = new ExchangeRateApiCachingDecorator(this.exchangeRates) { Expiry = TimeSpan.Zero };

            var start = new DateTime(2018, 1, 1);
            var end = new DateTime(2018, 1, 2);

            await repo.GetAsync(start, end);
            await repo.GetAsync(start, end);

            A.CallTo(() => this.exchangeRates.GetAsync(start, end)).MustHaveHappenedTwiceExactly();
        }
        public async Task GetFetchesFromApiTwiceWithSameDateButDifferentTimes()
        {
            var repo = new ExchangeRateApiCachingDecorator(this.exchangeRates);

            var start = new DateTime(2018, 1, 1);
            var end = new DateTime(2018, 1, 2);

            await repo.GetAsync(start, end);
            await repo.GetAsync(start.AddMinutes(5), end.AddMinutes(5));

            A.CallTo(() => this.exchangeRates.GetAsync(start, end)).MustHaveHappenedOnceExactly();
        }
        public async Task WeightedExchangeRate_Returns_ExpectedResult()
        {
            var clientFactory = new HttpClientFactory(new NullLogger <HttpClientFactory>());
            var repo          = new ExchangeRateApi(this._configuration, clientFactory, this._policyFactory, this._logger);
            var repoDecorator = new ExchangeRateApiCachingDecorator(repo);
            var exchangeRates = new ExchangeRatesService(repoDecorator, this._loggerExchRate);
            var calculator    = new TradePositionWeightedAverageExchangeRateService(exchangeRates, this._calculatorLogger);

            var tradeOne   = new Order().Random();
            var tradeTwo   = new Order().Random();
            var tradeThree = new Order().Random();

            tradeOne.FilledDate   = new DateTime(2017, 01, 01);
            tradeTwo.FilledDate   = new DateTime(2017, 10, 25);
            tradeThree.FilledDate = new DateTime(2017, 10, 25);

            var position = new TradePosition(new List <Order> {
                tradeOne, tradeTwo, tradeThree
            });

            var usd = new Currency("usd");

            var wer = await calculator.WeightedExchangeRate(position, usd, this._ruleCtx);
        }