public async Task GetFundingPeriods_GivenNullOrEmptyPeriodsReturned_LogsAndReturnsOKWithEmptyList()
        {
            // Arrange
            ILogger logger = CreateLogger();

            IEnumerable <FundingPeriod> Periods = null;

            IPolicyRepository policyRepository = CreatePolicyRepository();

            policyRepository
            .GetFundingPeriods()
            .Returns(Periods);

            FundingPeriodService fundingPeriodService = CreateFundingPeriodService(logger: logger, policyRepository: policyRepository);

            // Act
            IActionResult result = await fundingPeriodService.GetFundingPeriods();

            // Assert
            result
            .Should()
            .BeOfType <OkObjectResult>();

            OkObjectResult objectResult = result as OkObjectResult;

            IEnumerable <FundingPeriod> values = objectResult.Value as IEnumerable <FundingPeriod>;

            values
            .Should()
            .NotBeNull();

            logger
            .Received(1)
            .Error(Arg.Is("No funding periods were returned"));
        }
        public async Task GetFundingPeriods_GivenPeriodsAlreadyInCache_ReturnsOKWithResultsFromCache()
        {
            // Arrange
            ILogger logger = CreateLogger();

            IEnumerable <FundingPeriod> Periods = new[]
            {
                new FundingPeriod(),
                new FundingPeriod()
            };

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <FundingPeriod[]>(Arg.Is(CacheKeys.FundingPeriods))
            .Returns(Periods.ToArray());

            IPolicyRepository policyRepository = CreatePolicyRepository();

            FundingPeriodService PeriodsService = CreateFundingPeriodService(logger, cacheProvider, policyRepository);

            // Act
            IActionResult result = await PeriodsService.GetFundingPeriods();

            // Assert
            result
            .Should()
            .BeOfType <OkObjectResult>();

            OkObjectResult objectResult = result as OkObjectResult;

            IEnumerable <FundingPeriod> values = objectResult.Value as IEnumerable <FundingPeriod>;

            values
            .Should()
            .HaveCount(2);

            await
            policyRepository
            .DidNotReceive()
            .GetFundingPeriods();
        }
        public async Task GetFundingPeriods_GivenPeriodsReturned_ReturnsOKWithResults()
        {
            // Arrange
            ILogger logger = CreateLogger();

            IEnumerable <FundingPeriod> Periods = new[]
            {
                new FundingPeriod(),
                new FundingPeriod()
            };

            IPolicyRepository policyRepository = CreatePolicyRepository();

            policyRepository
            .GetFundingPeriods()
            .Returns(Periods);

            ICacheProvider cacheProvider = CreateCacheProvider();

            FundingPeriodService fundingPeriodService = CreateFundingPeriodService(logger, cacheProvider, policyRepository);

            // Act
            IActionResult result = await fundingPeriodService.GetFundingPeriods();

            // Assert
            result
            .Should()
            .BeOfType <OkObjectResult>();

            OkObjectResult objectResult = result as OkObjectResult;

            IEnumerable <FundingPeriod> values = objectResult.Value as IEnumerable <FundingPeriod>;

            values
            .Should()
            .HaveCount(2);

            await
            cacheProvider
            .Received(1)
            .SetAsync <FundingPeriod[]>(Arg.Is(CacheKeys.FundingPeriods), Arg.Is <FundingPeriod[]>(m => m.SequenceEqual(Periods)));
        }