public async Task Build_ShouldUseSpecifiedSuccessPage(EBehaviourType behaviourType)
        {
            // Arrange
            var callBack = new Page();

            _mockPageContentFactory
            .Setup(_ => _.Build(It.IsAny <Page>(), It.IsAny <Dictionary <string, dynamic> >(), It.IsAny <FormSchema>(), It.IsAny <string>(), It.IsAny <FormAnswers>(), It.IsAny <List <object> >()))
            .ReturnsAsync(new FormBuilderViewModel())
            .Callback <Page, Dictionary <string, dynamic>, FormSchema, string, FormAnswers, List <object> >((a, b, c, d, e, f) => callBack = a);

            _mockPageHelper
            .Setup(_ => _.GetPageWithMatchingRenderConditions(It.IsAny <List <Page> >()))
            .Returns(Page);

            // Act
            var result = await _factory.Build(string.Empty, new FormSchema { BaseURL = "base-test", FirstPageSlug = "page-one", Pages = new List <Page> {
                                                                                 new Page {
                                                                                     PageSlug = "success", Elements = new List <IElement> {
                                                                                         new H2()
                                                                                     }
                                                                                 }
                                                                             } }, string.Empty, new FormAnswers(), behaviourType);

            // Assert
            _mockPageContentFactory.Verify(_ => _.Build(It.IsAny <Page>(), It.IsAny <Dictionary <string, dynamic> >(), It.IsAny <FormSchema>(), It.IsAny <string>(), It.IsAny <FormAnswers>(), It.IsAny <List <object> >()), Times.Once);
            Assert.Equal("Success", result.ViewName);
            Assert.Single(callBack.Elements);
            Assert.Equal(EElementType.H2, callBack.Elements[0].Type);
        }
Exemple #2
0
        public async Task <SuccessPageEntity> Process(EBehaviourType behaviourType, string form)
        {
            var baseForm = await _schemaFactory.Build(form);

            if (baseForm.FormActions.Any())
            {
                await _actionsWorkflow.Process(baseForm.FormActions, baseForm, form);
            }

            return(await _pageService.FinalisePageJourney(form, behaviourType, baseForm));
        }
Exemple #3
0
        public async Task <SuccessPageEntity> FinalisePageJourney(string form, EBehaviourType behaviourType, FormSchema baseForm)
        {
            var sessionGuid = _sessionHelper.GetSessionGuid();

            if (string.IsNullOrEmpty(sessionGuid))
            {
                throw new ApplicationException("PageService::FinalisePageJourney: Session has expired");
            }

            var formData = _distributedCache.GetString(sessionGuid);

            if (formData is null)
            {
                throw new ApplicationException("PageService::FinalisePageJourney: Session data is null");
            }

            var formAnswers = JsonConvert.DeserializeObject <FormAnswers>(formData);

            var formFileUploadElements = baseForm.Pages.SelectMany(_ => _.Elements)
                                         .Where(_ => _.Type.Equals(EElementType.FileUpload) || _.Type.Equals(EElementType.MultipleFileUpload))
                                         .ToList();

            if (formFileUploadElements.Any())
            {
                formFileUploadElements.ForEach(fileElement =>
                {
                    var formFileAnswerData = formAnswers.Pages.SelectMany(_ => _.Answers).FirstOrDefault(_ => _.QuestionId.Equals($"{fileElement.Properties.QuestionId}{FileUploadConstants.SUFFIX}"))?.Response ?? string.Empty;
                    List <FileUploadModel> convertedFileUploadAnswer = JsonConvert.DeserializeObject <List <FileUploadModel> >(formFileAnswerData.ToString());

                    var fileStorageType = _configuration["FileStorageProvider:Type"];

                    var fileStorageProvider = _fileStorageProviders.Get(fileStorageType);

                    if (convertedFileUploadAnswer is not null && convertedFileUploadAnswer.Any())
                    {
                        convertedFileUploadAnswer.ForEach((_) =>
                        {
                            fileStorageProvider.Remove(_.Key);
                        });
                    }
                });
            }

            if (baseForm.DocumentDownload)
            {
                await _distributedCache.SetStringAsync($"document-{sessionGuid}", JsonConvert.SerializeObject(formAnswers), _distributedCacheExpirationConfiguration.Document);
            }

            return(await _successPageContentFactory.Build(form, baseForm, sessionGuid, formAnswers, behaviourType));
        }
