Skip to content

BlazorTemplate test improvements #30907

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 57 commits into from
Mar 24, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
0c1a690
Try splitting createbuildpublish from run
HaoK Mar 13, 2021
44cfcbf
Merge branch 'main' into haok/pworder
HaoK Mar 13, 2021
3f8f8df
Update BlazorWasmTemplateTest.cs
HaoK Mar 13, 2021
c4efe4b
Update BlazorWasmTemplateTest.cs
HaoK Mar 14, 2021
d5a4c14
Update BlazorServerTemplateTest.cs
HaoK Mar 14, 2021
78a4740
Update BlazorWasmTemplateTest.cs
HaoK Mar 15, 2021
24967f8
Try stop sharing playwright instance, create one per test
HaoK Mar 15, 2021
1da6a3f
Update BrowserManager.cs
HaoK Mar 15, 2021
a201a63
Update AssemblyInfo.AssemblyFixtures.cs
HaoK Mar 16, 2021
5c5d794
Update AssemblyInfo.AssemblyFixtures.cs
HaoK Mar 16, 2021
ccc0c10
Cleanup
HaoK Mar 16, 2021
d08ece3
Update BlazorTemplateTest.cs
HaoK Mar 16, 2021
38a926e
Update BlazorWasmTemplateTest.cs
HaoK Mar 16, 2021
e205d24
Update BlazorWasmTemplateTest.cs
HaoK Mar 16, 2021
e856f9e
Add logging
HaoK Mar 16, 2021
3d9921c
Merge branch 'haok/pworder' of https://github.com/dotnet/aspnetcore i…
HaoK Mar 16, 2021
778d568
Update BlazorWasmTemplateTest.cs
HaoK Mar 17, 2021
9b300b2
Update BlazorWasmTemplateTest.cs
HaoK Mar 17, 2021
c0aae25
Update BlazorTemplateTest.cs
HaoK Mar 17, 2021
9cbac95
Update AssemblyInfo.AssemblyFixtures.cs
HaoK Mar 17, 2021
488f245
Update BlazorWasmTemplateTest.cs
HaoK Mar 17, 2021
811ad99
Merge branch 'main' into haok/pworder
HaoK Mar 17, 2021
861afce
Update BlazorTemplateTest.cs
HaoK Mar 18, 2021
1569cb2
Update BlazorTemplateTest.cs
HaoK Mar 18, 2021
0e6f858
Update LoggedTestBase.cs
HaoK Mar 18, 2021
f2d395b
Update LoggedTestBase.cs
HaoK Mar 18, 2021
54d171e
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
e204476
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
d31198f
Update BlazorServerTemplateTest.cs
HaoK Mar 19, 2021
8b17ff6
Use correct logger
HaoK Mar 19, 2021
9ab5a85
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
d4b6365
Update BlazorServerTemplateTest.cs
HaoK Mar 19, 2021
ad3f974
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
9f47a47
Update BlazorWasmTemplateTest.cs
HaoK Mar 19, 2021
3dede55
Update src/Testing/src/LoggedTest/LoggedTestBase.cs
HaoK Mar 19, 2021
03c786f
Update LoggedTestBase.cs
HaoK Mar 19, 2021
d2c6bf8
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
e9d5124
Update MvcTemplateTest.cs
HaoK Mar 19, 2021
70a67c9
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
d6723c0
Update BlazorTemplateTest.cs
HaoK Mar 19, 2021
815ad0d
Hook testsink to actually do something!
HaoK Mar 20, 2021
2678751
Update BlazorTemplateTest.cs
HaoK Mar 20, 2021
968b57e
Pass output to project methods
HaoK Mar 20, 2021
e48461d
Fixup output helper in GetOrCreateProject
HaoK Mar 20, 2021
b7fadae
Merge branch 'main' into haok/pworder
HaoK Mar 20, 2021
c001819
Update Project.cs
HaoK Mar 20, 2021
5172e66
Update ProjectFactoryFixture.cs
HaoK Mar 20, 2021
69e6f31
Update Project.cs
HaoK Mar 21, 2021
f3f8317
Update MvcTemplateTest.cs
HaoK Mar 21, 2021
a050395
Update BlazorWasmTemplateTest.cs
HaoK Mar 22, 2021
495da51
Update BlazorServerTemplateTest.cs
HaoK Mar 22, 2021
9e38af3
Update comments to clarify test dependencies
HaoK Mar 22, 2021
4979b23
Update BlazorWasmTemplateTest.cs
HaoK Mar 22, 2021
36cdc1a
Update TestPriorityAttribute.cs
HaoK Mar 22, 2021
17fb968
Update BlazorWasmTemplateTest.cs
HaoK Mar 22, 2021
18865dd
Requarantine tests
HaoK Mar 23, 2021
a13c1f0
Requarantine tests
HaoK Mar 23, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
using ProjectTemplates.Tests.Infrastructure;
using Templates.Test;
using Templates.Test.Helpers;
using Xunit;

