public async Task HowCanWeHelpControllerBodyPostReturnsSuccessForValidCategories(Category selectedCategory)
        {
            // Arrange
            string moreDetail            = $"Some {selectedCategory} details";
            string expectedRedirectUrl   = $"/{RegistrationPath}/{EnterYourDetailsController.ThisViewCanonicalName}";
            var    fakeSessionStateModel = A.Fake <SessionStateModel <SessionDataModel> >();
            var    viewModel             = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = selectedCategory,
                MoreDetail       = moreDetail,
            };
            var controller = BuildHowCanWeHelpController(MediaTypeNames.Text.Html);

            A.CallTo(() => FakeSessionStateService.GetAsync(A <Guid> .Ignored)).Returns(fakeSessionStateModel);
            A.CallTo(() => FakeSessionStateService.SaveAsync(A <SessionStateModel <SessionDataModel> > .Ignored)).Returns(HttpStatusCode.OK);

            // Act
            var result = await controller.HowCanWeHelpBody(viewModel).ConfigureAwait(false);

            // Assert
            A.CallTo(() => FakeSessionStateService.GetAsync(A <Guid> .Ignored)).MustHaveHappenedOnceExactly();
            A.CallTo(() => FakeSessionStateService.SaveAsync(A <SessionStateModel <SessionDataModel> > .Ignored)).MustHaveHappenedOnceExactly();

            var redirectResult = Assert.IsType <RedirectResult>(result);

            Assert.Equal(expectedRedirectUrl, redirectResult.Url);
            Assert.False(redirectResult.Permanent);

            controller.Dispose();
        }
        public async Task <IActionResult> HowCanWeHelpBody()
        {
            var sessionStateModel = await GetSessionStateAsync().ConfigureAwait(false);

            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = sessionStateModel?.State?.Category ?? Category.None,
                MoreDetail       = sessionStateModel?.State?.MoreDetail,
                IsCallback       = sessionStateModel?.State?.IsCallback ?? false,
            };

            Logger.LogInformation($"{nameof(HowCanWeHelpBody)} has returned content");

            return(this.NegotiateContentResult(viewModel));
        }
        public void HowCanWeHelpBodyViewModelValidationReturnsSuccessForValidModel()
        {
            // Arrange
            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = Category.Website,
                MoreDetail       = "some more details",
            };

            // Act
            var(isValid, validationResults) = ModelValidator.TryValidateModel(viewModel);

            // Assert
            Assert.True(isValid);
            Assert.True(validationResults.Count == 0);
        }
        public void HowCanWeHelpBodyViewModelValidationReturnsErrorForMoreDetailTooLong()
        {
            // Arrange
            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = Category.Website,
                MoreDetail       = string.Empty.PadLeft(1001, '-'),
            };

            // Act
            var(isValid, validationResults) = ModelValidator.TryValidateModel(viewModel);

            // Assert
            Assert.False(isValid);
            Assert.True(validationResults.Count > 0);
            Assert.NotNull(validationResults.First(f => f.MemberNames.Any(a => a == nameof(HowCanWeHelpBodyViewModel.MoreDetail))));
            Assert.Equal("Message is limited to between 1 and 1000 characters", validationResults.First(f => f.MemberNames.Any(a => a == nameof(HowCanWeHelpBodyViewModel.MoreDetail))).ErrorMessage);
        }
        public void HowCanWeHelpBodyViewModelValidationReturnsErrorForMoreDetailMissing()
        {
            // Arrange
            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = Category.Website,
                MoreDetail       = null,
            };

            // Act
            var(isValid, validationResults) = ModelValidator.TryValidateModel(viewModel);

            // Assert
            Assert.False(isValid);
            Assert.True(validationResults.Count > 0);
            Assert.NotNull(validationResults.First(f => f.MemberNames.Any(a => a == nameof(HowCanWeHelpBodyViewModel.MoreDetail))));
            Assert.Equal(HowCanWeHelpBodyViewModel.MoreDetailRequiredError, validationResults.First(f => f.MemberNames.Any(a => a == nameof(HowCanWeHelpBodyViewModel.MoreDetail))).ErrorMessage);
        }
        public void HowCanWeHelpBodyViewModelValidationReturnsErrorForCategoryInvalid()
        {
            // Arrange
            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = Category.None,
                MoreDetail       = "some more details",
            };

            // Act
            var(isValid, validationResults) = ModelValidator.TryValidateModel(viewModel);

            // Assert
            Assert.False(isValid);
            Assert.True(validationResults.Count > 0);
            Assert.NotNull(validationResults.First(f => f.MemberNames.Any(a => a == nameof(HowCanWeHelpBodyViewModel.SelectedCategory))));
            Assert.Equal(HowCanWeHelpBodyViewModel.SelectedCategoryValidationError, validationResults.First(f => f.MemberNames.Any(a => a == nameof(HowCanWeHelpBodyViewModel.SelectedCategory))).ErrorMessage);
        }
        public async Task HowCanWeHelpControllerBodyPostReturnsSameViewForInvalidModel()
        {
            // Arrange
            var viewModel  = new HowCanWeHelpBodyViewModel();
            var controller = BuildHowCanWeHelpController(MediaTypeNames.Text.Html);

            controller.ModelState.AddModelError(nameof(HowCanWeHelpBodyViewModel.SelectedCategory), "Fake error");

            // Act
            var result = await controller.HowCanWeHelpBody(viewModel).ConfigureAwait(false);

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

            _ = Assert.IsAssignableFrom <HowCanWeHelpBodyViewModel>(viewResult.ViewData.Model);

            controller.Dispose();
        }
        public async Task HowCanWeHelpControllerBodyPostReturnsNotAcceptable(string mediaTypeName)
        {
            // Arrange
            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = Category.None,
            };
            var controller = BuildHowCanWeHelpController(mediaTypeName);

            // Act
            var result = await controller.HowCanWeHelpBody(viewModel).ConfigureAwait(false);

            // Assert
            var statusResult = Assert.IsType <StatusCodeResult>(result);

            A.Equals((int)HttpStatusCode.NotAcceptable, statusResult.StatusCode);

            controller.Dispose();
        }
        public async Task HowCanWeHelpControllerBodyPostReturnsSameViewForInvalidCategory(Category selectedCategory)
        {
            // Arrange
            var viewModel = new HowCanWeHelpBodyViewModel
            {
                SelectedCategory = selectedCategory,
                MoreDetail       = "some more detail",
            };
            var controller = BuildHowCanWeHelpController(MediaTypeNames.Text.Html);

            // Act
            var result = await controller.HowCanWeHelpBody(viewModel).ConfigureAwait(false);

            // Assert
            var viewResult = Assert.IsType <ViewResult>(result);
            var model      = Assert.IsAssignableFrom <HowCanWeHelpBodyViewModel>(viewResult.ViewData.Model);

            model.SelectedCategory.Should().Be(selectedCategory);

            controller.Dispose();
        }