Simple E2E test for static site
This commit is contained in:
commit
b2937984a0
|
|
@ -0,0 +1,3 @@
|
||||||
|
.vs/
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
VisualStudioVersion = 15.0.27004.2005
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{F5FDD4E5-6A52-4A86-BE5E-5E42CB1DC8DA}"
|
||||||
|
EndProject
|
||||||
|
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "HelloWorld", "samples\HelloWorld\", "{4C7EE25B-E9C7-4CA3-8357-77ADF9AAD20A}"
|
||||||
|
ProjectSection(WebsiteProperties) = preProject
|
||||||
|
TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0"
|
||||||
|
Debug.AspNetCompiler.VirtualPath = "/localhost_56836"
|
||||||
|
Debug.AspNetCompiler.PhysicalPath = "samples\HelloWorld\"
|
||||||
|
Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\localhost_56836\"
|
||||||
|
Debug.AspNetCompiler.Updateable = "true"
|
||||||
|
Debug.AspNetCompiler.ForceOverwrite = "true"
|
||||||
|
Debug.AspNetCompiler.FixedNames = "false"
|
||||||
|
Debug.AspNetCompiler.Debug = "True"
|
||||||
|
Release.AspNetCompiler.VirtualPath = "/localhost_56836"
|
||||||
|
Release.AspNetCompiler.PhysicalPath = "samples\HelloWorld\"
|
||||||
|
Release.AspNetCompiler.TargetPath = "PrecompiledWeb\localhost_56836\"
|
||||||
|
Release.AspNetCompiler.Updateable = "true"
|
||||||
|
Release.AspNetCompiler.ForceOverwrite = "true"
|
||||||
|
Release.AspNetCompiler.FixedNames = "false"
|
||||||
|
Release.AspNetCompiler.Debug = "False"
|
||||||
|
VWDPort = "56836"
|
||||||
|
SlnRelativePath = "samples\HelloWorld\"
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Blazor.E2ETest", "e2e\Blazor.E2ETest.csproj", "{A1A3AEB6-A832-477E-8D91-A672CFE53801}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{4C7EE25B-E9C7-4CA3-8357-77ADF9AAD20A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{4C7EE25B-E9C7-4CA3-8357-77ADF9AAD20A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{4C7EE25B-E9C7-4CA3-8357-77ADF9AAD20A}.Release|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{4C7EE25B-E9C7-4CA3-8357-77ADF9AAD20A}.Release|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A1A3AEB6-A832-477E-8D91-A672CFE53801}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A1A3AEB6-A832-477E-8D91-A672CFE53801}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A1A3AEB6-A832-477E-8D91-A672CFE53801}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A1A3AEB6-A832-477E-8D91-A672CFE53801}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(NestedProjects) = preSolution
|
||||||
|
{4C7EE25B-E9C7-4CA3-8357-77ADF9AAD20A} = {F5FDD4E5-6A52-4A86-BE5E-5E42CB1DC8DA}
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {504DA352-6788-4DC0-8705-82167E72A4D3}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.1" />
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
|
||||||
|
<PackageReference Include="Selenium.WebDriver" Version="3.8.0" />
|
||||||
|
<PackageReference Include="xunit" Version="2.3.1" />
|
||||||
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using OpenQA.Selenium.Chrome;
|
||||||
|
using OpenQA.Selenium.Remote;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Blazor.E2ETest.Infrastructure
|
||||||
|
{
|
||||||
|
public class BrowserFixture : IDisposable
|
||||||
|
{
|
||||||
|
public IWebDriver Browser { get; }
|
||||||
|
|
||||||
|
public BrowserFixture()
|
||||||
|
{
|
||||||
|
var opts = new ChromeOptions();
|
||||||
|
opts.AddArgument("--headless");
|
||||||
|
Browser = new RemoteWebDriver(opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
Browser.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Hosting.Server.Features;
|
||||||
|
|
||||||
|
namespace Blazor.E2ETest.Infrastructure
|
||||||
|
{
|
||||||
|
public class StaticServerFixture : IDisposable
|
||||||
|
{
|
||||||
|
private IWebHost _host;
|
||||||
|
|
||||||
|
public string Start(string path)
|
||||||
|
{
|
||||||
|
_host = new WebHostBuilder()
|
||||||
|
.UseKestrel()
|
||||||
|
.UseContentRoot(path)
|
||||||
|
.UseWebRoot(string.Empty)
|
||||||
|
.UseStartup<Startup>()
|
||||||
|
.UseUrls("http://127.0.0.1:0")
|
||||||
|
.Build();
|
||||||
|
StartWebHostInBackgroundThread(_host);
|
||||||
|
|
||||||
|
return _host.ServerFeatures
|
||||||
|
.Get<IServerAddressesFeature>()
|
||||||
|
.Addresses.Single();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_host.StopAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void StartWebHostInBackgroundThread(IWebHost host)
|
||||||
|
{
|
||||||
|
var serverStarted = new ManualResetEvent(false);
|
||||||
|
|
||||||
|
new Thread(() =>
|
||||||
|
{
|
||||||
|
host.Start();
|
||||||
|
serverStarted.Set();
|
||||||
|
}).Start();
|
||||||
|
|
||||||
|
serverStarted.WaitOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Startup
|
||||||
|
{
|
||||||
|
public void Configure(IApplicationBuilder app)
|
||||||
|
{
|
||||||
|
app.UseFileServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Blazor.E2ETest.Infrastructure
|
||||||
|
{
|
||||||
|
public class StaticSiteTestBase
|
||||||
|
: IClassFixture<BrowserFixture>, IClassFixture<StaticServerFixture>
|
||||||
|
{
|
||||||
|
public IWebDriver Browser { get; }
|
||||||
|
|
||||||
|
private Uri _serverRootUri;
|
||||||
|
|
||||||
|
public StaticSiteTestBase(
|
||||||
|
BrowserFixture browserFixture,
|
||||||
|
StaticServerFixture serverFixture,
|
||||||
|
string staticSitePath)
|
||||||
|
{
|
||||||
|
Browser = browserFixture.Browser;
|
||||||
|
|
||||||
|
// Start a static files web server for the specified directory
|
||||||
|
var staticSiteFullPath = Path.Combine(FindSolutionDir(), staticSitePath);
|
||||||
|
var serverRootUriString = serverFixture.Start(staticSiteFullPath);
|
||||||
|
_serverRootUri = new Uri(serverRootUriString);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Navigate(string relativeUrl)
|
||||||
|
{
|
||||||
|
var absoluteUrl = new Uri(_serverRootUri, relativeUrl);
|
||||||
|
Browser.Navigate().GoToUrl(absoluteUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string FindSolutionDir()
|
||||||
|
{
|
||||||
|
return FindClosestDirectoryContaining(
|
||||||
|
"Blazor.sln",
|
||||||
|
Path.GetDirectoryName(GetType().Assembly.Location));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string FindClosestDirectoryContaining(
|
||||||
|
string filename,
|
||||||
|
string startDirectory)
|
||||||
|
{
|
||||||
|
var dir = startDirectory;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (File.Exists(Path.Combine(dir, filename)))
|
||||||
|
{
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir = Directory.GetParent(dir)?.FullName;
|
||||||
|
if (string.IsNullOrEmpty(dir))
|
||||||
|
{
|
||||||
|
throw new FileNotFoundException(
|
||||||
|
$"Could not locate a file called '{filename}' in " +
|
||||||
|
$"directory '{startDirectory}' or any parent directory.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Blazor.E2ETest.Infrastructure;
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Blazor.E2ETest.Tests
|
||||||
|
{
|
||||||
|
public class HelloWorldTest : StaticSiteTestBase
|
||||||
|
{
|
||||||
|
public HelloWorldTest(BrowserFixture browserFixture, StaticServerFixture serverFixture)
|
||||||
|
: base(browserFixture, serverFixture, @"samples\HelloWorld")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void HasTitle()
|
||||||
|
{
|
||||||
|
Navigate("/");
|
||||||
|
Assert.Equal("Hello", Browser.Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void DisplaysMessage()
|
||||||
|
{
|
||||||
|
Navigate("/");
|
||||||
|
Assert.Equal("Hello, world!", Browser.FindElement(By.TagName("h1")).Text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Hello</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello, world!</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Loading…
Reference in New Issue