Skip to content

Commit c02083b

Browse files
Condense url checks
1 parent 26898e3 commit c02083b

File tree

4 files changed

+87
-50
lines changed

4 files changed

+87
-50
lines changed

src/ProjectTemplates/test/EmptyWebTemplateTest.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ public async Task EmptyWebTemplateAsync(string languageOverride)
4545
using (var aspNetProcess = Project.StartBuiltProjectAsync())
4646
{
4747
Assert.False(
48-
aspNetProcess.Process.HasExited,
49-
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
48+
aspNetProcess.Process.HasExited,
49+
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
5050

51-
await aspNetProcess.AssertLinksWork("/");
51+
await aspNetProcess.AssertOk("/");
5252
}
5353

5454
using (var aspNetProcess = Project.StartPublishedProjectAsync())
@@ -57,7 +57,7 @@ public async Task EmptyWebTemplateAsync(string languageOverride)
5757
aspNetProcess.Process.HasExited,
5858
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process));
5959

60-
await aspNetProcess.AssertLinksWork("/");
60+
await aspNetProcess.AssertOk("/");
6161
}
6262
}
6363
}

src/ProjectTemplates/test/Helpers/AspNetProcess.cs

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,59 @@ public void VisitInBrowser(IWebDriver driver)
8585
}
8686
}
8787

88+
public async Task AssertPagesOk(IEnumerable<string> pages, IEnumerable<string> expectedLinks)
89+
{
90+
foreach (var page in pages)
91+
{
92+
await AssertOk(page);
93+
await ContainsLinks(page, expectedLinks);
94+
await ExternalLinksWork(page);
95+
}
96+
}
97+
98+
public async Task ContainsLinks(string requestUrl, IEnumerable<string> expectedLinks)
99+
{
100+
101+
var request = new HttpRequestMessage(
102+
HttpMethod.Get,
103+
new Uri(_listeningUri, requestUrl));
104+
105+
var response = await _httpClient.SendAsync(request);
106+
107+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
108+
var parser = new HtmlParser();
109+
var html = await parser.ParseAsync(await response.Content.ReadAsStreamAsync());
110+
foreach (var expectedLink in expectedLinks)
111+
{
112+
var containsLink = html.Links
113+
.Where(l => ((IHtmlAnchorElement)l).Protocol == "about:")
114+
.Any(l => string.Equals(expectedLink, ((IHtmlAnchorElement)l).PathName, StringComparison.InvariantCultureIgnoreCase));
115+
Assert.True(containsLink, $"{expectedLink} is not on {requestUrl}");
116+
}
117+
}
118+
119+
public async Task ExternalLinksWork(string requestUrl)
120+
{
121+
var request = new HttpRequestMessage(
122+
HttpMethod.Get,
123+
new Uri(_listeningUri, requestUrl));
124+
125+
var response = await _httpClient.SendAsync(request);
126+
127+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
128+
var parser = new HtmlParser();
129+
var html = await parser.ParseAsync(await response.Content.ReadAsStreamAsync());
130+
foreach (IHtmlAnchorElement link in html.Links)
131+
{
132+
// "about:" is a relative url, so this is only looking at external links
133+
if (link.Protocol != "about:")
134+
{
135+
var result = await _httpClient.GetAsync(link.Href);
136+
Assert.True(IsSuccessStatusCode(result), $"{link.Href} is a broken link!");
137+
}
138+
}
139+
}
140+
88141
private Uri GetListeningUri(ITestOutputHelper output)
89142
{
90143
// Wait until the app is accepting HTTP requests
@@ -113,31 +166,6 @@ private Uri GetListeningUri(ITestOutputHelper output)
113166
}
114167
}
115168

116-
public async Task AssertLinksWork(string requestUrl)
117-
{
118-
var request = new HttpRequestMessage(
119-
HttpMethod.Get,
120-
new Uri(_listeningUri, requestUrl));
121-
122-
var response = await _httpClient.SendAsync(request);
123-
124-
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
125-
var parser = new HtmlParser();
126-
var html = await parser.ParseAsync(await response.Content.ReadAsStreamAsync());
127-
foreach (IHtmlAnchorElement link in html.Links)
128-
{
129-
if(link.Protocol == "about:")
130-
{
131-
await AssertOk(link.PathName);
132-
}
133-
else
134-
{
135-
var result = await _httpClient.GetAsync(link.Href);
136-
Assert.True(IsSuccessStatusCode(result), $"{link.Href} is a broken link!");
137-
}
138-
}
139-
}
140-
141169
private bool IsSuccessStatusCode(HttpResponseMessage response)
142170
{
143171
return response.IsSuccessStatusCode || response.StatusCode == HttpStatusCode.Redirect;

src/ProjectTemplates/test/MvcTemplateTest.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,24 +55,23 @@ public async Task MvcTemplate_NoAuthImplAsync(string languageOverride)
5555
var buildResult = await Project.RunDotNetBuildAsync();
5656
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult));
5757

