public async Task Warning_WhenNoText(string url)
        {
            //Arrange
            HttpResponseMessage page = await _client.GetAsync(url);

            IHtmlDocument document = await HtmlHelpers.GetDocumentAsync(page);

            IHtmlFormElement  form         = (IHtmlFormElement)document.Body.SelectSingleNode(@".//form[@id=""messageForm""]");
            IHtmlInputElement textField    = (IHtmlInputElement)document.Body.SelectSingleNode(@".//input[@id=""textInput""]");
            IHtmlInputElement submitButton = (IHtmlInputElement)document.Body.SelectSingleNode(@".//input[@id=""submitForNewMessage""]");

            //Act


            if (form != null)
            {
                textField.Value = "aaaaaaaaaaaaaaaaaaaaaaaaa";
                await form.SubmitAsync(submitButton);
            }
            //Arrange

            Assert.Equal(HttpStatusCode.OK, page.StatusCode);
        }
        public async Task SinkBeforeNestedContentWithNestedEntries_ShouldPrintTheNestedEntriesEvenThoughTheSinkHasBeenDeclaredBeforeTheRenderBodyFunction()
        {
            // Arrange
            var page1 = await _client.GetAsync("/Test/SinkBeforeNestedContentWithNestedEntriesTest");

            var content = await HtmlHelpers.GetDocumentAsync(page1);

            var scripts = HtmlHelpers.GetScripts(content);
            var links   = HtmlHelpers.GetLinks(content);

            // Act

            // Assert
            Assert.Equal(2, scripts.Count);

            Assert.Single(scripts,
                          script =>
                          script.Source.Contains("page-a"));

            Assert.Single(scripts,
                          script =>
                          script.Source.Contains("page-b"));
        }
        public async Task CanLogin()
        {
            var client = Factory.CreateClient();

            // Act
            var loginPage = await client.GetAsync("/Identity/Account/Login");

            Assert.Equal(HttpStatusCode.OK, loginPage.StatusCode);
            var loginPageHtml = await HtmlHelpers.GetDocumentAsync(loginPage);

            var profileWithUserName = await client.SendAsync(
                (IHtmlFormElement)loginPageHtml.QuerySelector("#account"),
                new Dictionary <string, string> {
                ["Input_Email"] = "*****@*****.**", ["Input_Password"] = "******"
            });

            Assert.Equal(HttpStatusCode.OK, profileWithUserName.StatusCode);
            var profileWithUserHtml = await HtmlHelpers.GetDocumentAsync(profileWithUserName);

            var userLogin = profileWithUserHtml.QuerySelector("#logoutForm a");

            Assert.Equal("Hello [email protected]!", userLogin.TextContent);
        }
        public async Task Post_AddMessageHandler_ReturnsSuccess_WhenMissingMessageText()
        {
            // Arrange
            var defaultPage = await _client.GetAsync("/");

            var content = await HtmlHelpers.GetDocumentAsync(defaultPage);

            var messageText = string.Empty;

            // Act
            var response = await _client.SendAsync(
                (IHtmlFormElement)content.QuerySelector("form[id='addMessage']"),
                (IHtmlButtonElement)content.QuerySelector("button[id='addMessageBtn']"),
                new Dictionary <string, string> {
                ["Message.Text"] = messageText
            });

            // Assert
            Assert.Equal(HttpStatusCode.OK, defaultPage.StatusCode);
            // A ModelState failure returns to Page (200-OK) and doesn't redirect.
            response.EnsureSuccessStatusCode();
            Assert.Null(response.Headers.Location?.OriginalString);
        }
        public async Task Get_QuoteService_ProvidesQuoteInPage()
        {
            // Arrange
            var client = _factory.WithWebHostBuilder(builder =>
            {
                builder.ConfigureTestServices(services =>
                {
                    services.AddScoped <IQuoteService, TestQuoteService>();
                });
            })
                         .CreateClient();

            //Act
            var defaultPage = await client.GetAsync("/");

            var content = await HtmlHelpers.GetDocumentAsync(defaultPage);

            var quoteElement = content.QuerySelector("#quote");

            // Assert
            Assert.Equal("Something's interfering with time, Mr. Scarman, " +
                         "and time is my business.", quoteElement.Attributes["value"].Value);
        }
Exemple #6
0
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client = _factory.CreateClient();

            var response = await client.GetAsync($"/remove-venue/{VenueId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var postcode = "CV1 2WT";

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"Remove {postcode}? - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be($"Are you sure you want to remove {postcode}?");

            var backLink = documentHtml.GetElementById("tl-back") as IHtmlAnchorElement;

            backLink.Text.Should().Be("Back");
            backLink.PathName.Should().Be("/get-admin-back-link/0");

            var removeButton = documentHtml.GetElementById("tl-remove") as IHtmlButtonElement;

            removeButton.TextContent.Should().Be("Remove venue");
            removeButton.Type.Should().Be("submit");

            var cancelLink = documentHtml.GetElementById("tl-cancel") as IHtmlAnchorElement;

            cancelLink.Text.Should().Be("Cancel and return to venue overview");
            cancelLink.PathName.Should().Be($"/venue-overview/{VenueId}");
        }
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client = _factory.CreateClient();

            var response = await client.GetAsync("/find-providers");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8", response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var cancelLink = documentHtml.GetElementById("tl-finish") as IHtmlAnchorElement;

            cancelLink.PathName.Should().Be($"/remove-opportunityItem/{OpportunityId}-{OpportunityItemId}");

            var routeList = documentHtml.GetElementById("SelectedRouteId");

            routeList.Children.Length.Should().Be(2);
            routeList.Text().Should().Be("Agriculture, environmental and animal care\nBusiness and administration\n");

            var postcode = documentHtml.GetElementById("Postcode");

            postcode.Should().NotBeNull();

            var search = documentHtml.GetElementById("tl-search") as IHtmlButtonElement;

            search.TextContent.Should().Be("Search");
            search.Type.Should().Be("submit");
        }
        public async Task GetAllEmployeeDetails()
        {
            // Arange
            string url = "/employee/details/26";

            // Act
            HttpResponseMessage response = await _client.GetAsync(url);

            // Assert
            response.EnsureSuccessStatusCode(); // Status Code 200-299
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            IHtmlDocument detailPage = await HtmlHelpers.GetDocumentAsync(response);

            IHtmlCollection <IElement> dds = detailPage.QuerySelectorAll("dd");

            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Jeff");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Santos");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Accounting");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Dell");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Cool Comp");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Eff You");
        }
