From 107c4d0b001d0f62ec0f43482847e5180253266c Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Fri, 21 Aug 2026 19:37:22 +0100 Subject: [PATCH] test some failling pathes --- src/Yavsc.Blogs.Tests/BlogAclApiTests.cs | 79 ++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/Yavsc.Blogs.Tests/BlogAclApiTests.cs b/src/Yavsc.Blogs.Tests/BlogAclApiTests.cs index 6ce0a95e..12ab0964 100644 --- a/src/Yavsc.Blogs.Tests/BlogAclApiTests.cs +++ b/src/Yavsc.Blogs.Tests/BlogAclApiTests.cs @@ -198,4 +198,83 @@ public sealed class BlogAclApiTests : IClassFixture Assert.Equal(HttpStatusCode.Created, response.StatusCode); } + + /// + /// Payload templates for . + /// Each row carries the shape we want to POST; -1L and + /// -2L are negative sentinels that the test substitutes + /// with the ids of freshly seeded Circle / BlogPost + /// rows before sending, so every shape lands against a real + /// principal entity and the seeded fixtures are not dead. + /// + public static IEnumerable BlogAclPayloadsForNever500() + { + + var circleId = SeedCircle("alice", "test", isPublic: true); + var postId = SeedBlogPost("alice", "Billet ACL test"); + // circleId only (the historical bug shape, 2026-08-21 mercure): + // must be rejected, never 500. + yield return new PostAccessControlRulePayload?[] + { + new PostAccessControlRulePayload + { + BlogPostId = postId, + CircleId = circleId + }, + + new PostAccessControlRulePayload + { + BlogPostId = -1, + CircleId = circleId + } + }; + + // Empty body: must be rejected at validation/auth, never 500. + yield return new PostAccessControlRulePayload?[] + { + new PostAccessControlRulePayload + { + BlogPostId = -1, + CircleId = -1 + } + }; + + // blogPostId only: must be rejected, never 500. + yield return new PostAccessControlRulePayload?[] + { + new PostAccessControlRulePayload + { + BlogPostId = -2, + CircleId = -1 + } + }; + + // Explicit BlogPostId = 0 (default(long)): must be rejected, + // never 500. This is the precise shape that EF Core's + // shaper used to crash on. + yield return new PostAccessControlRulePayload?[] + { + new PostAccessControlRulePayload(), + null + }; + } + + /// + /// Hard rule (Paul, 2026-08-21): a 500 is never acceptable + /// + [Theory] + [MemberData(nameof(BlogAclPayloadsForNever500))] + public async Task PostCircleAuthorization_never_returns_500( + Dictionary payload) + { + ResetDatabaseWithAlice(); + using var http = NewClient("alice"); + + + var response = await http.PostAsJsonAsync( + BlogAclUrl(), payload, + TestContext.Current.CancellationToken); + + Assert.NotEqual(HttpStatusCode.InternalServerError, response.StatusCode); + } }