58+
var pages = new string[] { "/", "/Home/Privacy" };
5859
using (var aspNetProcess = Project.StartBuiltProjectAsync())
5960
{
6061
Assert.False(
6162
aspNetProcess.Process.HasExited,
6263
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
6364

64-
await aspNetProcess.AssertLinksWork("/");
65-
await aspNetProcess.AssertLinksWork("/Home/Privacy");
65+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
6666
}
67-
67+
6868
using (var aspNetProcess = Project.StartPublishedProjectAsync())
6969
{
7070
Assert.False(
7171
aspNetProcess.Process.HasExited,
7272
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process));
7373

74-
await aspNetProcess.AssertLinksWork("/");
75-
await aspNetProcess.AssertLinksWork("/Home/Privacy");
74+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
7675
}
7776
}
7877

@@ -110,18 +109,23 @@ public async Task MvcTemplate_IndividualAuthImplAsync(bool useLocalDB)
110109
Assert.True(0 == migrationsResult.ExitCode, ErrorMessages.GetFailedProcessMessage("run EF migrations", Project, migrationsResult));
111110
Project.AssertEmptyMigration("mvc");
112111

112+
var pages = new string[] { "/", "/Identity/Account/Login", "/Home/Privacy" };
113113
using (var aspNetProcess = Project.StartBuiltProjectAsync())
114114
{
115-
await aspNetProcess.AssertLinksWork("/");
116-
await aspNetProcess.AssertLinksWork("/Identity/Account/Login");
117-
await aspNetProcess.AssertLinksWork("/Home/Privacy");
115+
Assert.False(
116+
aspNetProcess.Process.HasExited,
117+
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
118+
119+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
118120
}
119121

120122
using (var aspNetProcess = Project.StartPublishedProjectAsync())
121123
{
122-
await aspNetProcess.AssertLinksWork("/");
123-
await aspNetProcess.AssertLinksWork("/Identity/Account/Login");
124-
await aspNetProcess.AssertLinksWork("/Home/Privacy");
124+
Assert.False(
125+
aspNetProcess.Process.HasExited,
126+
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process));
127+
128+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
125129
}
126130
}
127131

src/ProjectTemplates/test/RazorPagesTemplateTest.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ public async Task RazorPagesTemplate_NoAuthImplAsync()
5050
var buildResult = await Project.RunDotNetBuildAsync();
5151
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, createResult));
5252

53+
var pages = new string[] { "/", "/Privacy" };
5354
using (var aspNetProcess = Project.StartBuiltProjectAsync())
5455
{
5556
Assert.False(
5657
aspNetProcess.Process.HasExited,
5758
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
5859

59-
await aspNetProcess.AssertOk("/");
60-
await aspNetProcess.AssertOk("/Privacy");
60+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
6161
}
6262

6363
using (var aspNetProcess = Project.StartPublishedProjectAsync())
@@ -66,8 +66,7 @@ public async Task RazorPagesTemplate_NoAuthImplAsync()
6666
aspNetProcess.Process.HasExited,
6767
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process));
6868

69-
await aspNetProcess.AssertOk("/");
70-
await aspNetProcess.AssertOk("/Privacy");
69+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
7170
}
7271
}
7372

@@ -103,18 +102,24 @@ public async Task RazorPagesTemplate_IndividualAuthImplAsync(bool useLocalDB)
103102
Assert.True(0 == migrationsResult.ExitCode, ErrorMessages.GetFailedProcessMessage("run EF migrations", Project, migrationsResult));
104103
Project.AssertEmptyMigration("razorpages");
105104

105+
var pages = new string[] { "/", "/Identity/Account/Login", "/Privacy"};
106+
106107
using (var aspNetProcess = Project.StartBuiltProjectAsync())
107108
{
108-
await aspNetProcess.AssertOk("/");
109-
await aspNetProcess.AssertOk("/Identity/Account/Login");
110-
await aspNetProcess.AssertOk("/Privacy");
109+
Assert.False(
110+
aspNetProcess.Process.HasExited,
111+
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
112+
113+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
111114
}
112115

113116
using (var aspNetProcess = Project.StartPublishedProjectAsync())
114117
{
115-
await aspNetProcess.AssertOk("/");
116-
await aspNetProcess.AssertOk("/Identity/Account/Login");
117-
await aspNetProcess.AssertOk("/Privacy");
118+
Assert.False(
119+
aspNetProcess.Process.HasExited,
120+
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
121+
122+
await aspNetProcess.AssertPagesOk(pages, expectedLinks: pages);
118123
}
119124
}
120125

0 commit comments

Comments
 (0)