From 58c3092ae361a3f611a1506ed24505357dbda12e Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 25 Feb 2026 12:08:45 +0000 Subject: [PATCH] Fix payload error mapping for multiple constructors --- .../src/Types.Errors/ErrorFactoryCompiler.cs | 2 +- .../ErrorMiddlewareTests.cs | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/HotChocolate/Core/src/Types.Errors/ErrorFactoryCompiler.cs b/src/HotChocolate/Core/src/Types.Errors/ErrorFactoryCompiler.cs index 70416ea7ee8..b3dde1f0404 100644 --- a/src/HotChocolate/Core/src/Types.Errors/ErrorFactoryCompiler.cs +++ b/src/HotChocolate/Core/src/Types.Errors/ErrorFactoryCompiler.cs @@ -174,7 +174,7 @@ private static bool TryCreateFactoryFromConstructor( Expression.Assign(variable, createError), previous is null ? Expression.Assign(variable, nullValue) - : Expression.Assign(variable, previous)); + : previous); } } diff --git a/src/HotChocolate/Core/test/Types.Mutations.Tests/ErrorMiddlewareTests.cs b/src/HotChocolate/Core/test/Types.Mutations.Tests/ErrorMiddlewareTests.cs index 0a394b03984..443cdfed764 100644 --- a/src/HotChocolate/Core/test/Types.Mutations.Tests/ErrorMiddlewareTests.cs +++ b/src/HotChocolate/Core/test/Types.Mutations.Tests/ErrorMiddlewareTests.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using HotChocolate.Execution; using HotChocolate.Execution.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -195,6 +196,38 @@ await Snapshot.Create() .MatchAsync(); } + [Fact] + public async Task ErrorMiddleware_Should_MapMultipleConstructors_FirstEx() + { + // Arrange + var executor = + await BuildSchemaAsync( + () => throw new InvalidOperationException(), + field => field.Error()); + + // Act + var res = await executor.ExecuteAsync(Query); + + // Assert + AssertMappedPayloadError(res, "InvalidOperationException"); + } + + [Fact] + public async Task ErrorMiddleware_Should_MapMultipleConstructors_SecondEx() + { + // Arrange + var executor = + await BuildSchemaAsync( + () => throw new NullReferenceException(), + field => field.Error()); + + // Act + var res = await executor.ExecuteAsync(Query); + + // Assert + AssertMappedPayloadError(res, "NullReferenceException"); + } + [Fact] public async Task ErrorMiddleware_Should_MapMultipleFactories_When_InterfaceIsUsed() { @@ -366,6 +399,21 @@ public CustomNullRef CreateErrorFrom(NullReferenceException ex) } } + public class CustomErrorWithMultipleConstructors + { + public CustomErrorWithMultipleConstructors(InvalidOperationException _) + { + Message = "InvalidOperationException"; + } + + public CustomErrorWithMultipleConstructors(NullReferenceException _) + { + Message = "NullReferenceException"; + } + + public string Message { get; } + } + public class CustomErrorPayloadErrorFactory : IPayloadErrorFactory , IPayloadErrorFactory @@ -429,4 +477,20 @@ public class Payload { public string Foo() => "Bar"; } + + private static void AssertMappedPayloadError(IExecutionResult result, string expectedMessage) + { + using var document = JsonDocument.Parse(result.ToJson()); + + Assert.False(document.RootElement.TryGetProperty("errors", out _)); + + var message = document.RootElement + .GetProperty("data") + .GetProperty("throw") + .GetProperty("errors")[0] + .GetProperty("message") + .GetString(); + + Assert.Equal(expectedMessage, message); + } }