From 8e3861d4b3615d6bf976d94fa42a7d01a3c2281b Mon Sep 17 00:00:00 2001 From: Havunen Date: Sun, 18 Feb 2024 19:36:02 +0200 Subject: [PATCH] Add support for any kind of example object when schema is string type preferring the serialized result. Fixes https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/2088 --- .../XmlComments/ExampleParser.cs | 17 +++++++++++++++-- ...otSwashbuckle.AspNetCore.SwaggerGen.Test.xml | 14 ++++++++++++++ .../Fixtures/XmlAnnotatedType.cs | 17 +++++++++++++++++ .../XmlComments/XmlCommentsSchemaFilterTests.cs | 2 ++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/DotSwashbuckle.AspNetCore.SwaggerGen/XmlComments/ExampleParser.cs b/src/DotSwashbuckle.AspNetCore.SwaggerGen/XmlComments/ExampleParser.cs index fdb03cbf4a..26dc344c32 100644 --- a/src/DotSwashbuckle.AspNetCore.SwaggerGen/XmlComments/ExampleParser.cs +++ b/src/DotSwashbuckle.AspNetCore.SwaggerGen/XmlComments/ExampleParser.cs @@ -14,13 +14,26 @@ SchemaRepository schemaRepository ) { var resolvedType = schema?.ResolveType(schemaRepository); - var shouldBeQuoted = ( + var isStringSchema = ( string.Equals(resolvedType, "string", StringComparison.Ordinal) || string.Equals(resolvedType, "array", StringComparison.Ordinal) ) && !string.Equals(example, "null", StringComparison.Ordinal); var exampleValue = WhiteSpaceCleaner.Condense(example); - return OpenApiAnyFactory.CreateFromJson(shouldBeQuoted ? $"\"{exampleValue}\"" : exampleValue); + + var serializedSchema = OpenApiAnyFactory.CreateFromJson(exampleValue); + + if (serializedSchema != null) + { + return serializedSchema; + } + + if (isStringSchema) + { + return new OpenApiString(exampleValue); + } + + return null; } } } diff --git a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/DotSwashbuckle.AspNetCore.SwaggerGen.Test.xml b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/DotSwashbuckle.AspNetCore.SwaggerGen.Test.xml index 1b730f6a6e..b0213726e3 100644 --- a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/DotSwashbuckle.AspNetCore.SwaggerGen.Test.xml +++ b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/DotSwashbuckle.AspNetCore.SwaggerGen.Test.xml @@ -269,6 +269,20 @@ Then Publication = 333284-2023 + + + For test only + + For test only + "Test-Test-Test" + + + + For test only + + For test only + {"someKey": "someValue"} + Summary for StringPropertyWithUri diff --git a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs index 314cb21ce7..2abce1d9bc 100644 --- a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs +++ b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/Fixtures/XmlAnnotatedType.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Runtime.Serialization; using DotSwashbuckle.AspNetCore.TestSupport; namespace DotSwashbuckle.AspNetCore.SwaggerGen.Test @@ -80,6 +81,22 @@ public class XmlAnnotatedType /// public string MultiLineSummaryExample { get; set; } + /// + /// For test only + /// + /// For test only + /// "Test-Test-Test" + [DataMember(Name = "testProperty", EmitDefaultValue = false)] + public string QuoteProperty { get; set; } + + /// + /// For test only + /// + /// For test only + /// {"someKey": "someValue"} + [DataMember(Name = "testProperty", EmitDefaultValue = false)] + public string KvpExampleProperty { get; set; } + /// /// Summary for StringPropertyWithUri /// diff --git a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs index f239f7c6e9..4af1deb06e 100644 --- a/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs +++ b/test/DotSwashbuckle.AspNetCore.SwaggerGen.Test/XmlComments/XmlCommentsSchemaFilterTests.cs @@ -74,6 +74,8 @@ public void Apply_SetsDescription_FromPropertySummaryTag( [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.StringPropertyWithNullExample), "string", "null")] [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.StringPropertyWithUri), "string", "\"https://test.com/a?b=1&c=2\"")] [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.MultiLineSummaryExample), "string", "\"When Number equals 2023/S 106-333284 Then Publication = 333284-2023\"")] + [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.QuoteProperty), "string", "\"Test-Test-Test\"")] + [InlineData(typeof(XmlAnnotatedType), nameof(XmlAnnotatedType.KvpExampleProperty), "string", "{\n \"someKey\": \"someValue\"\n}")] [InlineData(typeof(XmlAnnotatedRecord), nameof(XmlAnnotatedRecord.BoolProperty), "boolean", "true")] [InlineData(typeof(XmlAnnotatedRecord), nameof(XmlAnnotatedRecord.IntProperty), "integer", "10")] [InlineData(typeof(XmlAnnotatedRecord), nameof(XmlAnnotatedRecord.LongProperty), "integer", "4294967295")]