Exemple #9
0
        public async Task Detail_GetAllDepartmentDeatil()
        {
            // Arrange
            string url = "/department/Details/1";


            // Act
            HttpResponseMessage response = await _client.GetAsync(url);

            // Assert
            response.EnsureSuccessStatusCode(); // Status Code 200-299
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            IHtmlDocument indexPage = await HtmlHelpers.GetDocumentAsync(response);

            IHtmlCollection <IElement> tds = indexPage.QuerySelectorAll("td");

            Assert.Contains(tds, td => td.TextContent.Trim() == "FirstName1");
            Assert.Contains(tds, td => td.TextContent.Trim() == "LastName1");
            IHtmlCollection <IElement> dds = indexPage.QuerySelectorAll("dd");

            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Accounting");
        }
Exemple #10
0
        public async Task Get_DetailReturnsSuccessAndCorrectContentType()
        {
            // Arrange
            string url = "/employee/details/4";

            // Act
            HttpResponseMessage response = await _client.GetAsync(url);

            // Assert
            response.EnsureSuccessStatusCode(); // Status Code 200-299
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            IHtmlDocument employeeDetailsPage = await HtmlHelpers.GetDocumentAsync(response);

            IHtmlCollection <IElement> dds = employeeDetailsPage.QuerySelectorAll("dd");

            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Kelly");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Cool");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Sales");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Mac Book Pro");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Apple");
            Assert.Contains(dds, dd => dd.TextContent.Trim() == "Party Training");
        }
Exemple #11
0
        public async void Post_DeletePage_ValidPost_ReturnsRedirectToBlogIndex()
        {
            /*  This test deletes a blog post from the database. To isolate the changes from the remainder of
             *  the test suite, we need to use WebHostBuilder to create a new application instance. */
            var client = clientFromWebHostBuilder();

            /*  GET the "delete" page first, just like a web browser would.
             *  We need this for the validation token and anti-forgery cookie */
            var defaultPage = await client.GetAsync("/Blog/Delete?id=1");

            var content = await HtmlHelpers.GetDocumentAsync(defaultPage);

            var response = await client.SendAsync(
                (IHtmlFormElement)content.QuerySelector("form"),
                (IHtmlInputElement)content.QuerySelector("input[type='submit']"),
                new Dictionary <string, string>
            {
                ["BlogPost.Id"] = "1"
            });

            Assert.Equal(HttpStatusCode.OK, defaultPage.StatusCode);
            Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
            Assert.Equal("/Blog", response.Headers.Location.OriginalString);
        }
Exemple #12
0
        public async Task TrainingProvider_CorrectlyDisplaysRecruitButton(string accountId)
        {
            var client = BuildClient();

            var response = await client.GetAsync($"accounts/{accountId}/apprenticeships/");

            var content = await HtmlHelpers.GetDocumentAsync(response);

            var recruitButtonElements = content.QuerySelectorAll(".recruit-button");
            var recruitLinkElements   = content.QuerySelectorAll(".recruit-link");

            if (accountId == "ACCOUNT_WITH_LEGAL_ENTITIES")
            {
                // Test returns 3 apprenticeships: 1 with no providers, 2 with Providers
                Assert.Equal(1, recruitButtonElements.Count());
                Assert.Equal(2, recruitLinkElements.Count());
            }

            if (accountId == "ACCOUNT_WITHOUT_LEGAL_ENTITIES")
            {
                Assert.Empty(recruitButtonElements);
                Assert.Empty(recruitLinkElements);
            }
        }
        public async Task HomePageIncludesForecast_ForExpactations(
            bool globalEnabled, bool pageEnabled, bool shouldShow)
        {
            var client = Factory.WithWebHostBuilder(builder =>
            {
                builder.ConfigureAppConfiguration((context, config) =>
                {
                    config.AddInMemoryCollection(new Dictionary <string, string>
                    {
                        { "Features:WeatherForecasting:EnableWeatherForecast", globalEnabled.ToString() },
                        { "Features:HomePage:EnableWeatherForecast", pageEnabled.ToString() },
                    });
                });
            }).CreateClient();

            var response = await client.GetAsync("/");

            using var content = await HtmlHelpers.GetDocumentAsync(response);

            var forecastDiv = content.All
                              .SingleOrDefault(e => e.Id == "weather-forecast" && e.LocalName == TagNames.Div);

            Assert.Equal(shouldShow, forecastDiv != null);
        }
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client = _factory.CreateClient();

            var response = await client.GetAsync($"/provider-results-for-opportunity-{OpportunityId}-item-{OpportunityItemId}-within-30-miles-of-CV1%202WT-for-route-{RouteId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var backLink = documentHtml.GetElementById("tl-back") as IHtmlAnchorElement;

            backLink.Text.Should().Be("Back");
            backLink.PathName.Should().Be($"/get-back-link/{OpportunityId}/{OpportunityItemId}/CV1%202WT/{RouteId}");

            var cancelLink = documentHtml.GetElementById("tl-finish") as IHtmlAnchorElement;

            cancelLink.PathName.Should().Be($"/remove-opportunityItem/{OpportunityId}-{OpportunityItemId}");

            var routeList = documentHtml.GetElementById("SelectedRouteId");

            routeList.Children.Length.Should().Be(2);
            routeList.TextContent.Should().Be("Agriculture, environmental and animal care\nBusiness and administration\n");

            var postcode = documentHtml.GetElementById("Postcode") as IHtmlInputElement;

            postcode.Value.Should().Be("CV1 2WT");

            var searchButton = documentHtml.GetElementById("tl-search") as IHtmlButtonElement;

            searchButton.TextContent.Should().Be("Search again");
            searchButton.Value.Should().Be("searchAgain");
            searchButton.Type.Should().Be("submit");

            var searchCount = documentHtml.GetElementById("tl-search-count");

            searchCount.TextContent.Should().Be("2");

            var searchSkillArea = documentHtml.GetElementById("tl-search-skillarea");

            searchSkillArea.TextContent.Should().Be("Agriculture, environmental and animal care");

            var searchPostcode = documentHtml.GetElementById("tl-search-postcode");

            searchPostcode.TextContent.Should().Be("CV1 2WT");

            var noProvidersLink = documentHtml.GetElementById("tl-search-nosuitable") as IHtmlAnchorElement;

            noProvidersLink.Text.Should().Be("No suitable providers? Let us know");
            noProvidersLink.PathName.Should().Be($"/2-provisiongap-opportunities-within-30-miles-of-CV1%202WT-for-route-{RouteId}");

            var searchResults = documentHtml.QuerySelector(".tl-search-results") as IHtmlOrderedListElement;

            AssertSearchResult(searchResults, 0);

            var continueButton = documentHtml.GetElementById("tl-continue") as IHtmlButtonElement;

            continueButton.TextContent.Should().Be("Continue with selected providers");
            continueButton.Type.Should().Be("submit");
        }
