public async Task <IActionResult> OnPostAsync(string specificationId) { Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId)); Specification specification = await GetSpecification(specificationId); if (!await _authorizationHelper.DoesUserHavePermission(User, specification, SpecificationActionTypes.CanEditSpecification)) { return(new ForbidResult()); } if (!string.IsNullOrWhiteSpace(CreateCalculationViewModel.Name)) { ApiResponse <Calculation> existingCalculationResponse = await _specsClient .GetCalculationBySpecificationIdAndCalculationName(specificationId, CreateCalculationViewModel.Name); if (existingCalculationResponse.StatusCode != HttpStatusCode.NotFound) { this.ModelState.AddModelError($"{nameof(CreateCalculationViewModel)}.{nameof(CreateCalculationViewModel.Name)}", ValidationMessages.CalculationNameAlreadyExists); } } if (CreateCalculationViewModel.CalculationType == "Funding" && string.IsNullOrWhiteSpace(CreateCalculationViewModel.AllocationLineId)) { this.ModelState.AddModelError($"{nameof(CreateCalculationViewModel)}.{nameof(CreateCalculationViewModel.AllocationLineId)}", ValidationMessages.CalculationAllocationLineRequired); } if (!ModelState.IsValid) { SpecificationName = specification.Name; SpecificationId = specificationId; FundingPeriodName = specification.FundingPeriod.Name; FundingPeriodId = specification.FundingPeriod.Id; return(await PopulateForm(specification)); } CalculationCreateModel calculation = _mapper.Map <CalculationCreateModel>(CreateCalculationViewModel); calculation.SpecificationId = specificationId; ValidatedApiResponse <Calculation> newCalculationResponse = await _specsClient.CreateCalculation(calculation); if (newCalculationResponse.StatusCode == HttpStatusCode.OK) { Calculation newCalculation = newCalculationResponse.Content; return(Redirect($"/specs/policies/{specificationId}?operationType=CalculationCreated&operationId={newCalculation.Id}")); } else if (newCalculationResponse.StatusCode == HttpStatusCode.BadRequest) { newCalculationResponse.AddValidationResultErrors(ModelState); SpecificationName = specification.Name; SpecificationId = specificationId; FundingPeriodName = specification.FundingPeriod.Name; FundingPeriodId = specification.FundingPeriod.Id; return(await PopulateForm(specification)); } else { throw new InvalidOperationException($"Unable to create calculation specifications. Status Code = {newCalculationResponse.StatusCode}"); } }
public async Task OnPostAsync_GivenCalculationDoesNotAlreadyExist_ReturnsRedirect() { //Arrange CreateCalculationViewModel viewModel = new CreateCalculationViewModel { Name = "any name" }; Specification specification = CreateSpecification(); IEnumerable <Reference> allocationLines = new[] { new Reference { Id = "alloc-id", Name = "alloc-name" } }; CalculationCreateModel createModel = new CalculationCreateModel { SpecificationId = specificationId }; IMapper mapper = CreateMapper(); mapper .Map <CalculationCreateModel>(Arg.Is(viewModel)) .Returns(createModel); ApiResponse <Calculation> calcApiRespnse = new ApiResponse <Calculation>(HttpStatusCode.NotFound); ValidatedApiResponse <Calculation> newCalcApiResponse = new ValidatedApiResponse <Calculation>(HttpStatusCode.OK, new Calculation { Id = "new-calc-id" }); ISpecsApiClient specsClient = CreateSpecsApiClient(); specsClient .GetCalculationBySpecificationIdAndCalculationName(Arg.Is(specificationId), Arg.Is(viewModel.Name)) .Returns(calcApiRespnse); specsClient .CreateCalculation(Arg.Is(createModel)) .Returns(newCalcApiResponse); CreateCalculationPageModel pageModel = CreatePageModel(specsClient, mapper); pageModel.PageContext = new PageContext(); pageModel.CreateCalculationViewModel = viewModel; //Act IActionResult result = await pageModel.OnPostAsync(specificationId); //Assert result .Should() .NotBeNull(); result .Should() .BeAssignableTo <RedirectResult>(); RedirectResult redirectResult = result as RedirectResult; redirectResult .Url .Should() .Be($"/specs/policies/{specificationId}?operationType=CalculationCreated&operationId=new-calc-id"); }
public void OnPostAsync_GivenCalculationDoesNotAlreadyExistButSavingIsNotOK_InvalidOperationException() { //Arrange CreateCalculationViewModel viewModel = new CreateCalculationViewModel { Name = "any name" }; Specification specification = CreateSpecification(); IEnumerable <Reference> allocationLines = new[] { new Reference { Id = "alloc-id", Name = "alloc-name" } }; CalculationCreateModel createModel = new CalculationCreateModel { SpecificationId = specificationId }; IMapper mapper = CreateMapper(); mapper .Map <CalculationCreateModel>(Arg.Is(viewModel)) .Returns(createModel); ApiResponse <Calculation> calcApiRespnse = new ApiResponse <Calculation>(HttpStatusCode.NotFound); ValidatedApiResponse <Calculation> newCalcApiResponse = new ValidatedApiResponse <Calculation>(HttpStatusCode.InternalServerError, new Calculation { Id = "new-calc-id", }); newCalcApiResponse.ModelState = new Dictionary <string, IEnumerable <string> >(); ISpecsApiClient specsClient = CreateSpecsApiClient(); specsClient .GetCalculationBySpecificationIdAndCalculationName(Arg.Is(specificationId), Arg.Is(viewModel.Name)) .Returns(calcApiRespnse); specsClient .CreateCalculation(Arg.Is(createModel)) .Returns(newCalcApiResponse); List <FundingStream> fundingStreams = new List <FundingStream>(); fundingStreams.Add(new FundingStream { Id = fundingStreamId, AllocationLines = new List <AllocationLine>() { new AllocationLine() { Id = "al1", Name = "Allocation Line 1", } } }); ApiResponse <IEnumerable <FundingStream> > fundingStreamResponse = new ApiResponse <IEnumerable <FundingStream> >(HttpStatusCode.OK, fundingStreams); specsClient .GetFundingStreamsForSpecification(Arg.Is(specification.Id)) .Returns(fundingStreamResponse); specsClient .GetBaselineCalculationsBySpecificationId(Arg.Is(specificationId)) .Returns(new ApiResponse <IEnumerable <CalculationCurrentVersion> >(HttpStatusCode.OK, Enumerable.Empty <CalculationCurrentVersion>())); specsClient.GetSpecification(Arg.Is(specificationId)) .Returns(new ApiResponse <Specification>(HttpStatusCode.OK, specification)); CreateCalculationPageModel pageModel = CreatePageModel(specsClient, mapper); pageModel.PageContext = new PageContext(); pageModel.CreateCalculationViewModel = viewModel; //Act Func <Task> test = async() => await pageModel.OnPostAsync(specificationId); //Assert test .Should() .ThrowExactly <InvalidOperationException>(); }
public async Task OnPostAsync_GivenCalculationDoesNotAlreadyExistAndCalcTypeIsFundingButNoAllocationLineSelected_ReturnsPage() { //Arrange CreateCalculationViewModel viewModel = new CreateCalculationViewModel { Name = "any name", CalculationType = "Funding" }; Specification specification = CreateSpecification(); IEnumerable <AllocationLine> allocationLines = new[] { new AllocationLine { Id = "alloc-id", Name = "alloc-name" } }; List <FundingStream> fundingStreams = new List <FundingStream>(); FundingStream fundingStream = new FundingStream { Id = fundingStreamId, AllocationLines = allocationLines }; fundingStreams.Add(fundingStream); List <CalculationCurrentVersion> baselineCalculations = new List <CalculationCurrentVersion>(); ApiResponse <IEnumerable <FundingStream> > fundingStreamResponse = new ApiResponse <IEnumerable <FundingStream> >(HttpStatusCode.OK, fundingStreams); CalculationCreateModel createModel = new CalculationCreateModel { SpecificationId = specificationId }; ApiResponse <Calculation> calcApiResponse = new ApiResponse <Calculation>(HttpStatusCode.NotFound); ApiResponse <Specification> apiResponse = new ApiResponse <Specification>(HttpStatusCode.OK, specification); ApiResponse <IEnumerable <CalculationCurrentVersion> > baselineCalculationsResponse = new ApiResponse <IEnumerable <CalculationCurrentVersion> >(HttpStatusCode.OK, baselineCalculations); ISpecsApiClient specsClient = CreateSpecsApiClient(); specsClient .GetCalculationBySpecificationIdAndCalculationName(Arg.Is(specificationId), Arg.Is(viewModel.Name)) .Returns(calcApiResponse); specsClient .GetSpecification(Arg.Is(specificationId)) .Returns(apiResponse); specsClient .GetFundingStreamsForSpecification(Arg.Is(specification.Id)) .Returns(fundingStreamResponse); specsClient .GetBaselineCalculationsBySpecificationId(Arg.Is(specificationId)) .Returns(baselineCalculationsResponse); CreateCalculationPageModel pageModel = CreatePageModel(specsClient); pageModel.PageContext = new PageContext(); pageModel.CreateCalculationViewModel = viewModel; //Act IActionResult result = await pageModel.OnPostAsync(specificationId); //Assert result .Should() .NotBeNull(); result .Should() .BeAssignableTo <PageResult>(); pageModel .ModelState .ErrorCount .Should() .Be(1); }