public async Task Then_If_The_Ga_Cookie_Is_Not_Available_A_Default_Value_Is_Used()
        {
            //Arrange
            _httpContext = new Mock <HttpContext>();

            _httpContext.Setup(x => x.Request.Cookies["_ga"]).Returns(string.Empty);
            _httpContext.Setup(x => x.Request.Path).Returns("/");

            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                ControllerContext =
                {
                    HttpContext = _httpContext.Object,
                    RouteData   = new RouteData()
                }
            };

            //Act
            await _controller.Index(_registerInterestModel);

            //Assert
            _userDataCollection.Verify(x => x.StoreUserData(It.Is <UserData>(
                                                                c => c.CookieId.Equals("not-available")
                                                                )), Times.Once);
        }
        public async Task Then_When_Viewing_The_RegisterInterest_Form_If_There_Is_No_Referrer_They_Are_Redirected_To_The_HomePage()
        {
            //Arrange
            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();
            _httpContext.Setup(x => x.Request.Headers).Returns(new HeaderDictionary(new Dictionary <string, StringValues>()));
            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext = _httpContext.Object,
                    RouteData   = new RouteData()
                }
            };

            //Act
            var actual = await _controller.Index(RouteType.Apprentice);

            //Assert
            Assert.IsNotNull(actual);
            var viewResult = actual as ViewResult;

            Assert.IsNotNull(viewResult);
            var model = viewResult.Model as RegisterInterestModel;

            Assert.IsNotNull(model);
            Assert.AreEqual(ExpectedDefaultUrl, model.ReturnUrl);
            mockUrlHelper.Verify(x => x.Action(It.Is <UrlActionContext>(c => c.Action.Equals("Index") && c.Controller.Equals("Home"))));
        }
        public async Task When_clicking_register_interest_from_a_search_result_page_then_query_string_is_appended()
        {
            //Arrange
            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();

            var ExpectedRefererUrlWithQuerystring = $"{ExpectedDefaultUrl}?Postcode=CV1+2WT";

            _httpContext.Setup(x => x.Request.Headers)
            .Returns(new HeaderDictionary(new Dictionary <string, StringValues>
            {
                { "Referer", ExpectedRefererUrlWithQuerystring }
            }));

            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext      = _httpContext.Object,
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerName = "register-interest"
                    },
                    RouteData          = new RouteData()
                }
            };

            //Act
            var actual = await _controller.Index(RouteType.Apprentice);

            //Assert
            Assert.IsNotNull(actual);

            var viewResult = actual as ViewResult;

            Assert.IsNotNull(viewResult);

            var model = viewResult.Model as RegisterInterestModel;

            Assert.IsNotNull(model);
            Assert.AreEqual(ExpectedRefererUrlWithQuerystring, model.ReturnUrl);
        }
        public void Arrange()
        {
            _registerInterestModel = new RegisterInterestModel
            {
                Email             = "*****@*****.**",
                FirstName         = "Test",
                Route             = RouteType.Apprentice,
                LastName          = "test",
                ShowRouteQuestion = false
            };

            _mediator = new Mock <IMediator>();
            _mediator.SetupMockMediator();

            _userDataCollection = new Mock <IUserDataCollection>();

            var headers = new HeaderDictionary(new Dictionary <string, StringValues> {
                { "Referer", ExpectedReferrerUrl }
            });

            _httpContext = new Mock <HttpContext>();
            _httpContext.Setup(x => x.Request.Cookies["_ga"]).Returns(ExpectedCookieId);
            _httpContext.Setup(x => x.Request.Headers).Returns(headers);
            _httpContext.Setup(x => x.Request.Path).Returns("/");

            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();
            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext      = _httpContext.Object,
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerName = "register-interest"
                    },
                    RouteData          = new RouteData()
                }
            };
        }
        public async Task When_Referring_From_An_FAA_Vacancy_Search_The_Full_Url_Is_Returned()
        {
            //Arrange
            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();
            _httpContext.Setup(x => x.Request.Headers)
            .Returns(new HeaderDictionary(new Dictionary <string, StringValues>
            {
                { "Referer", ExpectedVacancySearchReferrerURl }
            }));
            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext      = _httpContext.Object,
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerName = "register-interest"
                    },
                    RouteData          = new Microsoft.AspNetCore.Routing.RouteData()
                }
            };

            //Act
            var actual = await _controller.Index(RouteType.Apprentice);

            //Assert
            Assert.IsNotNull(actual);
            var viewResult = actual as ViewResult;

            Assert.IsNotNull(viewResult);
            var model = viewResult.Model as RegisterInterestModel;

            Assert.IsNotNull(model);

            Assert.AreEqual(ExpectedDefaultUrl, model.ReturnUrl);
            mockUrlHelper.Verify(x => x.Action(It.Is <UrlActionContext>(c => c.Action.Equals("SearchResults/standard/postcode/distance") && c.Controller.Equals("cpg"))));
        }
        public void Then_When_Viewing_The_RegisterInterest_Form_Then_If_There_Are_No_Controller_Action_Segments_Default_Values_AreUsed()
        {
            //Arrange
            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();
            _httpContext.Setup(x => x.Request.Headers)
            .Returns(new HeaderDictionary(new Dictionary <string, StringValues>
            {
                { "Referer", "https://test2/" }
            }));
            _controller = new RegisterInterestController(_userDataCollection.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext      = _httpContext.Object,
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerName = "register-interest"
                    },
                    RouteData          = new RouteData()
                }
            };

            //Act
            var actual = _controller.Index(RouteType.Apprentice);

            //Assert
            Assert.IsNotNull(actual);
            var viewResult = actual as ViewResult;

            Assert.IsNotNull(viewResult);
            var model = viewResult.Model as RegisterInterestModel;

            Assert.IsNotNull(model);

            Assert.AreEqual(ExpectedDefaultUrl, model.ReturnUrl);
            mockUrlHelper.Verify(x => x.Action(It.Is <UrlActionContext>(c => c.Action.Equals("Index") && c.Controller.Equals("Home"))));
        }
        public async Task Then_If_The_Referrer_Is_Itself_Then_It_Is_Redirected_To_The_Homepage()
        {
            //Arrange
            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();
            _httpContext.Setup(x => x.Request.Headers)
            .Returns(new HeaderDictionary(new Dictionary <string, StringValues>
            {
                { "Referer", "https://test/Register-interest" }
            }));
            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext      = _httpContext.Object,
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerName = "register-interest"
                    },
                    RouteData          = new RouteData()
                }
            };

            //Act
            var actual = await _controller.Index(RouteType.Apprentice);

            //Assert
            Assert.IsNotNull(actual);
            var viewResult = actual as ViewResult;

            Assert.IsNotNull(viewResult);
            var model = viewResult.Model as RegisterInterestModel;

            Assert.IsNotNull(model);
            Assert.AreEqual(ExpectedDefaultUrl, model.ReturnUrl);
        }
        public async Task Then_If_The_Model_Is_Not_Valid_And_Route_Is_Known_Then_Dont_Show_Route_Question()
        {
            //Arrange
            var mockUrlHelper = new Mock <IUrlHelper>(MockBehavior.Strict);

            mockUrlHelper
            .Setup(m => m.Action(It.IsAny <UrlActionContext>()))
            .Returns(ExpectedDefaultUrl).Verifiable();

            _controller = new RegisterInterestController(_userDataCollection.Object, _mediator.Object)
            {
                Url = mockUrlHelper.Object,
                ControllerContext =
                {
                    HttpContext      = _httpContext.Object,
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerName = "register-interest"
                    },
                    RouteData          = new RouteData(new RouteValueDictionary {
                        { "route", "apprentice" }
                    })
                }
            };

            _controller.ModelState.AddModelError("FirstName", "First name");

            //Act
            var actual = await _controller.Index(_registerInterestModel);

            Assert.IsNotNull(actual);
            var viewResult = actual as ViewResult;

            Assert.IsNotNull(viewResult);
            var model = viewResult.Model as RegisterInterestModel;

            Assert.IsNotNull(model);

            Assert.IsFalse(model.ShowRouteQuestion);
        }