139 lines
4.3 KiB
C#
Executable File
139 lines
4.3 KiB
C#
Executable File
using NUnit.Framework;
|
|
using System.Text.RegularExpressions;
|
|
using Microsoft.Playwright;
|
|
using Microsoft.Playwright.NUnit;
|
|
using NUnit.Framework.Internal;
|
|
|
|
namespace PlaywrightTests;
|
|
|
|
[Parallelizable(ParallelScope.Self)]
|
|
[TestFixture]
|
|
public partial class PokeyPageTests : PageTest
|
|
{
|
|
private const string ScreenshotRoot = "../../../screenshots/";
|
|
private const string HomeUrl = "http://localhost:5296";
|
|
private const int AppInitDelay = 5000;
|
|
private IPage? _page;
|
|
private IBrowser? _browser;
|
|
|
|
[GeneratedRegex("Home page")]
|
|
private static partial Regex HomePageRegex();
|
|
|
|
[GeneratedRegex(".*Pokey")]
|
|
private static partial Regex PokeyUrlRegex();
|
|
|
|
[SetUp]
|
|
public async Task Init()
|
|
{
|
|
_browser = await Playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions() { Headless = true, });
|
|
_page = await _browser.NewPageAsync();
|
|
await WaitForApp(_page);
|
|
}
|
|
|
|
[Test]
|
|
public async Task PokeyOptionShouldBePresentInMenu()
|
|
{
|
|
// Confirm we've found the Gumby link in the header
|
|
var pokeyPageLink = _page!.GetByRole(AriaRole.Link, new PageGetByRoleOptions { Name = "Pokey" });
|
|
await Expect(pokeyPageLink).ToHaveAttributeAsync("href", "/Pokey");
|
|
}
|
|
|
|
[Test]
|
|
public async Task NavigationToPokeyPageShouldSucceed()
|
|
{
|
|
await GotoPokey(_page!);
|
|
await PageSnap(_page!, "gumby.png");
|
|
await Expect(_page!).ToHaveURLAsync(PokeyUrlRegex());
|
|
}
|
|
|
|
[Test]
|
|
public async Task PokeyImageShouldBePresentOnBrowser()
|
|
{
|
|
await GotoPokey(_page!);
|
|
Expect(_page!.GetByRole(AriaRole.Img, new PageGetByRoleOptions { Name = "Pokey" }));
|
|
|
|
}
|
|
|
|
[Test]
|
|
public async Task BothTimesShouldBeVisibleOnGet()
|
|
{
|
|
await GotoPokey(_page!);
|
|
var handleList = _page!.QuerySelectorAllAsync("//*[ contains(text(), 'time is' ) ]").Result;
|
|
Assert.That(handleList, Has.Count.EqualTo(2));
|
|
}
|
|
|
|
[Test]
|
|
public async Task BothTimesShouldMatchOnGet()
|
|
{
|
|
await GotoPokey(_page!);
|
|
var handleList = _page!.QuerySelectorAllAsync("//*[ contains(text(), 'time is' ) ]").Result;
|
|
var time1= await handleList[0].TextContentAsync();
|
|
var time2 = await handleList[1].TextContentAsync();
|
|
|
|
// ReSharper disable once StringIndexOfIsCultureSpecific.1
|
|
var startIndex1 = time1!.IndexOf(" is ") + 4;
|
|
var dateTime1 = DateTime.Parse(time1[startIndex1..]);
|
|
// ReSharper disable once StringIndexOfIsCultureSpecific.1
|
|
var startIndex2 = time2!.IndexOf(" is ") + 4;
|
|
var dateTime2 = DateTime.Parse(time1[startIndex2..]);
|
|
|
|
Assert.That(dateTime1, Is.EqualTo(dateTime2));
|
|
|
|
}
|
|
|
|
/*** HELPERS ***/
|
|
|
|
private static async Task PageSnap(IPage page, string filename)
|
|
{
|
|
await page.ScreenshotAsync(new PageScreenshotOptions { FullPage = true, Path = ScreenshotRoot+"/"+filename});
|
|
}
|
|
|
|
private static async Task ElementSnap(ILocator locator, string filename)
|
|
{
|
|
await locator.ScreenshotAsync(new LocatorScreenshotOptions { Path = ScreenshotRoot+"/"+filename });
|
|
}
|
|
|
|
private static async Task GotoPokey(IPage page)
|
|
{
|
|
await page.GetByRole(AriaRole.Link, new PageGetByRoleOptions { Name = "Pokey" }).ClickAsync();
|
|
}
|
|
|
|
private static async Task WaitForApp(IPage page)
|
|
{
|
|
var pageIsLoaded = false;
|
|
while (!pageIsLoaded)
|
|
{
|
|
try
|
|
{
|
|
await page.GotoAsync(HomeUrl, new PageGotoOptions() { Timeout = AppInitDelay });
|
|
pageIsLoaded = true;
|
|
}
|
|
catch
|
|
{
|
|
await Task.Delay(AppInitDelay);
|
|
}
|
|
}
|
|
|
|
var appIsLoaded = false;
|
|
while (!appIsLoaded)
|
|
{
|
|
try
|
|
{
|
|
var titleAsync = await page.TitleAsync();
|
|
if (HomePageRegex().Match(titleAsync).Success)
|
|
{
|
|
appIsLoaded = true;
|
|
continue;
|
|
};
|
|
}
|
|
catch
|
|
{
|
|
// _logger.Information("Error loading app");
|
|
}
|
|
|
|
// _logger.Information("App not loaded, delaying before retrying...");
|
|
await Task.Delay(AppInitDelay);
|
|
}
|
|
// _logger.Information($"{nameof(WaitForApp)} completed");
|
|
}
|
|
} |