diff --git a/tests/TodoApp.Tests/ApiTests.cs b/tests/TodoApp.Tests/ApiTests.cs index d3450a7e..a0bcc568 100644 --- a/tests/TodoApp.Tests/ApiTests.cs +++ b/tests/TodoApp.Tests/ApiTests.cs @@ -22,6 +22,8 @@ public ApiTests(TodoAppFixture fixture, ITestOutputHelper outputHelper) Fixture.SetOutputHelper(OutputHelper); } + public virtual CancellationToken CancellationToken => TestContext.Current.CancellationToken; + private TodoAppFixture Fixture { get; } private ITestOutputHelper OutputHelper { get; } @@ -33,7 +35,7 @@ public async Task Can_Manage_Todo_Items_With_Api() using var client = Fixture.CreateDefaultClient(); // Act - Get all the items - var items = await client.GetFromJsonAsync("/api/items"); + var items = await client.GetFromJsonAsync("/api/items", CancellationToken); // Assert - There should be no items Assert.NotNull(items); @@ -46,20 +48,20 @@ public async Task Can_Manage_Todo_Items_With_Api() var newItem = new CreateTodoItemModel { Text = text }; // Act - Add a new item - using var createdResponse = await client.PostAsJsonAsync("/api/items", newItem); + using var createdResponse = await client.PostAsJsonAsync("/api/items", newItem, CancellationToken); // Assert - An item was created Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode); Assert.NotNull(createdResponse.Headers.Location); - using var createdJson = await createdResponse.Content.ReadFromJsonAsync(); + using var createdJson = await createdResponse.Content.ReadFromJsonAsync(CancellationToken); // Arrange - Get the new item's URL and Id var itemUri = createdResponse.Headers.Location; var itemId = createdJson!.RootElement.GetProperty("id").GetString(); // Act - Get the item - var item = await client.GetFromJsonAsync(itemUri); + var item = await client.GetFromJsonAsync(itemUri, CancellationToken); // Assert - Verify the item was created correctly Assert.NotNull(item); @@ -69,12 +71,12 @@ public async Task Can_Manage_Todo_Items_With_Api() Assert.Equal(text, item.Text); // Act - Mark the item as being completed - using var completedResponse = await client.PostAsJsonAsync(itemUri + "/complete", new { }); + using var completedResponse = await client.PostAsJsonAsync(itemUri + "/complete", new { }, CancellationToken); // Assert - The item was completed Assert.Equal(HttpStatusCode.NoContent, completedResponse.StatusCode); - item = await client.GetFromJsonAsync(itemUri); + item = await client.GetFromJsonAsync(itemUri, CancellationToken); Assert.NotNull(item); Assert.Equal(itemId, item.Id); @@ -82,7 +84,7 @@ public async Task Can_Manage_Todo_Items_With_Api() Assert.True(item.IsCompleted); // Act - Get all the items - items = await client.GetFromJsonAsync("/api/items"); + items = await client.GetFromJsonAsync("/api/items", CancellationToken); // Assert - The item was completed Assert.NotNull(items); @@ -97,12 +99,12 @@ public async Task Can_Manage_Todo_Items_With_Api() Assert.NotNull(item.LastUpdated); // Act - Delete the item - using var deletedResponse = await client.DeleteAsync(itemUri); + using var deletedResponse = await client.DeleteAsync(itemUri, CancellationToken); // Assert - The item no longer exists Assert.Equal(HttpStatusCode.NoContent, deletedResponse.StatusCode); - items = await client.GetFromJsonAsync("/api/items"); + items = await client.GetFromJsonAsync("/api/items", CancellationToken); Assert.NotNull(items); Assert.NotNull(items.Items); @@ -110,12 +112,12 @@ public async Task Can_Manage_Todo_Items_With_Api() Assert.DoesNotContain(items.Items, x => x.Id == itemId); // Act - using var getResponse = await client.GetAsync(itemUri); + using var getResponse = await client.GetAsync(itemUri, CancellationToken); // Assert Assert.Equal(HttpStatusCode.NotFound, getResponse.StatusCode); - var problem = await getResponse.Content.ReadFromJsonAsync(); + var problem = await getResponse.Content.ReadFromJsonAsync(CancellationToken); Assert.NotNull(problem); Assert.Equal(StatusCodes.Status404NotFound, problem.Status); @@ -133,12 +135,12 @@ public async Task Cannot_Create_Todo_Item_With_No_Text() var item = new CreateTodoItemModel { Text = string.Empty }; // Act - var response = await client.PostAsJsonAsync("/api/items", item); + var response = await client.PostAsJsonAsync("/api/items", item, CancellationToken); // Assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - var problem = await response.Content.ReadFromJsonAsync(); + var problem = await response.Content.ReadFromJsonAsync(CancellationToken); Assert.NotNull(problem); Assert.Equal(StatusCodes.Status400BadRequest, problem.Status); @@ -155,24 +157,24 @@ public async Task Cannot_Complete_Todo_Item_Multiple_Times() using var client = Fixture.CreateDefaultClient(); var item = new CreateTodoItemModel { Text = "Something" }; - using var createdResponse = await client.PostAsJsonAsync("/api/items", item); + using var createdResponse = await client.PostAsJsonAsync("/api/items", item, CancellationToken); Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode); Assert.NotNull(createdResponse.Headers.Location); var itemUri = createdResponse.Headers.Location; - using var completedResponse = await client.PostAsJsonAsync(itemUri + "/complete", new { }); + using var completedResponse = await client.PostAsJsonAsync(itemUri + "/complete", new { }, CancellationToken); Assert.Equal(HttpStatusCode.NoContent, completedResponse.StatusCode); // Act - using var response = await client.PostAsJsonAsync(itemUri + "/complete", new { }); + using var response = await client.PostAsJsonAsync(itemUri + "/complete", new { }, CancellationToken); // Assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - var problem = await response.Content.ReadFromJsonAsync(); + var problem = await response.Content.ReadFromJsonAsync(CancellationToken); Assert.NotNull(problem); Assert.Equal(StatusCodes.Status400BadRequest, problem.Status); @@ -189,24 +191,24 @@ public async Task Cannot_Complete_Deleted_Todo_Item() using var client = Fixture.CreateDefaultClient(); var item = new CreateTodoItemModel { Text = "Something" }; - using var createdResponse = await client.PostAsJsonAsync("/api/items", item); + using var createdResponse = await client.PostAsJsonAsync("/api/items", item, CancellationToken); Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode); Assert.NotNull(createdResponse.Headers.Location); var itemUri = createdResponse.Headers.Location; - using var deletedResponse = await client.DeleteAsync(itemUri); + using var deletedResponse = await client.DeleteAsync(itemUri, CancellationToken); Assert.Equal(HttpStatusCode.NoContent, deletedResponse.StatusCode); // Act - using var response = await client.PostAsJsonAsync(itemUri + "/complete", new { }); + using var response = await client.PostAsJsonAsync(itemUri + "/complete", new { }, CancellationToken); // Assert Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); - var problem = await response.Content.ReadFromJsonAsync(); + var problem = await response.Content.ReadFromJsonAsync(CancellationToken); Assert.NotNull(problem); Assert.Equal(StatusCodes.Status404NotFound, problem.Status); @@ -223,24 +225,24 @@ public async Task Cannot_Delete_Todo_Item_Multiple_Times() using var client = Fixture.CreateDefaultClient(); var item = new CreateTodoItemModel { Text = "Something" }; - using var createdResponse = await client.PostAsJsonAsync("/api/items", item); + using var createdResponse = await client.PostAsJsonAsync("/api/items", item, CancellationToken); Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode); Assert.NotNull(createdResponse.Headers.Location); var itemUri = createdResponse.Headers.Location; - using var deletedResponse = await client.DeleteAsync(itemUri); + using var deletedResponse = await client.DeleteAsync(itemUri, CancellationToken); Assert.Equal(HttpStatusCode.NoContent, deletedResponse.StatusCode); // Act - using var response = await client.DeleteAsync(itemUri); + using var response = await client.DeleteAsync(itemUri, CancellationToken); // Assert Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); - var problem = await response.Content.ReadFromJsonAsync(); + var problem = await response.Content.ReadFromJsonAsync(CancellationToken); Assert.NotNull(problem); Assert.Equal(StatusCodes.Status404NotFound, problem.Status); diff --git a/tests/TodoApp.Tests/OpenApiTests.cs b/tests/TodoApp.Tests/OpenApiTests.cs index b52ade5f..0d51c9a1 100644 --- a/tests/TodoApp.Tests/OpenApiTests.cs +++ b/tests/TodoApp.Tests/OpenApiTests.cs @@ -40,7 +40,7 @@ public async Task Schema_Is_Correct(string schemaUrl) using var client = Fixture.CreateDefaultClient(); // Act - var actual = await client.GetStringAsync(schemaUrl); + var actual = await client.GetStringAsync(schemaUrl, TestContext.Current.CancellationToken); // Assert var settings = new VerifySettings(); @@ -60,11 +60,11 @@ public async Task Schema_Has_No_Validation_Warnings(string schemaUrl) using var client = Fixture.CreateDefaultClient(); // Act - using var schema = await client.GetStreamAsync(schemaUrl); + using var schema = await client.GetStreamAsync(schemaUrl, TestContext.Current.CancellationToken); // Assert var reader = new OpenApiStreamReader(); - var actual = await reader.ReadAsync(schema); + var actual = await reader.ReadAsync(schema, TestContext.Current.CancellationToken); Assert.Empty(actual.OpenApiDiagnostic.Errors); diff --git a/tests/TodoApp.Tests/TodoApp.Tests.csproj b/tests/TodoApp.Tests/TodoApp.Tests.csproj index 241f5080..dcbe933c 100644 --- a/tests/TodoApp.Tests/TodoApp.Tests.csproj +++ b/tests/TodoApp.Tests/TodoApp.Tests.csproj @@ -2,20 +2,21 @@ false $(NoWarn);CA1861 + Exe TodoApp net9.0 - + - - + + @@ -26,6 +27,5 @@ - diff --git a/tests/TodoApp.Tests/UITests.cs b/tests/TodoApp.Tests/UITests.cs index 848fbc07..089c63ef 100644 --- a/tests/TodoApp.Tests/UITests.cs +++ b/tests/TodoApp.Tests/UITests.cs @@ -91,7 +91,7 @@ await browser.WithPageAsync(async page => await items[0].DeleteAsync(); await items[1].CompleteAsync(); - await Task.Delay(TimeSpan.FromSeconds(0.5)); + await Task.Delay(TimeSpan.FromSeconds(0.5), TestContext.Current.CancellationToken); // Assert items = await app.GetItemsAsync(); @@ -107,13 +107,17 @@ await browser.WithPageAsync(async page => }); } - public Task InitializeAsync() + public ValueTask InitializeAsync() { InstallPlaywright(); - return Task.CompletedTask; + return ValueTask.CompletedTask; } - public Task DisposeAsync() => Task.CompletedTask; + public ValueTask DisposeAsync() + { + GC.SuppressFinalize(this); + return ValueTask.CompletedTask; + } private static void InstallPlaywright() {