public async Task ShouldGetTrafficForRegionFromCacheSuccessfully()
        {
            _traffic1.UpdatedAt = DateTime.Now;

            var trafficCache = new Mock <ITrafficCache>();

            trafficCache.Setup(p => p.GetByRegionCode(_region1.Code)).Returns(_traffic1);

            var trafficProvider = new Mock <ITrafficProvider>();

            trafficProvider.Setup(p => p.GetTrafficAsync(_region1.Code)).Returns(Task.Run(() => _traffic1));

            var regionService = new Mock <IRegionService>();

            var service = new CachedTrafficService(trafficCache.Object, trafficProvider.Object, regionService.Object);
            var result  = await service.GetTrafficForRegionAsync(_region1);

            Assert.IsNotNull(result);
            Assert.AreEqual(_traffic1.RegionCode, result.RegionCode);
            Assert.AreEqual(_traffic1.Level, result.Level);
            Assert.AreEqual(_traffic1.Hint, result.Hint);

            trafficCache.Verify(tc => tc.Save(It.IsAny <TrafficModel>()), Times.Never());
            trafficProvider.Verify(tc => tc.GetTrafficAsync(_region1.Code), Times.Never());
        }
        public async Task ShouldGetTrafficForRegionWithEmptyCacheSuccessfully()
        {
            TrafficModel cachedValue = null;

            var trafficCache = new Mock <ITrafficCache>();

            trafficCache.Setup(p => p.GetByRegionCode(_region1.Code)).Returns(() =>
            {
                return(cachedValue);
            });
            trafficCache.Setup(p => p.Save(_traffic1)).Callback((TrafficModel traffic) =>
            {
                cachedValue = traffic;
            });

            var trafficProvider = new Mock <ITrafficProvider>();

            trafficProvider.Setup(p => p.GetTrafficAsync(_region1.Code)).Returns(Task.Run(() => _traffic1));

            var regionService = new Mock <IRegionService>();

            var service = new CachedTrafficService(trafficCache.Object, trafficProvider.Object, regionService.Object);
            var result  = await service.GetTrafficForRegionAsync(_region1);

            Assert.IsNotNull(result);
            Assert.AreEqual(_traffic1.RegionCode, result.RegionCode);
            Assert.AreEqual(_traffic1.Level, result.Level);
            Assert.AreEqual(_traffic1.Hint, result.Hint);

            trafficCache.Verify(tc => tc.Save(It.IsAny <TrafficModel>()), Times.Once());
            trafficProvider.Verify(tc => tc.GetTrafficAsync(_region1.Code), Times.Once());
        }