Exemple #4
0
        public void GetNextPage_ShouldReturn_DefaultBehaviour(EBehaviourType type)
        {
            // Arrange
            var behaviour = new BehaviourBuilder()
                            .WithBehaviourType(type)
                            .Build();

            var page = new PageBuilder()
                       .WithBehaviour(behaviour)
                       .Build();

            // Act
            var result = page.GetNextPage(new Dictionary <string, dynamic>());

            // Assert
            Assert.Equal(type, result.BehaviourType);
        }
        public async Task Build_Should_AddDocumentDownloadButton_WhenDocumentDownloadEnabled(EBehaviourType behaviourType)
        {
            // Arrange
            var callBack = new Page();

            var element = new ElementBuilder()
                          .WithType(EElementType.H2)
                          .Build();

            var page = new PageBuilder()
                       .WithElement(element)
                       .WithPageSlug("success")
                       .Build();

            var formSchema = new FormSchemaBuilder()
                             .WithDocumentDownload(true)
                             .WithDocumentType(EDocumentType.Txt)
                             .WithFirstPageSlug("page-one")
                             .WithBaseUrl("base-test")
                             .WithPage(page)
                             .Build();

            _mockPageContentFactory
            .Setup(_ => _.Build(It.IsAny <Page>(), It.IsAny <Dictionary <string, dynamic> >(), It.IsAny <FormSchema>(), It.IsAny <string>(), It.IsAny <FormAnswers>(), It.IsAny <List <object> >()))
            .ReturnsAsync(new FormBuilderViewModel())
            .Callback <Page, Dictionary <string, dynamic>, FormSchema, string, FormAnswers, List <object> >((a, b, c, d, e, f) => callBack = a);

            _mockPageHelper
            .Setup(_ => _.GetPageWithMatchingRenderConditions(It.IsAny <List <Page> >()))
            .Returns(formSchema.Pages.FirstOrDefault());

            // Act
            var result = await _factory.Build(string.Empty, formSchema, string.Empty, new FormAnswers(), behaviourType);

            // Assert
            Assert.Equal("Success", result.ViewName);
            _mockPageContentFactory.Verify(_ => _.Build(It.IsAny <Page>(), It.IsAny <Dictionary <string, dynamic> >(), It.IsAny <FormSchema>(), It.IsAny <string>(), It.IsAny <FormAnswers>(), It.IsAny <List <object> >()), Times.Once);
            Assert.Equal(2, callBack.Elements.Count);
            Assert.Equal(EElementType.DocumentDownload, callBack.Elements[1].Type);
            Assert.Equal($"Download {EDocumentType.Txt} document", callBack.Elements[1].Properties.Label);
        }