[assembly: AssemblyFixture(typeof(ProjectFactoryFixture))]
[assembly: AssemblyFixture(typeof(PlaywrightFixture<BlazorServerTemplateTest>))]
[assembly: CollectionBehavior(DisableTestParallelization = true)]

128 changes: 45 additions & 83 deletions src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Microsoft.AspNetCore.BrowserTesting;
using Microsoft.AspNetCore.Testing;
Expand All @@ -17,62 +16,47 @@

namespace Templates.Test
{
[TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")]
public class BlazorServerTemplateTest : BlazorTemplateTest
{
public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture<BlazorServerTemplateTest> fixture, ITestOutputHelper output)
: base(fixture)
public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory)
: base(projectFactory)
{
ProjectFactory = projectFactory; ;
Output = output;
BrowserContextInfo = new ContextInformation(CreateFactory(output));
}

public ProjectFactoryFixture ProjectFactory { get; set; }
public ITestOutputHelper Output { get; }
public ContextInformation BrowserContextInfo { get; }
public Project Project { get; private set; }
public override string ProjectType { get; } = "blazorserver";

// This test is required to run before BlazorServerTemplateWorks_NoAuth to create and build the project
// If this test is quarantined, BlazorServerTemplateWorks_NoAuth must be quarantined as well
[Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)]
public Task BlazorServerTemplate_CreateBuildPublish_NoAuth()
=> CreateBuildPublishAsync("blazorservernoauth" + BrowserKind.Chromium.ToString());

// This tests depends on BlazorServerTemplate_CreateBuildPublish_NoAuth running first
[Theory]
[InlineData(BrowserKind.Chromium)]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")]
public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind)
{
// Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");
var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind, Output);

Project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), Output);

var createResult = await Project.RunDotNetNewAsync("blazorserver");
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult));

var publishResult = await Project.RunDotNetPublishAsync();
Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", Project, publishResult));

// Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
// The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
// later, while the opposite is not true.

var buildResult = await Project.RunDotNetBuildAsync();
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult));

await using var browser = Fixture.BrowserManager.IsAvailable(browserKind) ?
await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) :
await using var browser = BrowserManager.IsAvailable(browserKind) ?
await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) :
null;

using (var aspNetProcess = Project.StartBuiltProjectAsync())
using (var aspNetProcess = project.StartBuiltProjectAsync())
{
Assert.False(
aspNetProcess.Process.HasExited,
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));

await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html");

if (Fixture.BrowserManager.IsAvailable(browserKind))
if (BrowserManager.IsAvailable(browserKind))
{
var page = await browser.NewPageAsync();
await aspNetProcess.VisitInBrowserAsync(page);
await TestBasicNavigation(page);
await TestBasicNavigation(project, page);
await page.CloseAsync();
}
else
Expand All @@ -81,18 +65,18 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo)
}
}

using (var aspNetProcess = Project.StartPublishedProjectAsync())
using (var aspNetProcess = project.StartPublishedProjectAsync())
{
Assert.False(
aspNetProcess.Process.HasExited,
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process));
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", project, aspNetProcess.Process));

await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html");
if (Fixture.BrowserManager.IsAvailable(browserKind))
if (BrowserManager.IsAvailable(browserKind))
{
var page = await browser.NewPageAsync();
await aspNetProcess.VisitInBrowserAsync(page);
await TestBasicNavigation(page);
await TestBasicNavigation(project, page);
await page.CloseAsync();
}
else
Expand All @@ -102,49 +86,41 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo)
}
}