Exemple #15
0
        public async Task Post_SendsEmail()
        {
            var emailService = new FakeEmailService();

            // cookie would have been reattached as using CreateClient
            var client = _factory.WithWebHostBuilder(builder =>
            {
                builder.ConfigureTestServices(services =>
                {
                    services.AddSingleton <IEmailService>(emailService);
                });
            }).CreateClient();

            // this code below will result in a 400BadRequest
            // as we have not dealt with XSS Antiforgery tokens
            // CSRF - Cross-Site Request Forgery
            //var request = new HttpRequestmessage(HttpMethod.Post, "/enquiry")
            //{
            //    Content = new StringContent("[email protected]&subject=Test message&message=This is a message.")
            //};

            //request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

            //var response = await client.SendAsync(request);

            //response.AssertOk();


            // by requesting the page we will get the anti forgery token
            var getResponse = await client.GetAsync("/enquiry");

            using var content = await HtmlHelpers.GetDocumentAsync(getResponse);

            // get the form (whioh includes the hidden field with the token)
            var form = (IHtmlFormElement)content.QuerySelector("form");

            if (form["Email"] is IHtmlInputElement email)
            {
                email.Value = "*****@*****.**";
            }

            if (form["Subject"] is IHtmlInputElement subject)
            {
                subject.Value = "Testing";
            }

            if (form["Message"] is IHtmlTextAreaElement message)
            {
                message.Value = "This is a test message.";
            }

            var button         = (IHtmlButtonElement)content.QuerySelector("button");
            var formSubmission = form.GetSubmission(button);

            // need to extract the bits we need to do our test submission
            var target = (Uri)formSubmission.Target;

            var request = new HttpRequestMessage(new HttpMethod(formSubmission.Method.ToString()), target)
            {
                Content = new StreamContent(formSubmission.Body)
            };

            request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

            var response = await client.SendAsync(request);

            response.AssertOk();

            Assert.Single(emailService.SentEmails);
        }
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client   = _factory.CreateClient();
            var response = await client.GetAsync($"check-answers/{OpportunityItemId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var employerName = documentHtml.QuerySelector(".govuk-caption-l");

            employerName.TextContent.Should().Be("Company Name");

            //var backLink = documentHtml.GetElementById("tl-back") as IHtmlAnchorElement;
            //backLink.Text.Should().Be("Back");
            //backLink.PathName.Should().Be($"/get-placement-or-employer/{OpportunityId}-{OpportunityItemId}");

            var cancelLink = documentHtml.GetElementById("tl-finish") as IHtmlAnchorElement;

            cancelLink.PathName.Should().Be($"/remove-opportunityItem/{OpportunityId}-{OpportunityItemId}");

            var providerResultsUrl =
                $"/provider-results-for-opportunity-{OpportunityId}-item-{OpportunityItemId}-within-30-miles-of-SW1A%202AA-for-route-1";

            var placementInformationTable = documentHtml.GetElementById("tl-placement-table") as IHtmlElement;

            var placementKey = placementInformationTable.GetElementsByClassName("govuk-summary-list__key");

            placementKey[0].InnerHtml.Trim().Should().Be("Skill area");
            placementKey[1].InnerHtml.Trim().Should().Be("Postcode of workplace");
            placementKey[2].InnerHtml.Trim().Should().Be("Job role");
            placementKey[3].InnerHtml.Trim().Should().Be("Students wanted");

            var placementValue = placementInformationTable.GetElementsByClassName("govuk-summary-list__value");

            placementValue[0].InnerHtml.Trim().Should().Be("Agriculture, environmental and animal care");
            placementValue[1].InnerHtml.Trim().Should().Be("SW1A 2AA");
            placementValue[2].InnerHtml.Trim().Should().Be("Job Role");
            placementValue[3].InnerHtml.Trim().Should().Be("1");

            var placementActions = placementInformationTable.GetElementsByClassName("govuk-link");

            placementActions[0].TextContent.Should().Be("Change the type of placement");
            placementActions[1].TextContent.Should().Be("Change the postcode of the workplace");
            placementActions[2].TextContent.Should().Be("Change the job role");
            placementActions[3].TextContent.Should().Be("Change the number of placements");

            var changeProvidersLink = documentHtml.GetElementById("tl-change-providers") as IHtmlAnchorElement;

            changeProvidersLink.TextContent.Should().Be("Change providers");
            changeProvidersLink.PathName.Should().Be(providerResultsUrl);

            var confirmButton = documentHtml.GetElementById("tl-confirm") as IHtmlButtonElement;

            confirmButton.TextContent.Should().Be("Confirm and save opportunity");
            confirmButton.Type.Should().Be("submit");
        }