Exemple #6
0
 private List <Behaviour> GetBehavioursByType(EBehaviourType type) => Behaviours.Where(_ => _.BehaviourType == type).ToList();
        public BehaviourBuilder WithBehaviourType(EBehaviourType type)
        {
            _behaviourType = type;

            return(this);
        }
        public async Task RenderAsync_ShouldDisableButton_OnClick_WhenPageHas_SubmitForm_OrSubmitAndPay_Action(EBehaviourType type)
        {
            //Arrange
            var callback = new Button();

            _mockIViewRender.Setup(_ => _.RenderAsync(It.IsAny <string>(), It.IsAny <Button>(), It.IsAny <Dictionary <string, dynamic> >()))
            .Callback <string, Button, Dictionary <string, dynamic> >((a, b, c) => callback = b);

            var element = new ElementBuilder()
                          .WithType(EElementType.Button)
                          .WithPropertyText("test text")
                          .Build();

            var behaviour = new BehaviourBuilder()
                            .WithBehaviourType(type)
                            .Build();

            var page = new PageBuilder()
                       .WithElement(element)
                       .WithBehaviour(behaviour)
                       .Build();

            var schema = new FormSchemaBuilder()
                         .WithName("form-name")
                         .Build();

            var formAnswers = new FormAnswers();

            var viewModel = new Dictionary <string, dynamic>();

            //Act
            await element.RenderAsync(_mockIViewRender.Object, _mockElementHelper.Object, string.Empty, viewModel, page, schema, _mockHostingEnv.Object, formAnswers);

            //Assert
            Assert.True(callback.Properties.DisableOnClick);
            _mockIViewRender.Verify(_ => _.RenderAsync(It.Is <string>(x => x.Equals("Button")), It.IsAny <Button>(), It.IsAny <Dictionary <string, object> >()), Times.Once);
        }
        public async Task Index_Post_Should_PerformRedirectToAction_WhenPageIsValid_And_SelectJourney_OnBehaviour(string viewName, EBehaviourType behaviourType)
        {
            // Arrange
            var element = new ElementBuilder()
                          .WithType(EElementType.Address)
                          .WithQuestionId("test-address")
                          .WithAddressProvider("testAddressProvider")
                          .Build();

            var behaviour = new BehaviourBuilder()
                            .WithBehaviourType(behaviourType)
                            .WithPageSlug("url")
                            .Build();

            var page = new PageBuilder()
                       .WithElement(element)
                       .WithPageSlug("page-one")
                       .WithValidatedModel(true)
                       .WithBehaviour(behaviour)
                       .Build();

            var viewModel = new ViewModelBuilder()
                            .WithEntry("Guid", Guid.NewGuid().ToString())
                            .WithEntry($"{element.Properties.QuestionId}-postcode", "SK11aa")
                            .Build();

            _pageService.Setup(_ => _.ProcessRequest(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Dictionary <string, dynamic> >(), It.IsAny <IEnumerable <CustomFormFile> >(), It.IsAny <bool>()))
            .ReturnsAsync(new ProcessRequestEntity {
                Page = page
            });
            _pageService.Setup(_ => _.GetBehaviour(It.IsAny <ProcessRequestEntity>())).Returns(new Behaviour {
                BehaviourType = behaviourType
            });

            // Act
            var result = await _homeController.Index("form", "page-one", viewModel, null, "automatic");

            // Assert
            var viewResult = Assert.IsType <RedirectToActionResult>(result);

            Assert.Equal(viewName, viewResult.ActionName);
        }
        public async Task <SuccessPageEntity> Build(string form, FormSchema baseForm, string sessionGuid, FormAnswers formAnswers, EBehaviourType behaviourType)
        {
            var page = baseForm.GetPage(_pageHelper, "success");

            _distributedCache.Remove(sessionGuid);
            _sessionHelper.RemoveSessionGuid();

            if (page == null && behaviourType == EBehaviourType.SubmitAndPay)
            {
                page = GenerateGenericPaymentPage();
                baseForm.Pages.Add(page);
            }

            if (page == null)
            {
                return(new SuccessPageEntity
                {
                    ViewName = "Submit",
                    FormAnswers = formAnswers,
                    CaseReference = formAnswers.CaseReference,
                    FeedbackFormUrl = baseForm.FeedbackForm,
                    FeedbackPhase = baseForm.FeedbackPhase,
                    FormName = baseForm.FormName,
                    StartPageUrl = baseForm.StartPageUrl
                });
            }

            if (baseForm.DocumentDownload)
            {
                baseForm.DocumentType.ForEach((docType) =>
                {
                    var element = new ElementBuilder()
                                  .WithType(EElementType.DocumentDownload)
                                  .WithLabel($"Download {docType} document")
                                  .WithSource($"/v2/document/Summary/{docType}/{sessionGuid}")
                                  .WithDocumentType(docType)
                                  .Build();

                    page.Elements.Add(element);
                });
                var successIndex = baseForm.Pages.IndexOf(page);
                baseForm.Pages[successIndex] = page;
            }

            var result = await _pageFactory.Build(page, new Dictionary <string, dynamic>(), baseForm, sessionGuid, formAnswers);

            return(new SuccessPageEntity
            {
                HtmlContent = result.RawHTML,
                CaseReference = formAnswers.CaseReference,
                FeedbackFormUrl = result.FeedbackForm,
                FeedbackPhase = result.FeedbackPhase,
                FormName = result.FormName,
                StartPageUrl = result.StartPageUrl,
                PageTitle = result.PageTitle,
                BannerTitle = page.BannerTitle,
                LeadingParagraph = page.LeadingParagraph,
                DisplayBreadcrumbs = page.DisplayBreadCrumbs,
                Breadcrumbs = baseForm.BreadCrumbs
            });
        }
Exemple #11
0
 private List <Behaviour> GetBehavioursByType(EBehaviourType type) => Behaviours.Where(_ => _.BehaviourType.Equals(type)).ToList();
Exemple #12
0
 public virtual void SetNewBehaviour(EBehaviourType NewBehaviour)
 {
     behaviourType = NewBehaviour;
 }