예제 #1
0
        public async Task HomeControllerHomeViewPostRedirectsSuccessfully(HomeOption selectedOption, string expectedRedirectUrl)
        {
            // Arrange
            var fakeSessionStateModel = A.Fake <SessionStateModel <SessionDataModel> >();
            var viewModel             = new HomeBodyViewModel
            {
                SelectedOption = selectedOption,
            };
            var controller = BuildHomeController(MediaTypeNames.Text.Html);

            if (selectedOption == HomeOption.SendAMessage || selectedOption == HomeOption.Callback)
            {
                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.HomeView(viewModel).ConfigureAwait(false);

            // Assert
            if (selectedOption == HomeOption.SendAMessage || selectedOption == HomeOption.Callback)
            {
                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 HomeControllerBodyPostReturnsSuccess(string mediaTypeName)
        {
            // Arrange
            string expectedRedirectUrl   = $"/{HomeController.RegistrationPath}/{HowCanWeHelpController.ThisViewCanonicalName}";
            var    fakeSessionStateModel = A.Fake <SessionStateModel <SessionDataModel> >();
            var    viewModel             = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.Callback,
            };
            var controller = BuildHomeController(mediaTypeName);

            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.HomeBody(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();
        }
예제 #3
0
        public async Task SessionStateSetWithValidSessionIdHeaderReturnsSuccessForCallback(HttpStatusCode saveStatusCode)
        {
            // Arrange
            var expectedRedirectUrl   = $"/{HomeController.RegistrationPath}/{HowCanWeHelpController.ThisViewCanonicalName}";
            var fakeSessionStateModel = A.Fake <SessionStateModel <SessionDataModel> >();
            var viewModel             = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.Callback,
            };
            var controller = BuildHomeController(MediaTypeNames.Text.Html);

            controller.Request.Headers.Add(ConstantStrings.CompositeSessionIdHeaderName, Guid.NewGuid().ToString());

            A.CallTo(() => fakeSessionStateService.GetAsync(A <Guid> .Ignored)).Returns(fakeSessionStateModel);
            A.CallTo(() => fakeSessionStateService.SaveAsync(A <SessionStateModel <SessionDataModel> > .Ignored)).Returns(saveStatusCode);

            // Act
            var result = await controller.HomeBody(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();
        }
예제 #4
0
        public void HomeBodyViewModelValidationReturnsSuccessForValidModel()
        {
            // Arrange
            var viewModel = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.Callback,
            };

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

            // Assert
            Assert.True(isValid);
            Assert.True(validationResults.Count == 0);
        }
예제 #5
0
        public async Task <IActionResult> HomeBody()
        {
            await DeleteSessionStateAsync().ConfigureAwait(false);

            var configurationSetModel = await configurationSetDocumentService.GetByIdAsync(ConfigurationSetKeyHelper.ConfigurationSetKey).ConfigureAwait(false) ?? new ConfigurationSetModel();

            var viewModel = new HomeBodyViewModel()
            {
                PhoneNumber   = configurationSetModel?.PhoneNumber ?? ConfigurationSetModel.DefaultPhoneNumber,
                LinesOpenText = configurationSetModel?.LinesOpenText,
            };

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

            return(this.NegotiateContentResult(viewModel));
        }
예제 #6
0
        public void HomeBodyViewModelValidationReturnsErrorForOptionInvalid()
        {
            // Arrange
            var viewModel = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.None,
            };

            // 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(HomeBodyViewModel.SelectedOption))));
            Assert.Equal(HomeBodyViewModel.SelectedOptionValidationError, validationResults.First(f => f.MemberNames.Any(a => a == nameof(HomeBodyViewModel.SelectedOption))).ErrorMessage);
        }
예제 #7
0
        public async Task HomeControllerHomeViewPostReturnsSameViewForInvalidModel(HomeOption selectedOption)
        {
            // Arrange
            var viewModel = new HomeBodyViewModel
            {
                SelectedOption = selectedOption,
            };
            var controller = BuildHomeController(MediaTypeNames.Text.Html);

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

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

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

            controller.Dispose();
        }
        public async Task HomeControllerBodyPostReturnsNotAcceptable(string mediaTypeName)
        {
            // Arrange
            var viewModel = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.None,
            };
            var controller = BuildHomeController(mediaTypeName);

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

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

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

            controller.Dispose();
        }
예제 #9
0
        public async Task <IActionResult> HomeBody(HomeBodyViewModel?viewModel)
        {
            if (viewModel != null && ModelState.IsValid)
            {
                switch (viewModel.SelectedOption)
                {
                case HomeOption.Webchat:
                    return(Redirect($"/{WebchatRegistrationPath}/{ChatController.ThisViewCanonicalName}"));

                case HomeOption.SendAMessage:
                    if (await SetSessionStateAsync(Category.None, null, false).ConfigureAwait(false))
                    {
                        return(Redirect($"/{RegistrationPath}/{HowCanWeHelpController.ThisViewCanonicalName}"));
                    }

                    break;

                case HomeOption.Callback:
                    if (await SetSessionStateAsync(Category.None, null, true).ConfigureAwait(false))
                    {
                        return(Redirect($"/{RegistrationPath}/{HowCanWeHelpController.ThisViewCanonicalName}"));
                    }

                    break;

                case HomeOption.Sendletter:
                    return(Redirect($"/{RegistrationPath}/{SendUsLetterCanonicalName}"));
                }
            }

            var configurationSetModel = await configurationSetDocumentService.GetByIdAsync(ConfigurationSetKeyHelper.ConfigurationSetKey).ConfigureAwait(false) ?? new ConfigurationSetModel();

            viewModel = new HomeBodyViewModel()
            {
                PhoneNumber   = configurationSetModel?.PhoneNumber ?? ConfigurationSetModel.DefaultPhoneNumber,
                LinesOpenText = configurationSetModel?.LinesOpenText,
            };

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

            return(this.NegotiateContentResult(viewModel));
        }
예제 #10
0
        public async Task HomeControllerHomeViewPostReturnsSuccess(string mediaTypeName)
        {
            // Arrange
            string expectedRedirectUrl = $"/{LocalPath}/{ChatController.ThisViewCanonicalName}";
            var    viewModel           = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.Webchat,
            };
            var controller = BuildHomeController(mediaTypeName);

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

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

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

            controller.Dispose();
        }
예제 #11
0
        public async Task SessionStateSetWithMissingSessionIdHeaderReturnsSuccessForCallback()
        {
            // Arrange
            var viewModel = new HomeBodyViewModel
            {
                SelectedOption = HomeOption.Callback,
            };
            var controller = BuildHomeController(MediaTypeNames.Text.Html);

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

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

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

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

            controller.Dispose();
        }