Skip to content

[OpenAPI] Properly handle recursive input types#9855

Merged
tobias-tengler merged 5 commits into
mainfrom
tte/fix-openapi-recursive-input-type
Jun 8, 2026
Merged

[OpenAPI] Properly handle recursive input types#9855
tobias-tengler merged 5 commits into
mainfrom
tte/fix-openapi-recursive-input-type

Conversation

@tobias-tengler

Copy link
Copy Markdown
Member

No description provided.

@tobias-tengler tobias-tengler marked this pull request as ready for review June 5, 2026 12:00
Copilot AI review requested due to automatic review settings June 5, 2026 12:00

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves the OpenAPI adapter’s schema generation so recursive (self-referencing and mutually-referencing) GraphQL input types can be represented safely in OpenAPI by emitting reusable components ($ref) instead of endlessly inlining input-object schemas. It also expands the integration test suite with recursive input/output scenarios and updates snapshots accordingly.

Changes:

  • Refactors DynamicOpenApiDocumentTransformer to introduce a stateful DocumentBuilder that registers input object types as OpenAPI components to break cycles.
  • Adds test schema types + integration tests covering self-referencing and indirect recursive input/output cases.
  • Updates/introduces snapshot files to validate the new OpenAPI output across target frameworks.

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/DynamicOpenApiDocumentTransformer.cs Refactors document building and adds input-component registration to handle recursive input types.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/TestSchema.cs Adds recursive input/output types and operations used by OpenAPI integration tests.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/OpenApiIntegrationTests.cs Adds new integration tests for recursive input/output OpenAPI generation.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.SelfRef_Input_Type_Via_Mutation_Body_NET9_0.json New snapshot for self-referencing input handling (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.SelfRef_Input_Type_Via_Mutation_Body_NET10_0.json New snapshot for self-referencing input handling (NET10).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.SelfRef_Output_Type_Via_Query_NET9_0.json New snapshot for recursive-ish output selection handling (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.SelfRef_Output_Type_Via_Query_NET10_0.json New snapshot for recursive-ish output selection handling (NET10).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.Indirect_Input_Type_Via_Mutation_Body_NET9_0.json New snapshot for indirect recursive input handling (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.Indirect_Input_Type_Via_Mutation_Body_NET10_0.json New snapshot for indirect recursive input handling (NET10).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.Indirect_Output_Type_Via_Query_NET9_0.json New snapshot for indirect recursive output selection handling (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.Indirect_Output_Type_Via_Query_NET10_0.json New snapshot for indirect recursive output selection handling (NET10).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.Indirect_Input_Type_With_Two_Sibling_Occurrences_NET9_0.json New snapshot verifying repeated sibling input occurrences emit $ref consistently (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTests.Indirect_Input_Type_With_Two_Sibling_Occurrences_NET10_0.json New snapshot verifying repeated sibling input occurrences emit $ref consistently (NET10).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OpenApi_Includes_Initial_Routes_NET9_0.json Snapshot update reflecting new componentized input schemas (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OpenApi_Includes_Initial_Routes_NET9_0_Fusion.json Snapshot update reflecting new componentized input schemas for Fusion (NET9).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OpenApi_Includes_Initial_Routes_NET10_0.json Snapshot update reflecting new componentized input schemas (NET10).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OpenApi_Includes_Initial_Routes_NET10_0_Fusion.json Snapshot update reflecting new componentized input schemas for Fusion (NET10).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants