openAPISwaggerUI–part 4–adding tests
This is how I made
https://nuget.org/packages/OpenAPISwaggerUI in order to see the UI for an ASP.NET 9 project.
And hey, if you have any feedback, don’t be shy! Drop by https://github.com/ignatandrei/openAPISwaggerUI/ and let me know.
For testing, I have created a new ASP.NET Core 9 project that can be used to run
1 2 3 4 | app.MapOpenApi(); app.UseOpenAPISwaggerUI(); public partial class Program { } |
And I want to see that /swagger endpoint exists . And more, to have pictures with the different UIs.
The WebApplicationFactory is used to create a test server that can be used to test the application. But I need more – to have a real server that can be used to test the application.
I have found this link that show how to start Kestrel server in a test project : https://danieldonbavand.com/2022/06/13/using-playwright-with-the-webapplicationfactory-to-test-a-blazor-application/
And now the code for having the pre-requisites for testing is as easy as pie.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | static CustomWebApplicationFactory factory; [AssemblyInitialize] public static void AssemblyInit(TestContext context) { var exitCode = Microsoft.Playwright.Program.Main( new [] { "install" }); if (exitCode != 0) { throw new Exception($ "Playwright exited with code {exitCode}" ); } factory = new (); var url = factory.ServerAddress; Console.WriteLine($ "Server address: {url}" ); } |
And we can test the weatherforecast endpoint – because who doesn’t love knowing the weather, right?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | [TestMethod] public async Task TestWeHaveRealWebServer() { using var client = factory.CreateDefaultClient(); var response = await client.GetAsync( "/weatherforecast" ); response.EnsureSuccessStatusCode(); var baseAddress = factory.ServerAddress; if (!baseAddress.EndsWith( "/" )) { baseAddress += "/" ; } using var playwright = await Playwright.CreateAsync(); var request = await playwright.APIRequest.NewContextAsync(); var response1 = await request.GetAsync(baseAddress+ "weatherforecast" ); Assert.IsTrue(response1.Ok); } |
And to test the endpoints for my library , OpenAPISwaggerUI
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | [TestMethod] public async Task TestIntegrationWorks() { var baseAddress = factory.ServerAddress; if (!baseAddress.EndsWith( "/" )) { baseAddress += "/" ; } using var playwright = await Playwright.CreateAsync(); var request = await playwright.APIRequest.NewContextAsync(); await using var browser = await playwright.Chromium.LaunchAsync(); var context = await browser.NewContextAsync( new () { //RecordVideoDir = curDirVideos }); var page = await browser.NewPageAsync(); var pageSwagger = await page.GotoAsync(baseAddress + "swagger" ); await page.ScreenshotAsync( new PageScreenshotOptions { Path = "swagger.png" }); var content= await page.ContentAsync(); var hrefs = await page.Locator( "a" ).AllAsync(); Assert.IsTrue(hrefs.Count > 0); foreach ( var li in hrefs) { var text= await li.TextContentAsync(); var href = await li.GetAttributeAsync( "href" ); ArgumentNullException.ThrowIfNull(href); if (href.StartsWith( "/" )) { href = href[1..]; } var pageNew = await browser.NewPageAsync(); await pageNew.GotoAsync(baseAddress+ href); await pageNew.WaitForLoadStateAsync(LoadState.NetworkIdle); await pageNew.ScreenshotAsync( new PageScreenshotOptions { Path = $ "{text}.png" }); } } |