diff --git a/.gitignore b/.gitignore index ba5d491..e400015 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ src/obj/* src/logs/* src/Elmah/* publish/* +tests/Berufsschule_HAM.E2ETests/obj/* +tests/Berufsschule_HAM.E2ETests/bin/* diff --git a/src/Berufsschule_HAM.sln b/src/Berufsschule_HAM.sln index e54d82f..2228559 100644 --- a/src/Berufsschule_HAM.sln +++ b/src/Berufsschule_HAM.sln @@ -1,9 +1,11 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.5.2.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Berufsschule_HAM", "Berufsschule_HAM.csproj", "{93DF3CFA-1E88-78A3-FA37-F268564DC5FB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Berufsschule_HAM.E2ETests", "..\tests\Berufsschule_HAM.E2ETests\Berufsschule_HAM.E2ETests.csproj", "{26D89942-FBE0-4FCC-9DB5-CFEFC75C5222}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -14,6 +16,10 @@ Global {93DF3CFA-1E88-78A3-FA37-F268564DC5FB}.Debug|Any CPU.Build.0 = Debug|Any CPU {93DF3CFA-1E88-78A3-FA37-F268564DC5FB}.Release|Any CPU.ActiveCfg = Release|Any CPU {93DF3CFA-1E88-78A3-FA37-F268564DC5FB}.Release|Any CPU.Build.0 = Release|Any CPU + {26D89942-FBE0-4FCC-9DB5-CFEFC75C5222}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26D89942-FBE0-4FCC-9DB5-CFEFC75C5222}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26D89942-FBE0-4FCC-9DB5-CFEFC75C5222}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26D89942-FBE0-4FCC-9DB5-CFEFC75C5222}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj b/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj new file mode 100644 index 0000000..9c10485 --- /dev/null +++ b/tests/Berufsschule_HAM.E2ETests/Berufsschule_HAM.E2ETests.csproj @@ -0,0 +1,27 @@ + + + net8.0 + enable + enable + false + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + \ No newline at end of file diff --git a/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs new file mode 100644 index 0000000..0d2f425 --- /dev/null +++ b/tests/Berufsschule_HAM.E2ETests/Helper/AppHelper.cs @@ -0,0 +1,45 @@ +using System.Diagnostics; +using System.Net; +using Microsoft.AspNetCore.Mvc.Routing; + +namespace Berufsschule_HAM.E2ETests.Helper; + +public static class AppHelper +{ + public static async Task StartApp(string appUrl) + { + var startInfo = new ProcessStartInfo + { + FileName = "/snap/bin/dotnet", + Arguments = "run --project ../../../../../src/", + WorkingDirectory = AppContext.BaseDirectory, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + startInfo.EnvironmentVariables["ASPNETCORE_ENVIRONMENT"] = "Development"; + + + var process = new Process { StartInfo = startInfo };// Process process = Process.Start("/snap/bin/dotnet", "run -e Development"); + process.Start(); + using var client = new HttpClient(); + for (int i = 0; i < 60; i++) + { + try + { + var response = await client.GetAsync(appUrl); + if (response.StatusCode == HttpStatusCode.OK) + { + return process; + } + else if (response.StatusCode != HttpStatusCode.RequestTimeout) + { + throw new Exception($"Server did not start properly? {response.StatusCode}"); + } + } + catch (Exception) { } + Thread.Sleep(1000); + } + throw new Exception("Server did not start within 60 seconds"); + } +} \ No newline at end of file diff --git a/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs b/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs new file mode 100644 index 0000000..760332d --- /dev/null +++ b/tests/Berufsschule_HAM.E2ETests/HomePageTests.cs @@ -0,0 +1,37 @@ +using OpenQA.Selenium; +using OpenQA.Selenium.Chrome; +using System.Diagnostics; + +namespace Berufsschule_HAM.E2ETests; + +public class HomePageTests : IDisposable +{ + private readonly ChromeDriver _driver; + public string serverUrl; + public Process serverProcess; + + public HomePageTests() + { + serverUrl = "http://localhost:5275"; + Task app = Helper.AppHelper.StartApp(serverUrl); + + var options = new ChromeOptions(); + //options.AddArgument("--headless"); + _driver = new ChromeDriver(options); + serverProcess = app.Result; + } + + [Fact] + public void HomePage_ShouldShowLoginPage() + { + _driver.Navigate().GoToUrl(serverUrl); + IWebElement loginForm = _driver.FindElement(By.CssSelector("form[action=\"/Home/Login\"]")); + Assert.True(loginForm.Displayed); + } + + public void Dispose() + { + _driver.Quit(); + serverProcess.Close(); + } +}