public Task <HttpStatusCode> UpdateSpecification(string specificationId, EditSpecificationModel specification) { Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId)); Guard.ArgumentNotNull(specification, nameof(specification)); return(PutAsync($"specification-edit?specificationId={specificationId}", specification)); }
public async Task <IActionResult> OnPostAsync(string specificationId = null, [FromQuery] EditSpecificationRedirectAction returnPage = EditSpecificationRedirectAction.ManagePolicies) { IsAuthorizedToEdit = await _authorizationHelper.DoesUserHavePermission(User, EditSpecificationViewModel, SpecificationActionTypes.CanEditSpecification); if (!IsAuthorizedToEdit) { return(new ForbidResult()); } if (!string.IsNullOrWhiteSpace(EditSpecificationViewModel.Name) && EditSpecificationViewModel.Name != EditSpecificationViewModel.OriginalSpecificationName) { ApiResponse <Specification> existingSpecificationResponse = await this._specsClient.GetSpecificationByName(EditSpecificationViewModel.Name); if (existingSpecificationResponse.StatusCode != HttpStatusCode.NotFound) { this.ModelState.AddModelError($"{nameof(EditSpecificationViewModel)}.{nameof(EditSpecificationViewModel.Name)}", ValidationMessages.SpecificationAlreadyExists); } } if (EditSpecificationViewModel.IsSelectedForFunding) { ModelState.Remove($"{nameof(EditSpecificationViewModel)}.{nameof(EditSpecificationViewModel.FundingPeriodId)}"); ModelState.Remove($"{nameof(EditSpecificationViewModel)}.{nameof(EditSpecificationViewModel.FundingStreamIds)}"); EditSpecificationViewModel.FundingPeriodId = EditSpecificationViewModel.OriginalFundingPeriodId; EditSpecificationViewModel.FundingStreamIds = EditSpecificationViewModel.OriginalFundingStreams.Split(",").ToArraySafe(); } if (!ModelState.IsValid) { await TaskHelper.WhenAllAndThrow(PopulateFundingPeriods(EditSpecificationViewModel.FundingPeriodId), PopulateFundingStreams(EditSpecificationViewModel.FundingStreamIds)); return(Page()); } EditSpecificationModel specification = _mapper.Map <EditSpecificationModel>(EditSpecificationViewModel); HttpStatusCode editResult = await _specsClient.UpdateSpecification(specificationId, specification); if (editResult == HttpStatusCode.OK) { if (returnPage == EditSpecificationRedirectAction.ManagePolicies) { return(Redirect($"/specs/policies/{specificationId}?operationType=SpecificationUpdated&operationId={specificationId}")); } else { return(Redirect($"/specs?operationType=SpecificationUpdated&operationId={specificationId}")); } } else { return(new InternalServerErrorResult($"Unable to update specification. API returned '{editResult}'")); } }
public async Task OnPostAsync_GivenViewModelIsValidAndRedirectToSpecificationsActionProvided_ThenSpecificationIsEditedAndReturnsRedirectToSpecificationsPage() { //Arrange ApiResponse <Specification> existingSpecificationResponse = new ApiResponse <Specification>(HttpStatusCode.NotFound); EditSpecificationModel editModel = new EditSpecificationModel(); EditSpecificationViewModel viewModel = CreateEditSpecificationViewModel(); ISpecsApiClient apiClient = CreateApiClient(); apiClient .GetSpecificationByName(Arg.Is(specName)) .Returns(existingSpecificationResponse); apiClient .UpdateSpecification(Arg.Is(specificationId), Arg.Any <EditSpecificationModel>()) .Returns(HttpStatusCode.OK); IMapper mapper = CreateMapper(); mapper .Map <EditSpecificationModel>(Arg.Is(viewModel)) .Returns(editModel); EditSpecificationPageModel pageModel = CreatePageModel(apiClient, mapper); pageModel.EditSpecificationViewModel = viewModel; pageModel.PageContext = new PageContext(); //Act IActionResult result = await pageModel.OnPostAsync(specificationId, EditSpecificationRedirectAction.Specifications); //Assert result .Should() .BeOfType <RedirectResult>(); RedirectResult redirectResult = result as RedirectResult; redirectResult .Url .Should() .Be("/specs?operationType=SpecificationUpdated&operationId=spec-id"); await apiClient .Received(1) .UpdateSpecification(Arg.Is(specificationId), Arg.Is(editModel)); }
public async Task OnPostAsync_GivenViewModelIsValidAndUpdateSpecificationCallFails_ThenInternalServerErrorReturned() { // Arrange ApiResponse <Specification> existingSpecificationResponse = new ApiResponse <Specification>(HttpStatusCode.NotFound); EditSpecificationModel editModel = new EditSpecificationModel(); EditSpecificationViewModel viewModel = CreateEditSpecificationViewModel(); ISpecsApiClient apiClient = CreateApiClient(); apiClient .GetSpecificationByName(Arg.Is(specName)) .Returns(existingSpecificationResponse); apiClient .UpdateSpecification(Arg.Is(specificationId), Arg.Any <EditSpecificationModel>()) .Returns(HttpStatusCode.InternalServerError); IMapper mapper = CreateMapper(); mapper .Map <EditSpecificationModel>(Arg.Is(viewModel)) .Returns(editModel); EditSpecificationPageModel pageModel = CreatePageModel(apiClient, mapper); pageModel.EditSpecificationViewModel = viewModel; pageModel.PageContext = new PageContext(); // Act IActionResult result = await pageModel.OnPostAsync(specificationId, EditSpecificationRedirectAction.Specifications); //Assert result .Should() .BeOfType <InternalServerErrorResult>() .Which .Value .Should() .Be("Unable to update specification. API returned 'InternalServerError'"); await apiClient .Received(1) .UpdateSpecification(Arg.Is(specificationId), Arg.Is(editModel)); }
public async Task <IActionResult> UpdateSpecification([FromBody] EditSpecificationModel viewModel, [FromRoute] string specificationId) { ValidatedApiResponse <SpecificationSummary> result = await _specificationsApiClient.UpdateSpecification(specificationId, viewModel); if (result.IsBadRequest(out BadRequestObjectResult badRequest)) { return(badRequest); } if (result.StatusCode == HttpStatusCode.OK) { return(new OkResult()); } return(new BadRequestResult()); }
public async Task <ValidatedApiResponse <SpecificationSummary> > UpdateSpecification(string specificationId, EditSpecificationModel specification) { Guard.IsNullOrWhiteSpace(specificationId, nameof(specificationId)); Guard.ArgumentNotNull(specification, nameof(specification)); return(await ValidatedPutAsync <SpecificationSummary, EditSpecificationModel>($"{UrlRoot}/specification-edit?specificationId={specificationId}", specification)); }
public Task <ValidatedApiResponse <SpecificationSummary> > UpdateSpecification(string specificationId, EditSpecificationModel specification) { throw new NotImplementedException(); }