BlazorWasmTemplateTest.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. using System.IO;
  4. using System.Net;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using Microsoft.AspNetCore.E2ETesting;
  8. using Microsoft.AspNetCore.Testing;
  9. using OpenQA.Selenium;
  10. using Templates.Test.Helpers;
  11. using Xunit;
  12. using Xunit.Abstractions;
  13. namespace Templates.Test
  14. {
  15. public class BlazorWasmTemplateTest : BrowserTestBase
  16. {
  17. public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, BrowserFixture browserFixture, ITestOutputHelper output)
  18. : base(browserFixture, output)
  19. {
  20. ProjectFactory = projectFactory;
  21. }
  22. public ProjectFactoryFixture ProjectFactory { get; set; }
  23. [Fact]
  24. public async Task BlazorWasmStandaloneTemplate_Works()
  25. {
  26. var project = await ProjectFactory.GetOrCreateProject("blazorstandalone", Output);
  27. var createResult = await project.RunDotNetNewAsync("blazorwasm");
  28. Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
  29. // We can't run a published standalone app, but let's just make sure it publishes fine
  30. var publishResult = await project.RunDotNetPublishAsync();
  31. Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult));
  32. var buildResult = await project.RunDotNetBuildAsync();
  33. Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
  34. await BuildAndRunTest(project.ProjectName, project);
  35. }
  36. [Fact]
  37. public async Task BlazorWasmHostedTemplate_Works()
  38. {
  39. var project = await ProjectFactory.GetOrCreateProject("blazorhosted", Output);
  40. var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" });
  41. Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
  42. var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
  43. var publishResult = await serverProject.RunDotNetPublishAsync();
  44. Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult));
  45. var buildResult = await serverProject.RunDotNetBuildAsync();
  46. Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult));
  47. await BuildAndRunTest(project.ProjectName, serverProject);
  48. using var aspNetProcess = serverProject.StartPublishedProjectAsync();
  49. Assert.False(
  50. aspNetProcess.Process.HasExited,
  51. ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process));
  52. await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html");
  53. if (BrowserFixture.IsHostAutomationSupported())
  54. {
  55. aspNetProcess.VisitInBrowser(Browser);
  56. TestBasicNavigation(project.ProjectName, serverProject);
  57. }
  58. else
  59. {
  60. BrowserFixture.EnforceSupportedConfigurations();
  61. }
  62. }
  63. protected async Task BuildAndRunTest(string appName, Project project)
  64. {
  65. using var aspNetProcess = project.StartBuiltProjectAsync();
  66. Assert.False(
  67. aspNetProcess.Process.HasExited,
  68. ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));
  69. await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html");
  70. if (BrowserFixture.IsHostAutomationSupported())
  71. {
  72. aspNetProcess.VisitInBrowser(Browser);
  73. TestBasicNavigation(appName, project);
  74. }
  75. else
  76. {
  77. BrowserFixture.EnforceSupportedConfigurations();
  78. }
  79. }
  80. private void TestBasicNavigation(string appName, Project project)
  81. {
  82. // Give components.server enough time to load so that it can replace
  83. // the prerendered content before we start making assertions.
  84. Thread.Sleep(5000);
  85. Browser.Exists(By.TagName("ul"));
  86. // <title> element gets project ID injected into it during template execution
  87. Browser.Equal(appName.Trim(), () => Browser.Title.Trim());
  88. // Initially displays the home page
  89. Browser.Equal("Hello, world!", () => Browser.FindElement(By.TagName("h1")).Text);
  90. // Can navigate to the counter page
  91. Browser.FindElement(By.PartialLinkText("Counter")).Click();
  92. Browser.Contains("counter", () => Browser.Url);
  93. Browser.Equal("Counter", () => Browser.FindElement(By.TagName("h1")).Text);
  94. // Clicking the counter button works
  95. Browser.Equal("Current count: 0", () => Browser.FindElement(By.CssSelector("h1 + p")).Text);
  96. Browser.FindElement(By.CssSelector("p+button")).Click();
  97. Browser.Equal("Current count: 1", () => Browser.FindElement(By.CssSelector("h1 + p")).Text);
  98. // Can navigate to the 'fetch data' page
  99. Browser.FindElement(By.PartialLinkText("Fetch data")).Click();
  100. Browser.Contains("fetchdata", () => Browser.Url);
  101. Browser.Equal("Weather forecast", () => Browser.FindElement(By.TagName("h1")).Text);
  102. // Asynchronously loads and displays the table of weather forecasts
  103. Browser.Exists(By.CssSelector("table>tbody>tr"));
  104. Browser.Equal(5, () => Browser.FindElements(By.CssSelector("p+table>tbody>tr")).Count);
  105. }
  106. private Project GetSubProject(Project project, string projectDirectory, string projectName)
  107. {
  108. var subProjectDirectory = Path.Combine(project.TemplateOutputDir, projectDirectory);
  109. if (!Directory.Exists(subProjectDirectory))
  110. {
  111. throw new DirectoryNotFoundException($"Directory {subProjectDirectory} was not found.");
  112. }
  113. var subProject = new Project
  114. {
  115. DotNetNewLock = project.DotNetNewLock,
  116. NodeLock = project.NodeLock,
  117. Output = project.Output,
  118. DiagnosticsMessageSink = project.DiagnosticsMessageSink,
  119. ProjectName = projectName,
  120. TemplateOutputDir = subProjectDirectory,
  121. };
  122. return subProject;
  123. }
  124. }
  125. }