55using System . Collections . Generic ;
66using System . Linq ;
77using System . Net ;
8- using System . Runtime . InteropServices ;
98using System . Threading . Tasks ;
109using Microsoft . AspNetCore . BrowserTesting ;
1110using Microsoft . AspNetCore . Testing ;
1716
1817namespace Templates . Test
1918{
19+ [ TestCaseOrderer ( "Templates.Test.PriorityOrderer" , "BlazorTemplates.Tests" ) ]
2020 public class BlazorServerTemplateTest : BlazorTemplateTest
2121 {
22- public BlazorServerTemplateTest ( ProjectFactoryFixture projectFactory , PlaywrightFixture < BlazorServerTemplateTest > fixture , ITestOutputHelper output )
23- : base ( fixture )
22+ public BlazorServerTemplateTest ( ProjectFactoryFixture projectFactory )
23+ : base ( projectFactory )
2424 {
25- ProjectFactory = projectFactory ; ;
26- Output = output ;
27- BrowserContextInfo = new ContextInformation ( CreateFactory ( output ) ) ;
2825 }
2926
30- public ProjectFactoryFixture ProjectFactory { get ; set ; }
31- public ITestOutputHelper Output { get ; }
32- public ContextInformation BrowserContextInfo { get ; }
33- public Project Project { get ; private set ; }
27+ public override string ProjectType { get ; } = "blazorserver" ;
3428
29+ // This test is required to run before BlazorServerTemplateWorks_NoAuth to create and build the project
30+ // If this test is quarantined, BlazorServerTemplateWorks_NoAuth must be quarantined as well
31+ [ Fact , TestPriority ( BUILDCREATEPUBLISH_PRIORITY ) ]
32+ public Task BlazorServerTemplate_CreateBuildPublish_NoAuth ( )
33+ => CreateBuildPublishAsync ( "blazorservernoauth" + BrowserKind . Chromium . ToString ( ) ) ;
3534
35+ // This tests depends on BlazorServerTemplate_CreateBuildPublish_NoAuth running first
3636 [ Theory ]
3737 [ InlineData ( BrowserKind . Chromium ) ]
3838 [ QuarantinedTest ( "https://github.com/dotnet/aspnetcore/issues/30761" ) ]
3939 public async Task BlazorServerTemplateWorks_NoAuth ( BrowserKind browserKind )
4040 {
41- // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
42- Environment . SetEnvironmentVariable ( "EnableDefaultScopedCssItems" , "true" ) ;
41+ var project = await ProjectFactory . GetOrCreateProject ( "blazorservernoauth" + browserKind , Output ) ;
4342
44- Project = await ProjectFactory . GetOrCreateProject ( "blazorservernoauth" + browserKind . ToString ( ) , Output ) ;
45-
46- var createResult = await Project . RunDotNetNewAsync ( "blazorserver" ) ;
47- Assert . True ( 0 == createResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "create/restore" , Project , createResult ) ) ;
48-
49- var publishResult = await Project . RunDotNetPublishAsync ( ) ;
50- Assert . True ( 0 == publishResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "publish" , Project , publishResult ) ) ;
51-
52- // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
53- // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
54- // later, while the opposite is not true.
55-
56- var buildResult = await Project . RunDotNetBuildAsync ( ) ;
57- Assert . True ( 0 == buildResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "build" , Project , buildResult ) ) ;
58-
59- await using var browser = Fixture . BrowserManager . IsAvailable ( browserKind ) ?
60- await Fixture . BrowserManager . GetBrowserInstance ( browserKind , BrowserContextInfo ) :
43+ await using var browser = BrowserManager . IsAvailable ( browserKind ) ?
44+ await BrowserManager . GetBrowserInstance ( browserKind , BrowserContextInfo ) :
6145 null ;
6246
63- using ( var aspNetProcess = Project . StartBuiltProjectAsync ( ) )
47+ using ( var aspNetProcess = project . StartBuiltProjectAsync ( ) )
6448 {
6549 Assert . False (
6650 aspNetProcess . Process . HasExited ,
67- ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run built project" , Project , aspNetProcess . Process ) ) ;
51+ ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run built project" , project , aspNetProcess . Process ) ) ;
6852
6953 await aspNetProcess . AssertStatusCode ( "/" , HttpStatusCode . OK , "text/html" ) ;
7054
71- if ( Fixture . BrowserManager . IsAvailable ( browserKind ) )
55+ if ( BrowserManager . IsAvailable ( browserKind ) )
7256 {
7357 var page = await browser . NewPageAsync ( ) ;
7458 await aspNetProcess . VisitInBrowserAsync ( page ) ;
75- await TestBasicNavigation ( page ) ;
59+ await TestBasicNavigation ( project , page ) ;
7660 await page . CloseAsync ( ) ;
7761 }
7862 else
@@ -81,18 +65,18 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo)
8165 }
8266 }
8367
84- using ( var aspNetProcess = Project . StartPublishedProjectAsync ( ) )
68+ using ( var aspNetProcess = project . StartPublishedProjectAsync ( ) )
8569 {
8670 Assert . False (
8771 aspNetProcess . Process . HasExited ,
88- ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run published project" , Project , aspNetProcess . Process ) ) ;
72+ ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run published project" , project , aspNetProcess . Process ) ) ;
8973
9074 await aspNetProcess . AssertStatusCode ( "/" , HttpStatusCode . OK , "text/html" ) ;
91- if ( Fixture . BrowserManager . IsAvailable ( browserKind ) )
75+ if ( BrowserManager . IsAvailable ( browserKind ) )
9276 {
9377 var page = await browser . NewPageAsync ( ) ;
9478 await aspNetProcess . VisitInBrowserAsync ( page ) ;
95- await TestBasicNavigation ( page ) ;
79+ await TestBasicNavigation ( project , page ) ;
9680 await page . CloseAsync ( ) ;
9781 }
9882 else
@@ -102,49 +86,41 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo)
10286 }
10387 }
10488
89+ // This test is required to run before BlazorServerTemplateWorks_IndividualAuth to create and build the project
90+ // If this test is quarantined, BlazorServerTemplateWorks_IndividualAuth must be quarantined as well
91+ [ Theory , TestPriority ( BUILDCREATEPUBLISH_PRIORITY ) ]
92+ [ MemberData ( nameof ( BlazorServerTemplateWorks_IndividualAuthData ) ) ]
93+ public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuth ( BrowserKind browserKind , bool useLocalDB )
94+ => CreateBuildPublishAsync ( "blazorserverindividual" + browserKind + ( useLocalDB ? "uld" : "" ) ) ;
95+
10596 public static IEnumerable < object [ ] > BlazorServerTemplateWorks_IndividualAuthData =>
10697 BrowserManager . WithBrowsers ( new [ ] { BrowserKind . Chromium } , true , false ) ;
10798
99+ // This tests depends on BlazorServerTemplate_CreateBuildPublish_IndividualAuth running first
108100 [ Theory ]
109101 [ MemberData ( nameof ( BlazorServerTemplateWorks_IndividualAuthData ) ) ]
110102 [ QuarantinedTest ( "https://github.com/dotnet/aspnetcore/issues/30807" ) ]
111103 [ SkipOnHelix ( "https://github.com/dotnet/aspnetcore/issues/30825" , Queues = "All.OSX" ) ]
112104 public async Task BlazorServerTemplateWorks_IndividualAuth ( BrowserKind browserKind , bool useLocalDB )
113105 {
114- // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
115- Environment . SetEnvironmentVariable ( "EnableDefaultScopedCssItems" , "true" ) ;
116-
117- Project = await ProjectFactory . GetOrCreateProject ( "blazorserverindividual" + browserKind + ( useLocalDB ? "uld" : "" ) , Output ) ;
118-
119- var createResult = await Project . RunDotNetNewAsync ( "blazorserver" , auth : "Individual" , useLocalDB : useLocalDB ) ;
120- Assert . True ( 0 == createResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "create/restore" , Project , createResult ) ) ;
106+ var project = await ProjectFactory . GetOrCreateProject ( "blazorserverindividual" + browserKind + ( useLocalDB ? "uld" : "" ) , Output ) ;
121107
122- var publishResult = await Project . RunDotNetPublishAsync ( ) ;
123- Assert . True ( 0 == publishResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "publish" , Project , publishResult ) ) ;
124-
125- // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
126- // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
127- // later, while the opposite is not true.
128-
129- var buildResult = await Project . RunDotNetBuildAsync ( ) ;
130- Assert . True ( 0 == buildResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "build" , Project , buildResult ) ) ;
131-
132- var browser = ! Fixture . BrowserManager . IsAvailable ( browserKind ) ?
108+ var browser = ! BrowserManager . IsAvailable ( browserKind ) ?
133109 null :
134- await Fixture . BrowserManager . GetBrowserInstance ( browserKind , BrowserContextInfo ) ;
110+ await BrowserManager . GetBrowserInstance ( browserKind , BrowserContextInfo ) ;
135111
136- using ( var aspNetProcess = Project . StartBuiltProjectAsync ( ) )
112+ using ( var aspNetProcess = project . StartBuiltProjectAsync ( ) )
137113 {
138114 Assert . False (
139115 aspNetProcess . Process . HasExited ,
140- ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run built project" , Project , aspNetProcess . Process ) ) ;
116+ ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run built project" , project , aspNetProcess . Process ) ) ;
141117
142118 await aspNetProcess . AssertStatusCode ( "/" , HttpStatusCode . OK , "text/html" ) ;
143- if ( Fixture . BrowserManager . IsAvailable ( browserKind ) )
119+ if ( BrowserManager . IsAvailable ( browserKind ) )
144120 {
145121 var page = await browser . NewPageAsync ( ) ;
146122 await aspNetProcess . VisitInBrowserAsync ( page ) ;
147- await TestBasicNavigation ( page ) ;
123+ await TestBasicNavigation ( project , page ) ;
148124 await page . CloseAsync ( ) ;
149125 }
150126 else
@@ -153,18 +129,18 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi
153129 }
154130 }
155131
156- using ( var aspNetProcess = Project . StartPublishedProjectAsync ( ) )
132+ using ( var aspNetProcess = project . StartPublishedProjectAsync ( ) )
157133 {
158134 Assert . False (
159135 aspNetProcess . Process . HasExited ,
160- ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run published project" , Project , aspNetProcess . Process ) ) ;
136+ ErrorMessages . GetFailedProcessMessageOrEmpty ( "Run published project" , project , aspNetProcess . Process ) ) ;
161137
162138 await aspNetProcess . AssertStatusCode ( "/" , HttpStatusCode . OK , "text/html" ) ;
163- if ( Fixture . BrowserManager . IsAvailable ( browserKind ) )
139+ if ( BrowserManager . IsAvailable ( browserKind ) )
164140 {
165141 var page = await browser . NewPageAsync ( ) ;
166142 await aspNetProcess . VisitInBrowserAsync ( page ) ;
167- await TestBasicNavigation ( page ) ;
143+ await TestBasicNavigation ( project , page ) ;
168144 await page . CloseAsync ( ) ;
169145 }
170146 else
@@ -174,7 +150,7 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi
174150 }
175151 }
176152
177- private async Task TestBasicNavigation ( IPage page )
153+ private async Task TestBasicNavigation ( Project project , IPage page )
178154 {
179155 var socket = BrowserContextInfo . Pages [ page ] . WebSockets . SingleOrDefault ( ) ??
180156 ( await page . WaitForEventAsync ( PageEvent . WebSocket ) ) . WebSocket ;
@@ -189,7 +165,7 @@ private async Task TestBasicNavigation(IPage page)
189165
190166 await page . WaitForSelectorAsync ( "ul" ) ;
191167 // <title> element gets project ID injected into it during template execution
192- Assert . Equal ( Project . ProjectName . Trim ( ) , ( await page . GetTitleAsync ( ) ) . Trim ( ) ) ;
168+ Assert . Equal ( project . ProjectName . Trim ( ) , ( await page . GetTitleAsync ( ) ) . Trim ( ) ) ;
193169
194170 // Initially displays the home page
195171 await page . WaitForSelectorAsync ( "h1 >> text=Hello, world!" ) ;
@@ -211,29 +187,15 @@ private async Task TestBasicNavigation(IPage page)
211187 Assert . Equal ( 5 , ( await page . QuerySelectorAllAsync ( "p+table>tbody>tr" ) ) . Count ( ) ) ;
212188 }
213189
214- [ Theory ]
190+ [ Theory , TestPriority ( BUILDCREATEPUBLISH_PRIORITY ) ]
215191 [ InlineData ( "IndividualB2C" , null ) ]
216192 [ InlineData ( "IndividualB2C" , new string [ ] { "--called-api-url \" https://graph.microsoft.com\" " , "--called-api-scopes user.readwrite" } ) ]
217193 [ InlineData ( "SingleOrg" , null ) ]
218194 [ InlineData ( "SingleOrg" , new string [ ] { "--called-api-url \" https://graph.microsoft.com\" " , "--called-api-scopes user.readwrite" } ) ]
219195 [ InlineData ( "SingleOrg" , new string [ ] { "--calls-graph" } ) ]
220196 [ QuarantinedTest ( "https://github.com/dotnet/aspnetcore/issues/30882" ) ]
221- public async Task BlazorServerTemplat_IdentityWeb_BuildAndPublish ( string auth , string [ ] args )
222- {
223- Project = await ProjectFactory . GetOrCreateProject ( "blazorserveridweb" + Guid . NewGuid ( ) . ToString ( ) . Substring ( 0 , 10 ) . ToLowerInvariant ( ) , Output ) ;
197+ public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish ( string auth , string [ ] args )
198+ => CreateBuildPublishAsync ( "blazorserveridweb" + Guid . NewGuid ( ) . ToString ( ) . Substring ( 0 , 10 ) . ToLowerInvariant ( ) , auth , args ) ;
224199
225- var createResult = await Project . RunDotNetNewAsync ( "blazorserver" , auth : auth , args : args ) ;
226- Assert . True ( 0 == createResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "create/restore" , Project , createResult ) ) ;
227-
228- var publishResult = await Project . RunDotNetPublishAsync ( ) ;
229- Assert . True ( 0 == publishResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "publish" , Project , publishResult ) ) ;
230-
231- // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
232- // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
233- // later, while the opposite is not true.
234-
235- var buildResult = await Project . RunDotNetBuildAsync ( ) ;
236- Assert . True ( 0 == buildResult . ExitCode , ErrorMessages . GetFailedProcessMessage ( "build" , Project , buildResult ) ) ;
237- }
238200 }
239201}
0 commit comments