From 61daf57e54fe22fc22091628f3d5eb49413ee660 Mon Sep 17 00:00:00 2001 From: Michael Staib Date: Wed, 18 Mar 2026 19:09:35 +0000 Subject: [PATCH] Fix Nitro tool options override --- .../EndpointRouteBuilderExtensions.cs | 23 +++++++++++++- .../ToolConfigurationFileMiddlewareTests.cs | 31 +++++++++++++++++++ ...ns_Override_Using_Global_Tool_Options.snap | 14 +++++++++ ..._Disabled_With_ServerOptions_Override.snap | 5 +++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_Config_With_ServerOptions_Override_Using_Global_Tool_Options.snap create mode 100644 src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_When_Disabled_With_ServerOptions_Override.snap diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs index 981c18cc2ac..f4d876322de 100644 --- a/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs +++ b/src/HotChocolate/AspNetCore/src/AspNetCore.Pipeline/Extensions/EndpointRouteBuilderExtensions.cs @@ -529,7 +529,28 @@ public static GraphQLEndpointConventionBuilder WithOptions( this GraphQLEndpointConventionBuilder builder, Action configure) { - builder.Add(c => c.Metadata.Add(new GraphQLServerOptionsOverride(configure))); + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(configure); + + builder.Add(c => + { + c.Metadata.Add(new GraphQLServerOptionsOverride(configure)); + + var options = new GraphQLServerOptions(); + + for (var i = c.Metadata.Count - 1; i >= 0; i--) + { + if (c.Metadata[i] is NitroAppOptions toolOptions) + { + options.Tool = toolOptions.Clone(); + break; + } + } + + configure(options); + c.Metadata.Add(options.Tool); + }); + return builder; } diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/ToolConfigurationFileMiddlewareTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/ToolConfigurationFileMiddlewareTests.cs index a58c1a91403..70dd42875b8 100644 --- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/ToolConfigurationFileMiddlewareTests.cs +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/ToolConfigurationFileMiddlewareTests.cs @@ -100,6 +100,37 @@ public async Task Fetch_Tool_When_Disabled(string version) result.MatchSnapshot(); } + [Fact] + public async Task Fetch_Tool_When_Disabled_With_ServerOptions_Override() + { + // arrange + var server = CreateStarWarsServer( + configureConventions: e => e.WithOptions(o => o.Tool.Enable = false)); + + // act + var result = await GetAsync(server, "/graphql/index.html"); + + // assert + result.MatchSnapshot(); + } + + [Fact] + public async Task Fetch_Tool_Config_With_ServerOptions_Override_Using_Global_Tool_Options() + { + // arrange + var server = CreateStarWarsServer( + configureServices: s => s + .AddGraphQL() + .ModifyServerOptions(o => o.Tool.Title = "Global"), + configureConventions: e => e.WithOptions(o => o.Tool.Title += " Local")); + + // act + var result = await GetNitroConfigAsync(server); + + // assert + result.MatchSnapshot(); + } + [Fact] public async Task Fetch_Tool_Config_With_Options() { diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_Config_With_ServerOptions_Override_Using_Global_Tool_Options.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_Config_With_ServerOptions_Override_Using_Global_Tool_Options.snap new file mode 100644 index 00000000000..b34b0720814 --- /dev/null +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_Config_With_ServerOptions_Override_Using_Global_Tool_Options.snap @@ -0,0 +1,14 @@ +{ + "Content": "{\"title\":\"Global Local\",\"useBrowserUrlAsEndpoint\":true,\"useGet\":false}", + "ContentType": { + "CharSet": "utf-8", + "Parameters": [ + { + "Name": "charset", + "Value": "utf-8" + } + ], + "MediaType": "application/json" + }, + "StatusCode": "OK" +} diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_When_Disabled_With_ServerOptions_Override.snap b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_When_Disabled_With_ServerOptions_Override.snap new file mode 100644 index 00000000000..78021ca7e7c --- /dev/null +++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/__snapshots__/ToolConfigurationFileMiddlewareTests.Fetch_Tool_When_Disabled_With_ServerOptions_Override.snap @@ -0,0 +1,5 @@ +{ + "Content": "", + "ContentType": null, + "StatusCode": "NotFound" +}