public async Task WhenCacheDoesNotContainItem_ThenAccessIsInvoked()
        {
            var expectedRequest = new ExchangeRatesRequest("BASE", DateTime.UtcNow);
            var accessMock      = new Mock <IExchangeRatesAccess>();

            ExchangeRatesRequest actualRequest = null;

            accessMock.Setup(m => m.GetRates(It.IsAny <ExchangeRatesRequest>()))
            .Callback <ExchangeRatesRequest>(request => actualRequest = request)
            .ReturnsAsync(new ExchangeRatesResponse(
                              expectedRequest.BaseCurrency,
                              expectedRequest.Date,
                              new Dictionary <string, decimal>()));

            var cachingAccess = new CachingExchangeRatesAccess(new MemoryCache("rates"), accessMock.Object);

            await cachingAccess.GetRates(expectedRequest);

            actualRequest.Should().BeEquivalentTo(expectedRequest);
        }
        public async Task WhenLatestRatesAreRetrieved_ThenAccessDefaultRequestIsUsed()
        {
            var expectedRequest = new ExchangeRatesRequest("DEFAULTBase", DateTime.MaxValue);

            var accessMock = new Mock <IExchangeRatesAccess>();

            accessMock.SetupGet(m => m.DefaultRequest).Returns(expectedRequest);

            ExchangeRatesRequest actualRequest = null;

            accessMock.Setup(m => m.GetRates(It.IsAny <ExchangeRatesRequest>()))
            .Callback <ExchangeRatesRequest>(request => actualRequest = request)
            .ReturnsAsync(new ExchangeRatesResponse(
                              "blah",
                              DateTime.UtcNow,
                              new Dictionary <string, decimal>()));

            var manager = new ExchangeRatesManager(accessMock.Object, Mock.Of <IExchangeRatesEngine>());

            await manager.GetLatestRates();

            actualRequest.Should().Be(expectedRequest);
        }