tests(blogs): pass TestContext.Current.CancellationToken to HTTP calls
xUnit1051: HTTP helpers (GetAsync, PostAsJsonAsync, PutAsJsonAsync,
DeleteAsync) accept a CancellationToken that the test runner can use
to cancel a long-running suite. Forwarding TestContext.Current.
CancellationToken to every call lets the runner respond to Ctrl+C /
--blame-hang-timeout at the granularity of a single test instead of
the whole process.
Covers PublishEndpointTests (10 calls), CircleMembersApiTests
(11 calls) and BlogApiMappedClaimsTests (9 calls). BlogApiTests.cs
was already clean after 1868ed86.
This commit is contained in:
parent
7f03dd7272
commit
e35786a205
3 changed files with 29 additions and 29 deletions
|
|
@ -79,10 +79,10 @@ public sealed class BlogApiMappedClaimsTests : IClassFixture<MappedClaimsBlogsWe
|
||||||
DateModified = DateTime.UtcNow
|
DateModified = DateTime.UtcNow
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await http.PostAsJsonAsync("/api/v1/blog", draft);
|
var response = await http.PostAsJsonAsync("/api/v1/blog", draft, TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
|
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
|
||||||
|
|
||||||
var created = await response.Content.ReadFromJsonAsync<BlogPost>();
|
var created = await response.Content.ReadFromJsonAsync<BlogPost>(TestContext.Current.CancellationToken);
|
||||||
Assert.NotNull(created);
|
Assert.NotNull(created);
|
||||||
Assert.Equal("mapped-user", created!.AuthorId);
|
Assert.Equal("mapped-user", created!.AuthorId);
|
||||||
}
|
}
|
||||||
|
|
@ -101,10 +101,10 @@ public sealed class BlogApiMappedClaimsTests : IClassFixture<MappedClaimsBlogsWe
|
||||||
Article = "Contenu initial.",
|
Article = "Contenu initial.",
|
||||||
DateCreated = DateTime.UtcNow,
|
DateCreated = DateTime.UtcNow,
|
||||||
DateModified = DateTime.UtcNow
|
DateModified = DateTime.UtcNow
|
||||||
});
|
}, TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode);
|
||||||
var created = await createdResponse.Content.ReadFromJsonAsync<BlogPost>();
|
var created = await createdResponse.Content.ReadFromJsonAsync<BlogPost>(TestContext.Current.CancellationToken);
|
||||||
Assert.NotNull(created);
|
Assert.NotNull(created);
|
||||||
|
|
||||||
var updateResponse = await http.PutAsJsonAsync($"/api/v1/blog/{created!.Id}", new BlogPost
|
var updateResponse = await http.PutAsJsonAsync($"/api/v1/blog/{created!.Id}", new BlogPost
|
||||||
|
|
@ -115,7 +115,7 @@ public sealed class BlogApiMappedClaimsTests : IClassFixture<MappedClaimsBlogsWe
|
||||||
Article = "Contenu mis à jour.",
|
Article = "Contenu mis à jour.",
|
||||||
DateCreated = created.DateCreated,
|
DateCreated = created.DateCreated,
|
||||||
DateModified = DateTime.UtcNow
|
DateModified = DateTime.UtcNow
|
||||||
});
|
}, TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.NoContent, updateResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.NoContent, updateResponse.StatusCode);
|
||||||
}
|
}
|
||||||
|
|
@ -134,10 +134,10 @@ public sealed class BlogApiMappedClaimsTests : IClassFixture<MappedClaimsBlogsWe
|
||||||
Article = "Contenu initial.",
|
Article = "Contenu initial.",
|
||||||
DateCreated = DateTime.UtcNow,
|
DateCreated = DateTime.UtcNow,
|
||||||
DateModified = DateTime.UtcNow
|
DateModified = DateTime.UtcNow
|
||||||
});
|
}, TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.Created, createdResponse.StatusCode);
|
||||||
var created = await createdResponse.Content.ReadFromJsonAsync<BlogPost>();
|
var created = await createdResponse.Content.ReadFromJsonAsync<BlogPost>(TestContext.Current.CancellationToken);
|
||||||
Assert.NotNull(created);
|
Assert.NotNull(created);
|
||||||
|
|
||||||
using var otherHttp = NewClient(subject: "mapped-other");
|
using var otherHttp = NewClient(subject: "mapped-other");
|
||||||
|
|
@ -149,7 +149,7 @@ public sealed class BlogApiMappedClaimsTests : IClassFixture<MappedClaimsBlogsWe
|
||||||
Article = "Contenu non autorisé.",
|
Article = "Contenu non autorisé.",
|
||||||
DateCreated = created.DateCreated,
|
DateCreated = created.DateCreated,
|
||||||
DateModified = DateTime.UtcNow
|
DateModified = DateTime.UtcNow
|
||||||
});
|
}, TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.Unauthorized, updateResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.Unauthorized, updateResponse.StatusCode);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -113,10 +113,10 @@ public sealed class CircleMembersApiTests : IClassFixture<BlogsWebServerFixture>
|
||||||
var circleId = SeedCircle("alice", "Famille");
|
var circleId = SeedCircle("alice", "Famille");
|
||||||
using var http = NewClient("alice");
|
using var http = NewClient("alice");
|
||||||
|
|
||||||
var response = await http.GetAsync(MembersUrl(circleId));
|
var response = await http.GetAsync(MembersUrl(circleId), TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||||
using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
|
using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync(TestContext.Current.CancellationToken));
|
||||||
Assert.Equal(JsonValueKind.Array, doc.RootElement.ValueKind);
|
Assert.Equal(JsonValueKind.Array, doc.RootElement.ValueKind);
|
||||||
Assert.Equal(0, doc.RootElement.GetArrayLength());
|
Assert.Equal(0, doc.RootElement.GetArrayLength());
|
||||||
}
|
}
|
||||||
|
|
@ -130,14 +130,14 @@ public sealed class CircleMembersApiTests : IClassFixture<BlogsWebServerFixture>
|
||||||
|
|
||||||
var postResponse = await http.PostAsJsonAsync(
|
var postResponse = await http.PostAsJsonAsync(
|
||||||
MembersUrl(circleId),
|
MembersUrl(circleId),
|
||||||
new { userId = "bob" });
|
new { userId = "bob" }, TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
Assert.Equal(HttpStatusCode.Created, postResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.Created, postResponse.StatusCode);
|
||||||
|
|
||||||
var getResponse = await http.GetAsync(MembersUrl(circleId));
|
var getResponse = await http.GetAsync(MembersUrl(circleId), TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.OK, getResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, getResponse.StatusCode);
|
||||||
|
|
||||||
using var doc = JsonDocument.Parse(await getResponse.Content.ReadAsStringAsync());
|
using var doc = JsonDocument.Parse(await getResponse.Content.ReadAsStringAsync(TestContext.Current.CancellationToken));
|
||||||
Assert.Equal(JsonValueKind.Array, doc.RootElement.ValueKind);
|
Assert.Equal(JsonValueKind.Array, doc.RootElement.ValueKind);
|
||||||
Assert.Equal(1, doc.RootElement.GetArrayLength());
|
Assert.Equal(1, doc.RootElement.GetArrayLength());
|
||||||
var member = doc.RootElement[0];
|
var member = doc.RootElement[0];
|
||||||
|
|
@ -155,12 +155,12 @@ public sealed class CircleMembersApiTests : IClassFixture<BlogsWebServerFixture>
|
||||||
|
|
||||||
var first = await http.PostAsJsonAsync(
|
var first = await http.PostAsJsonAsync(
|
||||||
MembersUrl(circleId),
|
MembersUrl(circleId),
|
||||||
new { userId = "bob" });
|
new { userId = "bob" }, TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.Created, first.StatusCode);
|
Assert.Equal(HttpStatusCode.Created, first.StatusCode);
|
||||||
|
|
||||||
var second = await http.PostAsJsonAsync(
|
var second = await http.PostAsJsonAsync(
|
||||||
MembersUrl(circleId),
|
MembersUrl(circleId),
|
||||||
new { userId = "bob" });
|
new { userId = "bob" }, TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.Conflict, second.StatusCode);
|
Assert.Equal(HttpStatusCode.Conflict, second.StatusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,14 +171,14 @@ public sealed class CircleMembersApiTests : IClassFixture<BlogsWebServerFixture>
|
||||||
var circleId = SeedCircle("alice", "Famille");
|
var circleId = SeedCircle("alice", "Famille");
|
||||||
using var http = NewClient("alice");
|
using var http = NewClient("alice");
|
||||||
|
|
||||||
await http.PostAsJsonAsync(MembersUrl(circleId), new { userId = "bob" });
|
await http.PostAsJsonAsync(MembersUrl(circleId), new { userId = "bob" }, TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
var deleteResponse = await http.DeleteAsync(
|
var deleteResponse = await http.DeleteAsync(
|
||||||
$"{MembersUrl(circleId)}/bob");
|
$"{MembersUrl(circleId)}/bob", TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.OK, deleteResponse.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, deleteResponse.StatusCode);
|
||||||
|
|
||||||
var getResponse = await http.GetAsync(MembersUrl(circleId));
|
var getResponse = await http.GetAsync(MembersUrl(circleId), TestContext.Current.CancellationToken);
|
||||||
using var doc = JsonDocument.Parse(await getResponse.Content.ReadAsStringAsync());
|
using var doc = JsonDocument.Parse(await getResponse.Content.ReadAsStringAsync(TestContext.Current.CancellationToken));
|
||||||
Assert.Equal(0, doc.RootElement.GetArrayLength());
|
Assert.Equal(0, doc.RootElement.GetArrayLength());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -190,7 +190,7 @@ public sealed class CircleMembersApiTests : IClassFixture<BlogsWebServerFixture>
|
||||||
var circleId = SeedCircle("alice", "Famille");
|
var circleId = SeedCircle("alice", "Famille");
|
||||||
using var http = NewClient("bob");
|
using var http = NewClient("bob");
|
||||||
|
|
||||||
var response = await http.GetAsync(MembersUrl(circleId));
|
var response = await http.GetAsync(MembersUrl(circleId), TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
// 404, not 403 — the controller deliberately avoids leaking
|
// 404, not 403 — the controller deliberately avoids leaking
|
||||||
// the existence of someone else's circle.
|
// the existence of someone else's circle.
|
||||||
|
|
|
||||||
|
|
@ -100,12 +100,12 @@ public sealed class PublishEndpointTests : IClassFixture<BlogsWebServerFixture>
|
||||||
var postId = SeedPost("alice");
|
var postId = SeedPost("alice");
|
||||||
|
|
||||||
using var http = NewClient("alice");
|
using var http = NewClient("alice");
|
||||||
var put = await http.PutAsJsonAsync(PublishUrl(postId), new { publish = true });
|
var put = await http.PutAsJsonAsync(PublishUrl(postId), new { publish = true }, TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.NoContent, put.StatusCode);
|
Assert.Equal(HttpStatusCode.NoContent, put.StatusCode);
|
||||||
|
|
||||||
var get = await http.GetAsync($"{BlogsUrl}/{postId}");
|
var get = await http.GetAsync($"{BlogsUrl}/{postId}", TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.OK, get.StatusCode);
|
Assert.Equal(HttpStatusCode.OK, get.StatusCode);
|
||||||
using var doc = JsonDocument.Parse(await get.Content.ReadAsStringAsync());
|
using var doc = JsonDocument.Parse(await get.Content.ReadAsStringAsync(TestContext.Current.CancellationToken));
|
||||||
Assert.True(doc.RootElement.GetProperty("isPublished").GetBoolean());
|
Assert.True(doc.RootElement.GetProperty("isPublished").GetBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -116,12 +116,12 @@ public sealed class PublishEndpointTests : IClassFixture<BlogsWebServerFixture>
|
||||||
var postId = SeedPost("alice");
|
var postId = SeedPost("alice");
|
||||||
|
|
||||||
using var http = NewClient("alice");
|
using var http = NewClient("alice");
|
||||||
await http.PutAsJsonAsync(PublishUrl(postId), new { publish = true });
|
await http.PutAsJsonAsync(PublishUrl(postId), new { publish = true }, TestContext.Current.CancellationToken);
|
||||||
var put = await http.PutAsJsonAsync(PublishUrl(postId), new { publish = false });
|
var put = await http.PutAsJsonAsync(PublishUrl(postId), new { publish = false }, TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.NoContent, put.StatusCode);
|
Assert.Equal(HttpStatusCode.NoContent, put.StatusCode);
|
||||||
|
|
||||||
var get = await http.GetAsync($"{BlogsUrl}/{postId}");
|
var get = await http.GetAsync($"{BlogsUrl}/{postId}", TestContext.Current.CancellationToken);
|
||||||
using var doc = JsonDocument.Parse(await get.Content.ReadAsStringAsync());
|
using var doc = JsonDocument.Parse(await get.Content.ReadAsStringAsync(TestContext.Current.CancellationToken));
|
||||||
Assert.False(doc.RootElement.GetProperty("isPublished").GetBoolean());
|
Assert.False(doc.RootElement.GetProperty("isPublished").GetBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -130,7 +130,7 @@ public sealed class PublishEndpointTests : IClassFixture<BlogsWebServerFixture>
|
||||||
{
|
{
|
||||||
ResetDatabase();
|
ResetDatabase();
|
||||||
using var http = NewClient("alice");
|
using var http = NewClient("alice");
|
||||||
var put = await http.PutAsJsonAsync(PublishUrl(99999L), new { publish = true });
|
var put = await http.PutAsJsonAsync(PublishUrl(99999L), new { publish = true }, TestContext.Current.CancellationToken);
|
||||||
Assert.Equal(HttpStatusCode.NotFound, put.StatusCode);
|
Assert.Equal(HttpStatusCode.NotFound, put.StatusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,7 +141,7 @@ public sealed class PublishEndpointTests : IClassFixture<BlogsWebServerFixture>
|
||||||
var postId = SeedPost("alice");
|
var postId = SeedPost("alice");
|
||||||
|
|
||||||
using var http = NewClient("bob");
|
using var http = NewClient("bob");
|
||||||
var put = await http.PutAsJsonAsync(PublishUrl(postId), new { publish = true });
|
var put = await http.PutAsJsonAsync(PublishUrl(postId), new { publish = true }, TestContext.Current.CancellationToken);
|
||||||
// 401 Challenge (the controller returns Challenge()
|
// 401 Challenge (the controller returns Challenge()
|
||||||
// for AuthorizationFailureException). The exact code
|
// for AuthorizationFailureException). The exact code
|
||||||
// is framework-dependent; what matters is "not 204".
|
// is framework-dependent; what matters is "not 204".
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue