public async Task <IActionResult> OnPostAsync(string fundingPeriodId = null)
        {
            if (!ModelState.IsValid)
            {
                await TaskHelper.WhenAllAndThrow(PopulateFundingPeriods(fundingPeriodId), PopulateFundingStreams());

                IsAuthorizedToCreate = FundingStreams.Count() != 0;
                return(Page());
            }

            CreateSpecificationModel specification = _mapper.Map <CreateSpecificationModel>(CreateSpecificationViewModel);

            if (!await _authorizationHelper.DoesUserHavePermission(User, specification.FundingStreamIds, FundingStreamActionTypes.CanCreateSpecification))
            {
                return(new ForbidResult());
            }

            ValidatedApiResponse <Specification> result = await _specsClient.CreateSpecification(specification);

            if (result.StatusCode.IsSuccess())
            {
                return(Redirect($"/specs/policies/{result.Content.Id}?operationType=SpecificationCreated&operationId={result.Content.Id}"));
            }
            else if (result.StatusCode == HttpStatusCode.BadRequest)
            {
                result.AddValidationResultErrors(ModelState);

                await TaskHelper.WhenAllAndThrow(PopulateFundingPeriods(fundingPeriodId), PopulateFundingStreams());

                return(Page());
            }
            else
            {
                return(new InternalServerErrorResult($"Unable to create specification - result '{result.StatusCode}'"));
            }
        }
示例#2
0
        private async Task <Specification> GenerateSpecification(SpecGeneratorConfiguration configuration)
        {
            string periodId = configuration.PeriodId;

            if (string.IsNullOrWhiteSpace(periodId))
            {
                ApiResponse <IEnumerable <Reference> > periodResponse = await _specsClient.GetFundingPeriods();

                Reference firstPeriod = periodResponse.Content.First();
                periodId = firstPeriod.Id;
            }

            IEnumerable <string> fundingStreamIds = configuration.FundingStreamIds;

            if (fundingStreamIds == null || !fundingStreamIds.Any())
            {
                ApiResponse <IEnumerable <FundingStream> > fundingStreamResponse = await _specsClient.GetFundingStreams();

                fundingStreamIds = new string[] { fundingStreamResponse.Content.First().Id };
            }

            CreateSpecificationModel createModel = new CreateSpecificationModel()
            {
                Name             = configuration.SpecificationName,
                FundingPeriodId  = periodId,
                FundingStreamIds = fundingStreamIds,
                Description      = "SpecGenerator " + DateTime.Now.ToLongDateString(),
            };

            _logger.Information("Generating specification called '{Name}' in period '{FundingPeriodId}'", createModel.Name, createModel.FundingPeriodId);

            ValidatedApiResponse <Specification> specificationResult = await _specsClient.CreateSpecification(createModel);

            _logger.Information("Created Specification {Id}", specificationResult.Content.Id);
            return(specificationResult.Content);
        }
        public async Task OnPostAsync_GivenViewModelIsValid_ReturnsRedirect()
        {
            //Arrange
            const string specName = "spec name";

            CreateSpecificationModel createModel = new CreateSpecificationModel
            {
                Name             = specName,
                Description      = "description",
                FundingStreamIds = new[] { "fs1" },
                FundingPeriodId  = "fp1"
            };

            ApiResponse <Specification> existingSpecificationResponse = new ApiResponse <Specification>(HttpStatusCode.NotFound);

            ISpecsApiClient apiClient = CreateApiClient();

            apiClient
            .GetSpecificationByName(Arg.Is(specName))
            .Returns(existingSpecificationResponse);

            Specification createdSpecification = new Specification()
            {
                Id = "specId",
            };

            apiClient
            .CreateSpecification(Arg.Any <CreateSpecificationModel>())
            .Returns(new ValidatedApiResponse <Specification>(HttpStatusCode.OK, createdSpecification));

            IMapper mapper = CreateMapper();

            mapper
            .Map <CreateSpecificationModel>(Arg.Any <CreateSpecificationViewModel>())
            .Returns(createModel);

            IAuthorizationHelper authorizationHelper = Substitute.For <IAuthorizationHelper>();

            authorizationHelper
            .DoesUserHavePermission(Arg.Any <ClaimsPrincipal>(), Arg.Any <IEnumerable <string> >(), Arg.Is(FundingStreamActionTypes.CanCreateSpecification))
            .Returns(true);

            CreateSpecificationPageModel pageModel = CreatePageModel(apiClient, mapper, authorizationHelper);

            pageModel.CreateSpecificationViewModel = new CreateSpecificationViewModel
            {
                Name             = specName,
                Description      = "description",
                FundingStreamIds = new[] { "fs1" },
                FundingPeriodId  = "fp1"
            };

            //Act
            IActionResult result = await pageModel.OnPostAsync();

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

            RedirectResult redirectResult = result as RedirectResult;

            redirectResult
            .Url
            .Should()
            .Be("/specs/policies/specId?operationType=SpecificationCreated&operationId=specId");
        }