Exemple #17
0
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client   = _factory.CreateClient();
            var response = await client.GetAsync($"employer-opportunities/{OpportunityId}-{OpportunityItem1Id}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var employerName = documentHtml.QuerySelector(".govuk-caption-l");

            employerName.TextContent.Should().Be("Company Name");

            var saveLink = documentHtml.GetElementById("tl-save") as IHtmlAnchorElement;

            saveLink.Text.Should().Be("Save and come back later");
            saveLink.PathName.Should().Be($"/saved-opportunities");

            var basketTable = documentHtml.QuerySelector(".govuk-table") as IHtmlTableElement;

            basketTable.Head.Rows.Length.Should().Be(1);
            basketTable.Head.Rows[0].Cells[1].TextContent.Should().Be("Workplace");
            basketTable.Head.Rows[0].Cells[2].TextContent.Should().Be("Job role");
            basketTable.Head.Rows[0].Cells[3].TextContent.Should().Be("Students wanted");
            basketTable.Head.Rows[0].Cells[4].TextContent.Should().Be("Providers");

            var basketTableBody = basketTable.Bodies[0];

            basketTableBody.Rows.Length.Should().Be(2);

            AssertTableRow(basketTableBody.Rows[0],
                           "London SW1A 2AA",
                           "Job Role",
                           "1",
                           "Venue 1 Name (CV1 2WT), Venue 2 Name (CV1 1EE)",
                           OpportunityItem1Id);

            AssertTableRow(basketTableBody.Rows[1],
                           "London SW2A 3AA",
                           "Job Role",
                           "1",
                           "Venue 1 Name (CV1 2WT)",
                           OpportunityItem2Id);

            var addAnotherLink = documentHtml.GetElementById("tl-add-another-opportunity") as IHtmlAnchorElement;

            addAnotherLink.Text.Should().Be("Add another opportunity");
            addAnotherLink.PathName.Should().Be($"/find-providers/{OpportunityId}");

            var continueButton = documentHtml.GetElementById("tl-continue") as IHtmlButtonElement;

            continueButton.Name.Should().Be("SubmitAction");
            continueButton.Value.Should().Be("SaveSelectedOpportunities");
            continueButton.TextContent.Should().Be("Continue with selected opportunities");

            var downloadLink = documentHtml.GetElementById("tl-download") as IHtmlAnchorElement;

            downloadLink.Text.Should().Be("Download all data as a spreadsheet");
            downloadLink.PathName.Should().Be($"/download-opportunity/{OpportunityId}");
        }
        public async Task CreateRole()
        {
            var client = _factory.CreateClient();

            // Arrange
            var defaultPage = await client.GetAsync("/roles/Create");

            defaultPage.EnsureSuccessStatusCode();
            var content = await HtmlHelpers.GetDocumentAsync(defaultPage);

            //Act
            var roleName = "Role" + DateTime.Now.ToFileTime();
            var response = await client.SendAsync(
                (IHtmlFormElement)content.QuerySelector("form[action=\"/roles/Create\"]"),
                (IHtmlButtonElement)
                content.GetElementById("SubmitCreate"),
                new Dictionary <string, string>
            {
                { "Name", roleName }
            });

            var responseString = await response.Content.ReadAsStringAsync();

            // Assert
            responseString.Should().NotContain("already exists");
            responseString.Should().NotContain("Invalid");
            responseString.Should().NotContain("AppData");
            responseString.Should().NotContain("invalid");
            response.RequestMessage.RequestUri.AbsolutePath.Should().Be("/roles");
            response.IsSuccessStatusCode.Should().BeTrue("because {0} does not indicate success", response.StatusCode,
                                                         response.ReasonPhrase);

            responseString.Should()
            .Contain(roleName, "because we expect the role to be in the list after it's created");
            var listcontent = await HtmlHelpers.GetDocumentAsync(response);

            var editUrl  = listcontent.All.OfType <IHtmlAnchorElement>().First(a => a.Href.Contains("/roles/Edit/")).Href;
            var editPage = await client.GetAsync(editUrl);

            editPage.EnsureSuccessStatusCode();
            var editPageContent = await HtmlHelpers.GetDocumentAsync(editPage);

            var html = await editPage.Content.ReadAsStringAsync();

            var form             = editPageContent.All.OfType <IHtmlFormElement>().Last();
            var newRoleName      = roleName + DateTime.Now.ToFileTime();
            var editPageResponse = await client.SendAsync(
                form,
                (IHtmlButtonElement)editPageContent.GetElementById("Button_Save"),
                new Dictionary <string, string>
            {
                { "Id", "1223123" },
                { "Name", newRoleName },
                { "NormalizedName", newRoleName },
                { "ConcurrencyStamp", newRoleName }
            });

            responseString = await editPageResponse.Content.ReadAsStringAsync();

            editPageResponse.RequestMessage.RequestUri.AbsolutePath.Should().Be("/roles");

            //responseString.Should().Contain("Id");
            //responseString.Should().Contain("Name");
            //responseString.Should().Contain("NormalizedName");
            //responseString.Should().Contain("ConcurrencyStamp");
        }
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client = _factory.CreateClient();

            var response = await client.GetAsync($"/provider-overview/{ProviderId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should()
            .Be("\n                UKPRN: 10203040\n                SQL Search Provider\n            ");
            header1.Children[0].TextContent.Should().Be("UKPRN: 10203040");

            var backLink = documentHtml.GetElementById("tl-back") as IHtmlAnchorElement;

            backLink.Text.Should().Be("Back");
            backLink.PathName.Should().Be("/search-ukprn");

            var cdfYes = documentHtml.GetElementById("cdf-yes") as IHtmlInputElement;

            cdfYes.Value.Should().Be("true");
            var cdfNo = documentHtml.GetElementById("cdf-no") as IHtmlInputElement;

            cdfNo.Value.Should().Be("false");

            var saveSectionButton = documentHtml.GetElementById("tl-save-section") as IHtmlButtonElement;

            saveSectionButton.TextContent.Should().Be("Save");
            saveSectionButton.Type.Should().Be("submit");
            saveSectionButton.Name.Should().Be("SubmitAction");
            saveSectionButton.Value.Should().Be("SaveSection");

            var placementsYes = documentHtml.GetElementById("placements-yes") as IHtmlInputElement;

            placementsYes.Value.Should().Be("true");
            var placementsNo = documentHtml.GetElementById("placements-no") as IHtmlInputElement;

            placementsNo.Value.Should().Be("false");

            var tLevelYes = documentHtml.GetElementById("tlevel-yes") as IHtmlInputElement;

            tLevelYes.Value.Should().Be("true");
            var tLevelNo = documentHtml.GetElementById("tlevel-no") as IHtmlInputElement;

            tLevelNo.Value.Should().Be("false");

            var displayName = documentHtml.GetElementById("DisplayName") as IHtmlInputElement;

            displayName.Value.Should().Be("SQL Search Provider Display Name");

            var primaryContact = documentHtml.GetElementById("PrimaryContact") as IHtmlInputElement;

            primaryContact.Value.Should().Be("Test");

            var primaryContactEmail = documentHtml.GetElementById("PrimaryContactEmail") as IHtmlInputElement;

            primaryContactEmail.Value.Should().Be("*****@*****.**");

            var primaryContactPhone = documentHtml.GetElementById("PrimaryContactPhone") as IHtmlInputElement;

            primaryContactPhone.Value.Should().Be("0123456789");

            var secondaryContact = documentHtml.GetElementById("SecondaryContact") as IHtmlInputElement;

            secondaryContact.Value.Should().Be("Test 2");

            var secondaryContactEmail = documentHtml.GetElementById("SecondaryContactEmail") as IHtmlInputElement;

            secondaryContactEmail.Value.Should().Be("*****@*****.**");

            var secondaryContactPhone = documentHtml.GetElementById("SecondaryContactPhone") as IHtmlInputElement;

            secondaryContactPhone.Value.Should().Be("0987654321");

            var venueTable = documentHtml.QuerySelector(".govuk-table") as IHtmlTableElement;

            venueTable.Head.Rows.Length.Should().Be(1);
            venueTable.Head.Rows[0].Cells[0].TextContent.Should().Be("Postcode");
            venueTable.Head.Rows[0].Cells[1].TextContent.Should().Be("Number of qualifications");
            venueTable.Head.Rows[0].Cells[2].TextContent.Should().Be("Help finding placements");
            venueTable.Head.Rows[0].Cells[3].TextContent.Should().BeEmpty();

            var venueTableBody = venueTable.Bodies[0];

            venueTableBody.Rows.Length.Should().Be(2);

            AssertTableRow(venueTableBody.Rows[0],
                           "CV1 1EE",
                           "1",
                           "Yes",
                           2,
                           1);

            AssertTableRow(venueTableBody.Rows[1],
                           "CV1 2WT",
                           "1",
                           "Yes",
                           1,
                           1);

            var addVenueLink = documentHtml.GetElementById("tl-add-venue") as IHtmlAnchorElement;

            addVenueLink.Text.Should().Be("Add a venue");
            addVenueLink.PathName.Should().Be($"/add-venue/{ProviderId}");

            var saveAndFinishButton = documentHtml.GetElementById("tl-save-finish") as IHtmlButtonElement;

            saveAndFinishButton.TextContent.Should().Be("Save and finish");
            saveAndFinishButton.Type.Should().Be("submit");
            saveAndFinishButton.Name.Should().Be("SubmitAction");
            saveAndFinishButton.Value.Should().Be("SaveAndFinish");
        }
        public async Task Then_Correct_Response_With_RemoveLink_For_Providers_Is_Returned()
        {
            var client   = _factory.CreateClient();
            var response = await client.GetAsync($"check-answers/{OpportunityItemProviderMultipleId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var employerName = documentHtml.QuerySelector(".govuk-caption-l");

            employerName.TextContent.Should().Be("Company Name");

            var providerResultsUrl =
                $"/provider-results-for-opportunity-{OpportunityProviderMultipleId}-item-{OpportunityItemProviderMultipleId}-within-30-miles-of-SW1A%202AA-for-route-1";

            var placementInformationTable = documentHtml.GetElementById("tl-placement-table") as IHtmlElement;

            var placementKey     = placementInformationTable.GetElementsByClassName("govuk-summary-list__key");
            var placementValue   = placementInformationTable.GetElementsByClassName("govuk-summary-list__value");
            var placementActions = placementInformationTable.GetElementsByClassName("govuk-link");

            placementKey[0].InnerHtml.Trim().Should().Be("Skill area");
            placementKey[1].InnerHtml.Trim().Should().Be("Postcode of workplace");
            placementKey[2].InnerHtml.Trim().Should().Be("Job role");
            placementKey[3].InnerHtml.Trim().Should().Be("Students wanted");

            placementValue[0].InnerHtml.Trim().Should().Be("Agriculture, environmental and animal care");
            placementValue[1].InnerHtml.Trim().Should().Be("SW1A 2AA");
            placementValue[2].InnerHtml.Trim().Should().Be("Job Role");
            placementValue[3].InnerHtml.Trim().Should().Be("1");

            placementActions[0].TextContent.Should().Be("Change the type of placement");
            placementActions[1].TextContent.Should().Be("Change the postcode of the workplace");
            placementActions[2].TextContent.Should().Be("Change the job role");
            placementActions[3].TextContent.Should().Be("Change the number of placements");

            // Assert Provider Information with Remove Link

            var providerTable = documentHtml.GetElementById("tl-providers-table");

            var providerKey     = providerTable.GetElementsByClassName("govuk-summary-list__key");
            var providerValue   = providerTable.GetElementsByClassName("govuk-summary-list__value");
            var providerActions = providerTable.GetElementsByClassName("govuk-link");

            providerKey[0].InnerHtml.Trim().Should().Be("Venue 1 Name (CV1 2WT)");
            providerKey[1].InnerHtml.Trim().Should().Be("Venue 2 Name (CV1 1EE)");

            providerValue[0].InnerHtml.Trim().Should().Be("1.2 miles from SW1A 2AA");
            providerValue[1].InnerHtml.Trim().Should().Be("2.9 miles from SW1A 2AA");

            providerActions.Select(x => x.TextContent).Should().BeEquivalentTo(new[] { "Remove", "Remove" });

            var changeProvidersLink = documentHtml.QuerySelector("#tl-change-providers") as IHtmlAnchorElement;

            changeProvidersLink.TextContent.Should().Be("Change providers");
            changeProvidersLink.PathName.Should().Be(providerResultsUrl);
        }
        public async Task Post_EditWillUpdateEmployee()
        {
            // Arrange
            Employee   employee   = (await GetAllEmloyees()).First();
            Department department = (await GetAllDepartments()).Last();

            string url = $"employee/edit/{employee.Id}";
            HttpResponseMessage editPageResponse = await _client.GetAsync(url);

            IHtmlDocument editPage = await HtmlHelpers.GetDocumentAsync(editPageResponse);

            string firstName = StringHelpers.EnsureMaxLength(
                employee.FirstName + Guid.NewGuid().ToString(), 55);
            string lastName = StringHelpers.EnsureMaxLength(
                employee.LastName + Guid.NewGuid().ToString(), 55);
            string isSupervisor   = employee.IsSupervisor ? "false" : "true";
            string departmentId   = department.Id.ToString();
            string departmentName = department.Name;


            // Act
            HttpResponseMessage response = await _client.SendAsync(
                editPage,
                new Dictionary <string, string>
            {
                { "Employee_FirstName", firstName },
                { "Employee_LastName", lastName },
                { "Employee_IsSupervisor", isSupervisor },
                { "Employee_DepartmentId", departmentId }
            });


            // Assert
            response.EnsureSuccessStatusCode();

            IHtmlDocument indexPage = await HtmlHelpers.GetDocumentAsync(response);

            var lastRow = indexPage.QuerySelector("tbody tr:first-child");

            Assert.Contains(
                lastRow.QuerySelectorAll("td"),
                td => td.TextContent.Contains(firstName));
            Assert.Contains(
                lastRow.QuerySelectorAll("td"),
                td => td.TextContent.Contains(lastName));
            Assert.Contains(
                lastRow.QuerySelectorAll("td"),
                td => td.TextContent.Contains(departmentName));

            /*
             * IHtmlInputElement cb = (IHtmlInputElement)lastRow.QuerySelector("input[type='checkbox']");
             * if (isSupervisor == "true")
             * {
             *  Assert.True(cb.IsChecked);
             * }
             * else
             * {
             *  Assert.False(cb.IsChecked);
             * }
             */
        }
Exemple #22
0
        public async Task FirstUserLoginCycle()
        {
            await ExecuteBeerIdentityContextAwareTest(async (builder, context) =>
            {
                String redirectUrl       = "/BlubAction/242525?test=true";
                String username          = "******";
                String password          = "******";
                String displayname       = "A new user";
                String profilePictureUrl = "/img/pp/dogface-6.png";

                var client = GetClientWithAnonymousUser(builder, new WebApplicationFactoryClientOptions
                {
                    AllowAutoRedirect = false,
                });

                var firstLoginGetResponse = await client.GetAsync($"/Account/Login?returnUrl={redirectUrl}");
                Uri locationHeader        = CheckRedirectResult(firstLoginGetResponse, new Uri($"/Account/CreateFirstUser?returnUrl={WebUtility.UrlEncode(redirectUrl)}", UriKind.Relative));

                var createFirstUserResponse = await client.GetAsync(locationHeader);
                Assert.True(createFirstUserResponse.IsSuccessStatusCode);
                Assert.Equal(HttpStatusCode.OK, createFirstUserResponse.StatusCode);

                var createFirstUserContent = await HtmlHelpers.GetDocumentAsync(createFirstUserResponse);
                var createFirstUserForm    = (IHtmlFormElement)createFirstUserContent.QuerySelector("form[id='create-first-user']");
                Assert.NotNull(createFirstUserForm);
                //var pictureUrlValue =
                //((IHtmlSelectElement)createFirstUserContent.QuerySelector("select[id='ProfilePictureUrl']")).Options.ElementAt(3).Value;


                var createFirstUserPostResponse = await client.SendAsync(createFirstUserForm, new Dictionary <String, String>
                {
                    { nameof(CreateFirstIUserInputModel.Username), username },
                    { nameof(CreateFirstIUserInputModel.Password), password },
                    { nameof(CreateFirstIUserInputModel.PasswordConfirmation), password },
                    { nameof(CreateFirstIUserInputModel.DisplayName), displayname },
                    { nameof(CreateFirstIUserInputModel.ProfilePictureUrl), profilePictureUrl },
                });

                Uri createFistUserResponseHeaderLocation = CheckRedirectResult(createFirstUserPostResponse, new Uri($"/Account/Login?returnUrl={WebUtility.UrlEncode(redirectUrl)}", UriKind.Relative));
                var loginGetGetResponse = await client.GetAsync(createFistUserResponseHeaderLocation);

                var loginContent = await HtmlHelpers.GetDocumentAsync(loginGetGetResponse);
                var loginForm    = (IHtmlFormElement)loginContent.QuerySelector("form[id='login']");
                Assert.NotNull(loginForm);

                var loginPostResponse = await client.SendAsync(loginForm, new Dictionary <String, String>
                {
                    { nameof(LoginViewModel.Username), username },
                    { nameof(LoginViewModel.Password), password },
                    { nameof(LoginViewModel.RememberLogin), "true" },
                });

                Uri finalRedirect = CheckRedirectResult(loginPostResponse, new Uri(redirectUrl, UriKind.Relative));

                var user = context.Users.FirstOrDefault(x => x.UserName == username);

                Assert.NotNull(user);

                var claims = await context.UserClaims.Where(x => x.UserId == user.Id).ToListAsync();
                Assert.NotEmpty(claims);

                Assert.Equal(displayname, claims.First(x => x.ClaimType == CustomClaimTypes.DisplayClaimsType).ClaimValue);
                Assert.Equal(profilePictureUrl, claims.First(x => x.ClaimType == CustomClaimTypes.ProfilePictureUrl).ClaimValue);
            });
        }
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client   = _factory.CreateClient();
            var response = await client.GetAsync($"employer-opportunities/{OpportunityId}-{OpportunityItemId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var employerName = documentHtml.QuerySelector(".govuk-caption-l");

            employerName.TextContent.Should().Be("Company Name");

            var saveLink = documentHtml.GetElementById("tl-save") as IHtmlAnchorElement;

            saveLink.Text.Should().Be("Save and come back later");
            saveLink.PathName.Should().Be($"/saved-opportunities");

            var tabList     = documentHtml.QuerySelector(".govuk-tabs__list");
            var providerTab = tabList.Children[0] as IHtmlListItemElement;

            providerTab.Text().Should().Be("\n            \n                With providers\n            \n        ");

            var noProviderTab = tabList.Children[1] as IHtmlListItemElement;

            noProviderTab.Text().Should().Be("\n            \n                With no providers\n            \n        ");

            var providerBasketTable = documentHtml.QuerySelector("#providers .govuk-table") as IHtmlTableElement;

            providerBasketTable.Head.Rows.Length.Should().Be(1);
            providerBasketTable.Head.Rows[0].Cells[0].TextContent.Should().Be("Workplace");
            providerBasketTable.Head.Rows[0].Cells[1].TextContent.Should().Be("Job role");
            providerBasketTable.Head.Rows[0].Cells[2].TextContent.Should().Be("Students wanted");
            providerBasketTable.Head.Rows[0].Cells[3].TextContent.Should().Be("Providers");

            var providerBasketTableBody = providerBasketTable.Bodies[0];

            providerBasketTableBody.Rows.Length.Should().Be(1);
            providerBasketTableBody.Rows[0].Cells[0].TextContent.Should().Be("London SW1A 2AA");
            providerBasketTableBody.Rows[0].Cells[1].TextContent.Should().Be("Job Role");
            providerBasketTableBody.Rows[0].Cells[2].TextContent.Should().Be("1");
            providerBasketTableBody.Rows[0].Cells[3].TextContent.Should().Be("Venue 1 Name (CV1 2WT)");

            var providerEditCell = providerBasketTableBody.Rows[0].Cells[4].Children[0] as IHtmlAnchorElement;

            providerEditCell.Text.Should().Be("Edit");
            providerEditCell.PathName.Should().Be($"/check-answers/{OpportunityItemId}");

            var providerDeleteCell = providerBasketTableBody.Rows[0].Cells[5].Children[0] as IHtmlAnchorElement;

            providerDeleteCell.Text.Should().Be("Delete");
            providerDeleteCell.PathName.Should().Be($"/remove-opportunity/{OpportunityItemId}");

            var addAnotherLink = documentHtml.GetElementById("tl-add-another-opportunity") as IHtmlAnchorElement;

            addAnotherLink.Text.Should().Be("Add another opportunity");
            addAnotherLink.PathName.Should().Be($"/find-providers/{OpportunityId}");

            var continueButton = documentHtml.GetElementById("tl-continue") as IHtmlButtonElement;

            continueButton.Name.Should().Be("SubmitAction");
            continueButton.Value.Should().Be("SaveSelectedOpportunities");
            continueButton.TextContent.Should().Be("Continue with opportunity");

            var noProviderBasketTable = documentHtml.QuerySelector("#no-providers .govuk-table") as IHtmlTableElement;

            noProviderBasketTable.Head.Rows.Length.Should().Be(1);
            noProviderBasketTable.Head.Rows[0].Cells[0].TextContent.Should().Be("Workplace");
            noProviderBasketTable.Head.Rows[0].Cells[1].TextContent.Should().Be("Job role");
            noProviderBasketTable.Head.Rows[0].Cells[2].TextContent.Should().Be("Students wanted");
            noProviderBasketTable.Head.Rows[0].Cells[3].TextContent.Should().Be("Reason no providers chosen");

            var noProviderBasketTableBody = noProviderBasketTable.Bodies[0];

            noProviderBasketTableBody.Rows.Length.Should().Be(1);
            noProviderBasketTableBody.Rows[0].Cells[0].TextContent.Should().Be("London SW1A 2AA");
            noProviderBasketTableBody.Rows[0].Cells[1].TextContent.Should().Be("Job Role");
            noProviderBasketTableBody.Rows[0].Cells[2].TextContent.Should().Be("1");
            noProviderBasketTableBody.Rows[0].Cells[3].TextContent.Should().Be("Providers are too far away");

            var downloadLink = documentHtml.GetElementById("tl-download") as IHtmlAnchorElement;

            downloadLink.Text.Should().Be("Download all data as a spreadsheet");
            downloadLink.PathName.Should().Be($"/download-opportunity/{OpportunityId}");
        }
Exemple #24
0
        public async Task Post_SendsEmail()
        {
            var emailService = new FakeEmailService();

            var client = _factory.WithWebHostBuilder(builder =>
            {
                builder.ConfigureTestServices(services =>
                {
                    services.AddSingleton <IEmailService>(emailService);
                });
            }).CreateClient();

            //var request = new HttpRequestMessage(HttpMethod.Post, "/enquiry")
            //{
            //    Content = new StringContent("[email protected]&subject=Test message&message=This is a message.")
            //};

            //request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

            //var response = await client.SendAsync(request);

            //response.AssertOk();

            var getResponse = await client.GetAsync("/enquiry");

            using var content = await HtmlHelpers.GetDocumentAsync(getResponse);

            var form = (IHtmlFormElement)content.QuerySelector("form");

            if (form["Email"] is IHtmlInputElement email)
            {
                email.Value = "*****@*****.**";
            }

            if (form["Subject"] is IHtmlInputElement subject)
            {
                subject.Value = "Testing";
            }

            if (form["Message"] is IHtmlTextAreaElement message)
            {
                message.Value = "This is a test message.";
            }

            var button         = (IHtmlButtonElement)content.QuerySelector("button");
            var formSubmission = form.GetSubmission(button);

            var target = (Uri)formSubmission.Target;

            var request = new HttpRequestMessage(new HttpMethod(formSubmission.Method.ToString()), target)
            {
                Content = new StreamContent(formSubmission.Body)
            };

            request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

            var response = await client.SendAsync(request);

            response.AssertOk();

            Assert.Single(emailService.SentEmails);
        }
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client = _factory.CreateClient();

            var response = await client.GetAsync($"/missing-qualification/{VenueId}/{LarId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var backLink = documentHtml.GetElementById("tl-back") as IHtmlAnchorElement;

            backLink.Text.Should().Be("Back");
            backLink.PathName.Should().Be("/get-admin-back-link/1");

            var larId = documentHtml.GetElementById("tl-qualification-larid") as IHtmlParagraphElement;

            larId.TextContent.Should().Be("12345678");

            var title = documentHtml.GetElementById("tl-qualification-title") as IHtmlParagraphElement;

            title.TextContent.Should().Be("Qualification Title");

            var changeLink = documentHtml.GetElementById("tl-change") as IHtmlAnchorElement;

            changeLink.Text.Should().Be("Change qualification");
            changeLink.PathName.Should().Be($"/add-qualification/{VenueId}");

            var shortTitle = documentHtml.GetElementById("shortTitleHidden") as IHtmlInputElement;

            shortTitle.Value.Should().BeEmpty("Short Title");

            var skillAreas = documentHtml.QuerySelectorAll(".govuk-checkboxes__item");

            AssertSkillArea(skillAreas,
                            0,
                            1,
                            "Agriculture, environmental and animal care",
                            "Includes: animal care and management; agriculture, land management and production");

            AssertSkillArea(skillAreas,
                            1,
                            2,
                            "Business and administration",
                            "Includes: management and administration; human resources (HR)");

            var continueButton = documentHtml.GetElementById("tl-add") as IHtmlButtonElement;

            continueButton.TextContent.Should().Be("Add qualification");
            continueButton.Type.Should().Be("submit");
        }
Exemple #26
0
        public async Task Then_Correct_Response_Is_Returned()
        {
            // ReSharper disable all PossibleNullReferenceException

            var client = _factory.CreateClient();

            var response = await client.GetAsync($"/venue-overview/{VenueId}");

            response.EnsureSuccessStatusCode();
            Assert.Equal("text/html; charset=utf-8",
                         response.Content.Headers.ContentType.ToString());

            var documentHtml = await HtmlHelpers.GetDocumentAsync(response);

            documentHtml.Title.Should().Be($"{Title} - {Constants.ServiceName} - GOV.UK");

            var header1 = documentHtml.QuerySelector(".govuk-heading-l");

            header1.TextContent.Should().Be(Title);

            var backLink = documentHtml.GetElementById("tl-back") as IHtmlAnchorElement;

            backLink.Text.Should().Be("Back");
            backLink.PathName.Should().Be("/get-admin-back-link/1");

            var searchVisibleYes = documentHtml.GetElementById("search-visible-yes") as IHtmlInputElement;

            searchVisibleYes.Value.Should().Be("true");
            var searchVisibleNo = documentHtml.GetElementById("search-visible-no") as IHtmlInputElement;

            searchVisibleNo.Value.Should().Be("false");

            var providerId = documentHtml.GetElementById("ProviderId") as IHtmlInputElement;

            providerId.Type.Should().Be("hidden");
            providerId.Value.Should().Be("1");

            var source = documentHtml.GetElementById("Source") as IHtmlInputElement;

            source.Type.Should().Be("hidden");
            source.Value.Should().Be("Admin");

            var name = documentHtml.GetElementById("Name") as IHtmlInputElement;

            name.Value.Should().Be("Venue 1 Name");

            var removeLink = documentHtml.GetElementById("tl-remove") as IHtmlAnchorElement;

            removeLink.Text.Should().Be("Remove venue");
            removeLink.PathName.Should().Be("/remove-venue/1");

            var saveSectionButton = documentHtml.GetElementById("tl-save-section") as IHtmlButtonElement;

            saveSectionButton.TextContent.Should().Be("Save section");
            saveSectionButton.Type.Should().Be("submit");
            saveSectionButton.Name.Should().Be("SubmitAction");
            saveSectionButton.Value.Should().Be("SaveSection");

            var qualificationTable = documentHtml.QuerySelector(".govuk-table") as IHtmlTableElement;

            qualificationTable.Head.Rows.Length.Should().Be(1);
            qualificationTable.Head.Rows[0].Cells[0].TextContent.Should().Be("Learning aim reference");
            qualificationTable.Head.Rows[0].Cells[1].TextContent.Should().Be("Qualification title");
            qualificationTable.Head.Rows[0].Cells[2].TextContent.Should().BeEmpty();

            var qualificationTableBody = qualificationTable.Bodies[0];

            qualificationTableBody.Rows.Length.Should().Be(1);

            AssertTableRow(qualificationTableBody.Rows[0],
                           "12345678",
                           "Qualification Title",
                           1,
                           1);

            var addQualificationLink = documentHtml.GetElementById("tl-add-qualification") as IHtmlAnchorElement;

            addQualificationLink.Text.Should().Be("Add a qualification");
            addQualificationLink.PathName.Should().Be($"/add-qualification/{VenueId}");

            var saveAndFinishButton = documentHtml.GetElementById("tl-confirm") as IHtmlButtonElement;

            saveAndFinishButton.TextContent.Should().Be("Save and return to provider overview");
            saveAndFinishButton.Type.Should().Be("submit");
            saveAndFinishButton.Name.Should().Be("SubmitAction");
            saveAndFinishButton.Value.Should().Be("SaveAndFinish");
        }