Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,10 @@ private String resolveModelName(String title, String modelName) {
}
}

private static boolean isEnumSchema(Schema model) {
return model != null && model.getEnum() != null && !model.getEnum().isEmpty();
}

private String matchGenerated(Schema model) {
if (skipSchemaReuse) { // skip reusing schema
return null;
Expand All @@ -862,9 +866,18 @@ private String matchGenerated(Schema model) {
}
// Structural match: compare with volatile fields stripped at every level.
// See generatedStructuralSignature field for a full explanation of why this is needed.
String structural = computeStructuralSignature(model);
if (generatedStructuralSignature.containsKey(structural)) {
return generatedStructuralSignature.get(structural);
//
// Skip this fallback for enum schemas: the structural matcher strips 'description',
// but for an enum the description is the only thing distinguishing two schemas that
// share the same values yet represent different things (e.g. two properties whose
// enums happen to list the same values but mean different things). Stripping it would
// wrongly unify them and make the second usage silently reuse the first enum's type
// (#23978). Enum schemas therefore dedup on exact content only.
if (!isEnumSchema(model)) {
String structural = computeStructuralSignature(model);
if (generatedStructuralSignature.containsKey(structural)) {
return generatedStructuralSignature.get(structural);
}
}
} catch (JsonProcessingException e) {
e.printStackTrace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1385,6 +1385,45 @@ public void resolveInlineModelDeduplicatesWhenParserMutatesPropertyTypes() {
schemas.get("StorageBackend_1"));
}

@Test
public void doNotMergeDistinctInlineEnumsSharingTheSameValues() {
// Regression test for #23978: two inline enum properties that share the same enum values
// but represent different things (distinguished only by their description) must each be
// promoted to their own schema. The structural-signature fallback in matchGenerated()
// strips 'description', so without an enum guard it would wrongly unify them and the
// second property would silently reuse the first enum's type (regression in 7.23.0).
OpenAPI openapi = new OpenAPI();
openapi.setComponents(new Components());
openapi.setPaths(new Paths());

StringSchema statusEnum = new StringSchema();
statusEnum.setDescription("Lifecycle status of the order");
statusEnum.setEnum(java.util.Arrays.asList("ACTIVE", "INACTIVE"));

StringSchema visibilityEnum = new StringSchema();
visibilityEnum.setDescription("Whether the order is visible to the customer");
visibilityEnum.setEnum(java.util.Arrays.asList("ACTIVE", "INACTIVE"));

openapi.getComponents().addSchemas("Order", new ObjectSchema()
.title("Order")
.addProperty("status", statusEnum)
.addProperty("visibility", visibilityEnum));

InlineModelResolver resolver = new InlineModelResolver();
Map<String, String> options = new HashMap<>();
options.put("RESOLVE_INLINE_ENUMS", "true");
resolver.setInlineSchemaOptions(options);
resolver.flatten(openapi);

Schema order = openapi.getComponents().getSchemas().get("Order");
String statusRef = ((Schema) order.getProperties().get("status")).get$ref();
String visibilityRef = ((Schema) order.getProperties().get("visibility")).get$ref();
assertNotNull("status enum must be promoted to its own schema", statusRef);
assertNotNull("visibility enum must be promoted to its own schema", visibilityRef);
assertFalse("Distinct inline enums sharing the same values must not be merged (#23978)",
statusRef.equals(visibilityRef));
}

@Test
public void deduplicateComponentsRemovesNumberedDuplicateOfTitledSchemaAndRewritesRefs() {
// Regression test: when flattening creates a numbered duplicate of a titled component
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ docs/models/TestCollectionEndingWithWordList.md
docs/models/TestCollectionEndingWithWordListObject.md
docs/models/TestDescendants.md
docs/models/TestDescendantsObjectType.md
docs/models/TestEnumParametersEnumHeaderStringParameter.md
docs/models/TestEnumParametersEnumQueryDoubleParameter.md
docs/models/TestEnumParametersEnumQueryIntegerParameter.md
docs/models/TestEnumParametersRequestEnumFormString.md
Expand Down Expand Up @@ -289,6 +290,7 @@ src/Org.OpenAPITools/Model/TestCollectionEndingWithWordList.cs
src/Org.OpenAPITools/Model/TestCollectionEndingWithWordListObject.cs
src/Org.OpenAPITools/Model/TestDescendants.cs
src/Org.OpenAPITools/Model/TestDescendantsObjectType.cs
src/Org.OpenAPITools/Model/TestEnumParametersEnumHeaderStringParameter.cs
src/Org.OpenAPITools/Model/TestEnumParametersEnumQueryDoubleParameter.cs
src/Org.OpenAPITools/Model/TestEnumParametersEnumQueryIntegerParameter.cs
src/Org.OpenAPITools/Model/TestEnumParametersRequestEnumFormString.cs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ paths:
name: enum_header_string
required: false
schema:
$ref: "#/components/schemas/testEnumParameters_request_enum_form_string"
$ref: "#/components/schemas/testEnumParameters_enum_header_string_parameter"
style: simple
- description: Query parameter enum test (string array)
explode: true
Expand All @@ -790,7 +790,7 @@ paths:
name: enum_query_string
required: false
schema:
$ref: "#/components/schemas/testEnumParameters_request_enum_form_string"
$ref: "#/components/schemas/testEnumParameters_enum_header_string_parameter"
style: form
- description: Query parameter enum test (double)
explode: true
Expand Down Expand Up @@ -2819,6 +2819,13 @@ components:
enum_form_string:
$ref: "#/components/schemas/testEnumParameters_request_enum_form_string"
type: object
testEnumParameters_enum_header_string_parameter:
default: -efg
enum:
- _abc
- -efg
- (xyz)
type: string
testEnumParameters_enum_query_integer_parameter:
enum:
- 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ void (empty response body)

<a id="testenumparameters"></a>
# **TestEnumParameters**
> void TestEnumParameters (TestEnumParametersRequestEnumFormString enumFormString = null, List<TestEnumParametersRequestEnumFormStringArrayInner> enumFormStringArray = null, TestEnumParametersRequestEnumFormString enumHeaderString = null, List<TestEnumParametersRequestEnumFormStringArrayInner> enumHeaderStringArray = null, TestEnumParametersEnumQueryDoubleParameter enumQueryDouble = null, TestEnumParametersEnumQueryIntegerParameter enumQueryInteger = null, TestEnumParametersRequestEnumFormString enumQueryString = null, List<TestEnumParametersRequestEnumFormStringArrayInner> enumQueryStringArray = null)
> void TestEnumParameters (TestEnumParametersRequestEnumFormString enumFormString = null, List<TestEnumParametersRequestEnumFormStringArrayInner> enumFormStringArray = null, TestEnumParametersEnumHeaderStringParameter enumHeaderString = null, List<TestEnumParametersRequestEnumFormStringArrayInner> enumHeaderStringArray = null, TestEnumParametersEnumQueryDoubleParameter enumQueryDouble = null, TestEnumParametersEnumQueryIntegerParameter enumQueryInteger = null, TestEnumParametersEnumHeaderStringParameter enumQueryString = null, List<TestEnumParametersRequestEnumFormStringArrayInner> enumQueryStringArray = null)

To test enum parameters

Expand All @@ -496,11 +496,11 @@ To test enum parameters
|------|------|-------------|-------|
| **enumFormString** | **TestEnumParametersRequestEnumFormString** | | [optional] |
| **enumFormStringArray** | [**List&lt;TestEnumParametersRequestEnumFormStringArrayInner&gt;**](TestEnumParametersRequestEnumFormStringArrayInner.md) | Form parameter enum test (string array) | [optional] |
| **enumHeaderString** | **TestEnumParametersRequestEnumFormString** | Header parameter enum test (string) | [optional] |
| **enumHeaderString** | **TestEnumParametersEnumHeaderStringParameter** | Header parameter enum test (string) | [optional] |
| **enumHeaderStringArray** | [**List&lt;TestEnumParametersRequestEnumFormStringArrayInner&gt;**](TestEnumParametersRequestEnumFormStringArrayInner.md) | Header parameter enum test (string array) | [optional] |
| **enumQueryDouble** | **TestEnumParametersEnumQueryDoubleParameter** | Query parameter enum test (double) | [optional] |
| **enumQueryInteger** | **TestEnumParametersEnumQueryIntegerParameter** | Query parameter enum test (double) | [optional] |
| **enumQueryString** | **TestEnumParametersRequestEnumFormString** | Query parameter enum test (string) | [optional] |
| **enumQueryString** | **TestEnumParametersEnumHeaderStringParameter** | Query parameter enum test (string) | [optional] |
| **enumQueryStringArray** | [**List&lt;TestEnumParametersRequestEnumFormStringArrayInner&gt;**](TestEnumParametersRequestEnumFormStringArrayInner.md) | Query parameter enum test (string array) | [optional] |

### Return type
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Org.OpenAPITools.Model.TestEnumParametersEnumHeaderStringParameter

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------

[[Back to Model list]](../../README.md#documentation-for-models) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to README]](../../README.md)

Original file line number Diff line number Diff line change
Expand Up @@ -217,11 +217,11 @@ public async Task TestEnumParametersAsyncTest()
{
Client.Option<TestEnumParametersRequestEnumFormString> enumFormString = default;
Client.Option<List<TestEnumParametersRequestEnumFormStringArrayInner>> enumFormStringArray = default;
Client.Option<TestEnumParametersRequestEnumFormString> enumHeaderString = default;
Client.Option<TestEnumParametersEnumHeaderStringParameter> enumHeaderString = default;
Client.Option<List<TestEnumParametersRequestEnumFormStringArrayInner>> enumHeaderStringArray = default;
Client.Option<TestEnumParametersEnumQueryDoubleParameter> enumQueryDouble = default;
Client.Option<TestEnumParametersEnumQueryIntegerParameter> enumQueryInteger = default;
Client.Option<TestEnumParametersRequestEnumFormString> enumQueryString = default;
Client.Option<TestEnumParametersEnumHeaderStringParameter> enumQueryString = default;
Client.Option<List<TestEnumParametersRequestEnumFormStringArrayInner>> enumQueryStringArray = default;
await _instance.TestEnumParametersAsync(enumFormString, enumFormStringArray, enumHeaderString, enumHeaderStringArray, enumQueryDouble, enumQueryInteger, enumQueryString, enumQueryStringArray);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* OpenAPI Petstore
*
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
*
* The version of the OpenAPI document: 1.0.0
* Generated by: https://github.com/openapitools/openapi-generator.git
*/


using Xunit;

using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
using Org.OpenAPITools.Model;
using Org.OpenAPITools.Client;
using System.Reflection;

namespace Org.OpenAPITools.Test.Model
{
/// <summary>
/// Class for testing TestEnumParametersEnumHeaderStringParameter
/// </summary>
/// <remarks>
/// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech).
/// Please update the test case below to test the model.
/// </remarks>
public class TestEnumParametersEnumHeaderStringParameterTests : IDisposable
{
// TODO uncomment below to declare an instance variable for TestEnumParametersEnumHeaderStringParameter
//private TestEnumParametersEnumHeaderStringParameter instance;

public TestEnumParametersEnumHeaderStringParameterTests()
{
// TODO uncomment below to create an instance of TestEnumParametersEnumHeaderStringParameter
//instance = new TestEnumParametersEnumHeaderStringParameter();
}

public void Dispose()
{
// Cleanup when everything is done.
}

/// <summary>
/// Test an instance of TestEnumParametersEnumHeaderStringParameter
/// </summary>
[Fact]
public void TestEnumParametersEnumHeaderStringParameterInstanceTest()
{
// TODO uncomment below to test "IsType" TestEnumParametersEnumHeaderStringParameter
//Assert.IsType<TestEnumParametersEnumHeaderStringParameter>(instance);
}
}
}
Loading
Loading