Просмотр исходного кода

Make ProblemDetails settable in ProblemDetailsContext (#48510)

* make problemdetails settable in problemdetailscontext

fixes #47633
bjornen77 2 лет назад
Родитель
Сommit
c1f7320f7f

+ 1 - 1
src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetailsContext.cs

@@ -29,7 +29,7 @@ public sealed class ProblemDetailsContext
     public ProblemDetails ProblemDetails
     {
         get => _problemDetails ??= new ProblemDetails();
-        init => _problemDetails = value;
+        set => _problemDetails = value;
     }
 
     /// <summary>

+ 2 - 0
src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt

@@ -10,6 +10,8 @@ Microsoft.AspNetCore.Http.Metadata.IRouteDiagnosticsMetadata
 Microsoft.AspNetCore.Http.Metadata.IRouteDiagnosticsMetadata.Route.get -> string!
 Microsoft.AspNetCore.Http.ProblemDetailsContext.Exception.get -> System.Exception?
 Microsoft.AspNetCore.Http.ProblemDetailsContext.Exception.init -> void
+*REMOVED*Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetails.init -> void
+Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetails.set -> void
 Microsoft.AspNetCore.Mvc.ProblemDetails.Extensions.set -> void
 static Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.Create(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> Microsoft.AspNetCore.Http.EndpointFilterInvocationContext!
 static Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.Create<T1, T2, T3, T4, T5, T6, T7, T8>(Microsoft.AspNetCore.Http.HttpContext! httpContext, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) -> Microsoft.AspNetCore.Http.EndpointFilterInvocationContext!

+ 24 - 0
src/Http/Http.Abstractions/test/ProblemDetailsContextTests.cs

@@ -0,0 +1,24 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Microsoft.AspNetCore.Http.Abstractions.Tests;
+
+public class ProblemDetailsContextTests
+{
+    [Fact]
+    public void ProblemDetailsPropertySetter_Should_SetProblemDetails()
+    {
+        // Arrange
+        ProblemDetailsContext context = new() { HttpContext = new DefaultHttpContext() };
+        ProblemDetails problemDetails = new();
+
+        // Act
+        context.ProblemDetails = problemDetails;
+
+        // Assert
+        Assert.Equal(problemDetails, context.ProblemDetails);
+    }
+}

+ 39 - 0
src/Http/Http.Extensions/test/ProblemDetailsDefaultWriterTest.cs

@@ -54,6 +54,45 @@ public partial class DefaultProblemDetailsWriterTest
         Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
     }
 
+    [Fact]
+    public async Task WriteAsync_Works_WhenReplacingProblemDetailsUsingSetter()
+    {
+        // Arrange
+        var writer = GetWriter();
+        var stream = new MemoryStream();
+        var context = CreateContext(stream);
+        var originalProblemDetails = new ProblemDetails();
+
+        var expectedProblem = new ProblemDetails()
+        {
+            Detail = "Custom Bad Request",
+            Instance = "Custom Bad Request",
+            Status = StatusCodes.Status400BadRequest,
+            Type = "https://tools.ietf.org/html/rfc9110#section-15.5.1-custom",
+            Title = "Custom Bad Request",
+        };
+        var problemDetailsContext = new ProblemDetailsContext()
+        {
+            HttpContext = context,
+            ProblemDetails = originalProblemDetails
+        };
+
+        problemDetailsContext.ProblemDetails = expectedProblem;
+
+        //Act
+        await writer.WriteAsync(problemDetailsContext);
+
+        //Assert
+        stream.Position = 0;
+        var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream, SerializerOptions);
+        Assert.NotNull(problemDetails);
+        Assert.Equal(expectedProblem.Status, problemDetails.Status);
+        Assert.Equal(expectedProblem.Type, problemDetails.Type);
+        Assert.Equal(expectedProblem.Title, problemDetails.Title);
+        Assert.Equal(expectedProblem.Detail, problemDetails.Detail);
+        Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
+    }
+
     [Fact]
     public async Task WriteAsync_Works_WithJsonContext()
     {

+ 39 - 0
src/Mvc/Mvc.Core/test/Infrastructure/DefaultApiProblemDetailsWriterTest.cs

@@ -51,6 +51,45 @@ public class DefaultApiProblemDetailsWriterTest
         Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
     }
 
+        [Fact]
+    public async Task WriteAsync_Works_WhenReplacingProblemDetailsUsingSetter()
+    {
+        // Arrange
+        var writer = GetWriter();
+        var stream = new MemoryStream();
+        var context = CreateContext(stream);
+        var originalProblemDetails = new ProblemDetails();
+
+        var expectedProblem = new ProblemDetails()
+        {
+            Detail = "Custom Bad Request",
+            Instance = "Custom Bad Request",
+            Status = StatusCodes.Status400BadRequest,
+            Type = "https://tools.ietf.org/html/rfc9110#section-15.5.1-custom",
+            Title = "Custom Bad Request",
+        };
+        var problemDetailsContext = new ProblemDetailsContext()
+        {
+            HttpContext = context,
+            ProblemDetails = originalProblemDetails
+        };
+
+        problemDetailsContext.ProblemDetails = expectedProblem;
+
+        //Act
+        await writer.WriteAsync(problemDetailsContext);
+
+        //Assert
+        stream.Position = 0;
+        var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream, new JsonSerializerOptions(JsonSerializerDefaults.Web));
+        Assert.NotNull(problemDetails);
+        Assert.Equal(expectedProblem.Status, problemDetails.Status);
+        Assert.Equal(expectedProblem.Type, problemDetails.Type);
+        Assert.Equal(expectedProblem.Title, problemDetails.Title);
+        Assert.Equal(expectedProblem.Detail, problemDetails.Detail);
+        Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
+    }
+
     [Fact]
     public async Task WriteAsync_AddExtensions()
     {