// This test is required to run before BlazorServerTemplateWorks_IndividualAuth to create and build the project
// If this test is quarantined, BlazorServerTemplateWorks_IndividualAuth must be quarantined as well
[Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)]
[MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))]
public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuth(BrowserKind browserKind, bool useLocalDB)
=> CreateBuildPublishAsync("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""));

public static IEnumerable<object[]> BlazorServerTemplateWorks_IndividualAuthData =>
BrowserManager.WithBrowsers(new[] { BrowserKind.Chromium }, true, false);

// This tests depends on BlazorServerTemplate_CreateBuildPublish_IndividualAuth running first
[Theory]
[MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")]
[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")]
public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB)
{
// Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");

Project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output);

var createResult = await Project.RunDotNetNewAsync("blazorserver", auth: "Individual", useLocalDB: useLocalDB);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult));
var project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output);

var publishResult = await Project.RunDotNetPublishAsync();
Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", Project, publishResult));

// Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
// The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
// later, while the opposite is not true.

var buildResult = await Project.RunDotNetBuildAsync();
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult));

var browser = !Fixture.BrowserManager.IsAvailable(browserKind) ?
var browser = !BrowserManager.IsAvailable(browserKind) ?
null :
await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo);
await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo);

using (var aspNetProcess = Project.StartBuiltProjectAsync())
using (var aspNetProcess = project.StartBuiltProjectAsync())
{
Assert.False(
aspNetProcess.Process.HasExited,
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process));
ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));

await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html");
if (Fixture.BrowserManager.IsAvailable(browserKind))
if (BrowserManager.IsAvailable(browserKind))
{
var page = await browser.NewPageAsync();
await aspNetProcess.VisitInBrowserAsync(page);
await TestBasicNavigation(page);
await TestBasicNavigation(project, page);
await page.CloseAsync();
}
else
Expand All @@ -153,18 +129,18 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi
}
}

using (var aspNetProcess = Project.StartPublishedProjectAsync())
using (var aspNetProcess = project.StartPublishedProjectAsync())
{
Assert.False(
aspNetProcess.Process.HasExited,
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process));
ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", project, aspNetProcess.Process));

await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html");
if (Fixture.BrowserManager.IsAvailable(browserKind))
if (BrowserManager.IsAvailable(browserKind))
{
var page = await browser.NewPageAsync();
await aspNetProcess.VisitInBrowserAsync(page);
await TestBasicNavigation(page);
await TestBasicNavigation(project, page);
await page.CloseAsync();
}
else
Expand All @@ -174,7 +150,7 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi
}
}

private async Task TestBasicNavigation(IPage page)
private async Task TestBasicNavigation(Project project, IPage page)
{
var socket = BrowserContextInfo.Pages[page].WebSockets.SingleOrDefault() ??
(await page.WaitForEventAsync(PageEvent.WebSocket)).WebSocket;
Expand All @@ -189,7 +165,7 @@ private async Task TestBasicNavigation(IPage page)

await page.WaitForSelectorAsync("ul");
// <title> element gets project ID injected into it during template execution
Assert.Equal(Project.ProjectName.Trim(), (await page.GetTitleAsync()).Trim());
Assert.Equal(project.ProjectName.Trim(), (await page.GetTitleAsync()).Trim());

// Initially displays the home page
await page.WaitForSelectorAsync("h1 >> text=Hello, world!");
Expand All @@ -211,29 +187,15 @@ private async Task TestBasicNavigation(IPage page)
Assert.Equal(5, (await page.QuerySelectorAllAsync("p+table>tbody>tr")).Count());
}

[Theory]
[Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)]
[InlineData("IndividualB2C", null)]
[InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
[InlineData("SingleOrg", null)]
[InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
[InlineData("SingleOrg", new string[] { "--calls-graph" })]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")]
public async Task BlazorServerTemplat_IdentityWeb_BuildAndPublish(string auth, string[] args)
{
Project = await ProjectFactory.GetOrCreateProject("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), Output);
public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish(string auth, string[] args)
=> CreateBuildPublishAsync("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), auth, args);

var createResult = await Project.RunDotNetNewAsync("blazorserver", auth: auth, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult));

var publishResult = await Project.RunDotNetPublishAsync();
Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", Project, publishResult));

// Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
// The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
// later, while the opposite is not true.

var buildResult = await Project.RunDotNetBuildAsync();
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult));
}
}
}
Loading