async public Task SaveFundingConfiguration_GivenValidConfigurationButFailedToSaveToDatabase_ReturnsStatusCode(string fundingStreamId, string fundingPeriodId) { //Arrange FundingStream fundingStream = new FundingStream { Id = fundingStreamId }; FundingPeriod fundingPeriod = new FundingPeriod { Id = fundingPeriodId }; ILogger logger = CreateLogger(); HttpStatusCode statusCode = HttpStatusCode.BadRequest; IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreamById(Arg.Is(fundingStreamId)) .Returns(fundingStream); policyRepository .GetFundingPeriodById(Arg.Is(fundingPeriodId)) .Returns(fundingPeriod); policyRepository .SaveFundingConfiguration(Arg.Is <FundingConfiguration>(x => x.FundingStreamId == fundingStreamId && x.FundingPeriodId == fundingPeriodId)) .Returns(statusCode); FundingConfigurationService fundingConfigurationsService = CreateFundingConfigurationService(logger: logger, policyRepository: policyRepository); FundingConfigurationViewModel fundingConfigurationViewModel = CreateConfigurationModel(); //Act IActionResult result = await fundingConfigurationsService.SaveFundingConfiguration("Action", "Controller", fundingConfigurationViewModel, fundingStreamId, fundingPeriodId); //Assert result .Should() .BeOfType <InternalServerErrorResult>(); InternalServerErrorResult statusCodeResult = (InternalServerErrorResult)result; statusCodeResult .StatusCode .Should() .Be(500); logger .Received(1) .Error(Arg.Is($"Failed to save configuration file for funding stream id: {fundingStreamId} and period id: {fundingPeriodId} to cosmos db with status 400")); }
public async Task <IActionResult> SaveFundingConfiguration([FromRoute] string fundingStreamId, [FromRoute] string fundingPeriodId, [FromBody] FundingConfigurationViewModel configurationViewModel) { string controllerName = string.Empty; if (ControllerContext.RouteData.Values.ContainsKey("controller")) { controllerName = (string)ControllerContext.RouteData.Values["controller"]; } return(await _fundingConfigurationService.SaveFundingConfiguration( nameof(GetFundingConfiguration), controllerName, configurationViewModel, fundingStreamId, fundingPeriodId)); }
async public Task SaveFundingConfiguration_GivenValidConfiguration_ReturnsStatusCode( string fundingStreamId, string fundingPeriodId) { FundingStream fundingStream = NewFundingStream(_ => _.WithId(fundingStreamId)); FundingPeriod fundingPeriod = NewFundingPeriod(_ => _.WithId(fundingPeriodId)); ILogger logger = CreateLogger(); HttpStatusCode statusCode = HttpStatusCode.OK; ICacheProvider cacheProvider = CreateCacheProvider(); cacheProvider .RemoveAsync <List <FundingConfiguration> >($"{CacheKeys.FundingConfig}{fundingStreamId}") .Returns(Task.CompletedTask); cacheProvider .SetAsync( $"{CacheKeys.FundingConfig}{fundingStreamId}-{fundingPeriodId}", Arg.Is <FundingConfiguration>(_ => _.FundingStreamId == fundingStreamId && _.FundingPeriodId == fundingPeriodId)) .Returns(Task.CompletedTask); IPolicyRepository policyRepository = CreatePolicyRepository(); policyRepository .GetFundingStreamById(Arg.Is(fundingStreamId)) .Returns(fundingStream); policyRepository .GetFundingPeriodById(Arg.Is(fundingPeriodId)) .Returns(fundingPeriod); policyRepository .SaveFundingConfiguration(Arg.Is <FundingConfiguration>(x => x.FundingStreamId == fundingStreamId && x.FundingPeriodId == fundingPeriodId)) .Returns(statusCode); FundingConfigurationService fundingConfigurationsService = CreateFundingConfigurationService( logger: logger, policyRepository: policyRepository, cacheProvider: cacheProvider); FundingConfigurationViewModel fundingConfigurationViewModel = CreateConfigurationModel(); //Act IActionResult result = await fundingConfigurationsService.SaveFundingConfiguration("Action", "Controller", fundingConfigurationViewModel, fundingStreamId, fundingPeriodId); //Assert result .Should() .BeOfType <CreatedAtActionResult>(); await cacheProvider .Received(1) .SetAsync( $"{CacheKeys.FundingConfig}{fundingStreamId}-{fundingPeriodId}", Arg.Is <FundingConfiguration>(_ => _.FundingStreamId == fundingStreamId && _.FundingPeriodId == fundingPeriodId)); await cacheProvider .Received(1) .RemoveAsync <List <FundingConfiguration> >($"{CacheKeys.FundingConfig}{fundingStreamId}"); }
public async Task <IActionResult> SaveFundingConfiguration(string actionName, string controllerName, FundingConfigurationViewModel configurationViewModel, string fundingStreamId, string fundingPeriodId) { Guard.IsNullOrWhiteSpace(actionName, nameof(actionName)); Guard.IsNullOrWhiteSpace(controllerName, nameof(controllerName)); Guard.IsNullOrWhiteSpace(fundingStreamId, nameof(fundingStreamId)); Guard.IsNullOrWhiteSpace(fundingPeriodId, nameof(fundingPeriodId)); Guard.ArgumentNotNull(configurationViewModel, nameof(configurationViewModel)); FundingConfiguration fundingConfiguration = _mapper.Map <FundingConfiguration>(configurationViewModel, opt => { opt.Items[nameof(FundingConfiguration.FundingStreamId)] = fundingStreamId; opt.Items[nameof(FundingConfiguration.FundingPeriodId)] = fundingPeriodId; }); BadRequestObjectResult validationResult = (await _fundingConfigurationValidator.ValidateAsync(fundingConfiguration)).PopulateModelState(); if (validationResult != null) { return(validationResult); } //TODO; add validation on existence of template (what is a template exactly) when supplied as the default template id (funding template I'm guessing) try { HttpStatusCode result = await _policyRepositoryPolicy.ExecuteAsync(() => _policyRepository.SaveFundingConfiguration(fundingConfiguration)); if (!result.IsSuccess()) { int statusCode = (int)result; string errorMessage = $"Failed to save configuration file for funding stream id: {fundingStreamId} and period id: {fundingPeriodId} to cosmos db with status {statusCode}"; _logger.Error(errorMessage); return(new InternalServerErrorResult(errorMessage)); } } catch (Exception exception) { string errorMessage = $"Exception occurred writing to configuration file for funding stream id: {fundingStreamId} and period id: {fundingPeriodId} to cosmos db"; _logger.Error(exception, errorMessage); return(new InternalServerErrorResult(errorMessage)); } string fundingPeriodFundingConfigurationCacheKey = $"{CacheKeys.FundingConfig}{fundingStreamId}-{fundingPeriodId}"; await _cacheProviderPolicy.ExecuteAsync(() => _cacheProvider.SetAsync(fundingPeriodFundingConfigurationCacheKey, fundingConfiguration)); string fundingStreamFundingConfigurationCacheKey = $"{CacheKeys.FundingConfig}{fundingStreamId}"; await _cacheProviderPolicy.ExecuteAsync(() => _cacheProvider.RemoveAsync <List <FundingConfiguration> >(fundingStreamFundingConfigurationCacheKey)); _logger.Information($"Successfully saved configuration file for funding stream id: {fundingStreamId} and period id: {fundingPeriodId} to cosmos db"); return(new CreatedAtActionResult(actionName, controllerName, new { fundingStreamId, fundingPeriodId }, string.Empty)); }