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

            HttpStatusCode statusCode = HttpStatusCode.OK;

            IPolicyRepository policyRepository = CreatePolicyRepository();

            policyRepository
            .SaveFundingDate(
                Arg.Is <FundingDate>(_ => _
                                     .FundingStreamId == _fundingStreamId))
            .Returns(statusCode);

            FundingDateService fundingDateService = CreateFundingDateService(logger: logger, policyRepository: policyRepository);

            FundingDateViewModel fundingDateViewModel = CreateFundingDateViewModel();

            // Act
            IActionResult result = await fundingDateService.SaveFundingDate(
                null, null, _fundingStreamId, _fundingPeriodId, _fundingLineId, fundingDateViewModel);

            // Assert
            result
            .Should()
            .BeOfType <CreatedAtActionResult>()
            .Which
            .Should()
            .NotBeNull();

            logger
            .Received(1)
            .Information(Arg.Is($"Successfully saved funding date for funding stream id: {_fundingStreamId} and period id: {_fundingPeriodId} and funding line id: {_fundingLineId} to cosmos db"));
        }
        public async Task SaveFundingDate_GivenInvalidViewModel_ReturnsBadRequestResult()
        {
            // Arrange
            ILogger logger = CreateLogger();

            ValidationResult validationResult = new ValidationResult(
                new List <ValidationFailure>
            {
                new ValidationFailure("FundingStreamId", "error")
            });
            IValidator <FundingDate> validator = CreateValidator(validationResult);

            FundingDateService fundingDateService = CreateFundingDateService(logger: logger, validator: validator);

            FundingDateViewModel fundingDateViewModel = CreateFundingDateViewModel();

            // Act
            IActionResult result = await fundingDateService.SaveFundingDate(
                null, null, _fundingStreamId, _fundingPeriodId, _fundingLineId, fundingDateViewModel);

            // Assert
            result
            .Should()
            .BeOfType <BadRequestObjectResult>();
        }
        public async Task SaveFundingDate_GivenInvalidSaveFundingDateResult_ReturnsSaveFundingDateResult()
        {
            // Arrange
            ILogger logger = CreateLogger();

            HttpStatusCode statusCode = HttpStatusCode.InternalServerError;

            IPolicyRepository policyRepository = CreatePolicyRepository();

            policyRepository
            .SaveFundingDate(
                Arg.Is <FundingDate>(_ => _
                                     .FundingStreamId == _fundingStreamId))
            .Returns(statusCode);

            FundingDateService fundingDateService = CreateFundingDateService(logger: logger, policyRepository: policyRepository);

            FundingDateViewModel fundingDateViewModel = CreateFundingDateViewModel();

            // Act
            IActionResult result = await fundingDateService.SaveFundingDate(
                null, null, _fundingStreamId, _fundingPeriodId, _fundingLineId, fundingDateViewModel);

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

            logger
            .Received(1)
            .Error(Arg.Is($"Failed to save funding date for funding stream id: {_fundingStreamId} and period id: {_fundingPeriodId} and funding line id: {_fundingLineId} to cosmos db with status {(int)statusCode}"));
        }
        public async Task SaveFundingDate_GivenEmptyFundingDateViewModel_ReturnsBadRequestResult()
        {
            // Arrange
            ILogger logger = CreateLogger();

            FundingDateService fundingDateService = CreateFundingDateService(logger: logger);

            // Act
            IActionResult result = await fundingDateService.SaveFundingDate(null, null, _fundingStreamId, _fundingPeriodId, _fundingLineId, null);

            // Assert
            result
            .Should()
            .BeOfType <BadRequestObjectResult>()
            .Which
            .Value
            .Should()
            .Be("Null or empty funding date view model provided");

            logger
            .Received(1)
            .Error(Arg.Is("No funding date view model was provided to SaveFundingDate"));
        }