Skip to content
Merged
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 @@ -49,9 +49,28 @@ private IOpenApiSchema GenerateSchemaForMember(
? GeneratePolymorphicSchema(schemaRepository, knownTypesDataContracts)
: GenerateConcreteSchema(dataContract, schemaRepository);

if (_generatorOptions.UseAllOfToExtendReferenceSchemas && schema is OpenApiSchemaReference reference)
if (schema is OpenApiSchemaReference reference)
{
schema = new OpenApiSchema() { AllOf = [reference] };
if (_generatorOptions.UseAllOfToExtendReferenceSchemas)
{
schema = new OpenApiSchema() { AllOf = [reference] };
}
else
{
var customAttributes = memberInfo.GetInlineAndMetadataAttributes();

var defaultValueAttribute = customAttributes.OfType<DefaultValueAttribute>().FirstOrDefault();
if (defaultValueAttribute != null)
{
reference.Default = GenerateDefaultValue(dataContract, modelType, defaultValueAttribute.Value);
}

var obsoleteAttribute = customAttributes.OfType<ObsoleteAttribute>().FirstOrDefault();
if (obsoleteAttribute != null)
{
reference.Deprecated = true;
}
}
}
Comment thread
martincostello marked this conversation as resolved.

if (schema is OpenApiSchema concrete)
Expand Down Expand Up @@ -96,9 +115,11 @@ private IOpenApiSchema GenerateSchemaForMember(
.Where(t => t.IsGenericType)
.ToArray();

var isDictionaryType =
genericTypes.Any(t => t.GetGenericTypeDefinition() == typeof(IDictionary<,>)) ||
genericTypes.Any(t => t.GetGenericTypeDefinition() == typeof(IReadOnlyDictionary<,>));
var isDictionaryType = genericTypes.Any(static (type) =>
{
var definition = type.GetGenericTypeDefinition();
return definition == typeof(IDictionary<,>) || definition == typeof(IReadOnlyDictionary<,>);
});

if (isDictionaryType && schema.AdditionalProperties is OpenApiSchema additionalProperties)
{
Expand Down Expand Up @@ -138,9 +159,25 @@ private IOpenApiSchema GenerateSchemaForParameter(
? GeneratePolymorphicSchema(schemaRepository, knownTypesDataContracts)
: GenerateConcreteSchema(dataContract, schemaRepository);

if (_generatorOptions.UseAllOfToExtendReferenceSchemas && schema is OpenApiSchemaReference reference)
if (schema is OpenApiSchemaReference reference)
{
schema = new OpenApiSchema() { AllOf = [reference] };
if (_generatorOptions.UseAllOfToExtendReferenceSchemas)
{
schema = new OpenApiSchema() { AllOf = [reference] };
}
else
{
var customAttributes = parameterInfo.GetCustomAttributes();

var defaultValue = parameterInfo.HasDefaultValue
? parameterInfo.DefaultValue
: customAttributes.OfType<DefaultValueAttribute>().FirstOrDefault()?.Value;

if (defaultValue != null)
{
reference.Default = GenerateDefaultValue(dataContract, modelType, defaultValue);
}
}
}

if (schema is OpenApiSchema concrete)
Expand Down Expand Up @@ -438,7 +475,7 @@ private OpenApiSchema CreateObjectSchema(DataContract dataContract, SchemaReposi

var memberType = dataProperty.MemberType;

schema.Properties[dataProperty.Name] = (dataProperty.MemberInfo != null)
schema.Properties[dataProperty.Name] = dataProperty.MemberInfo != null
? GenerateSchemaForMember(memberType, schemaRepository, dataProperty.MemberInfo, dataProperty)
: GenerateSchemaForType(memberType, schemaRepository);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,21 @@ public static TheoryData<ClientGeneratorTool, string> SnapshotTestCases()

foreach (var tool in Enum.GetValues<ClientGeneratorTool>())
{
if (tool is ClientGeneratorTool.NSwag && Path.GetFileNameWithoutExtension(path).Contains("Basic.Startup"))
var fileName = Path.GetFileNameWithoutExtension(path);

if (fileName.Contains("Basic.Startup"))
{
// NSwag doesn't generate valid compilation due to a missing FileResponse type
continue;
if (tool is ClientGeneratorTool.NSwag)
{
// NSwag doesn't generate valid compilation due to a missing FileResponse type
continue;
}

if (!fileName.Contains("=v1."))
{
// Ignore duplicative test cases for Swagger 2.0 and OpenAPI 3.1
continue;
}
}

if (ClientGenerator.IsSupported(tool, "json", version))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ public class SwaggerIntegrationTests(ITestOutputHelper outputHelper)
{
[Theory]
[InlineData(typeof(Basic.Startup), "/swagger/v1/swagger.json")]
[InlineData(typeof(Basic.Startup), "/swagger/v1/swaggerv2.json")]
[InlineData(typeof(Basic.Startup), "/swagger/v1/swaggerv3_1.json")]
[InlineData(typeof(CliExample.Startup), "/swagger/v1/swagger_net10.0.json")]
[InlineData(typeof(ConfigFromFile.Startup), "/swagger/v1/swagger.json")]
[InlineData(typeof(CustomUIConfig.Startup), "/swagger/v1/swagger.json")]
Expand Down
7 changes: 5 additions & 2 deletions test/Swashbuckle.AspNetCore.IntegrationTests/VerifyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public partial class VerifyTests(ITestOutputHelper outputHelper)

[Theory]
[InlineData(typeof(Basic.Startup), "/swagger/v1/swagger.json")]
[InlineData(typeof(Basic.Startup), "/swagger/v1/swaggerv2.json", "2.0")]
[InlineData(typeof(Basic.Startup), "/swagger/v1/swaggerv3_1.json", "3.1")]
[InlineData(typeof(NSwagClientExample.Startup), "/swagger/v1/swagger.json")]
[InlineData(typeof(CliExample.Startup), "/swagger/v1/swagger_net10.0.json")]
[InlineData(typeof(ConfigFromFile.Startup), "/swagger/v1/swagger.json")]
Expand All @@ -24,7 +26,8 @@ public partial class VerifyTests(ITestOutputHelper outputHelper)
[InlineData(typeof(TestFirst.Startup), "/swagger/v1-generated/openapi.json")]
public async Task SwaggerEndpoint_ReturnsValidSwaggerJson(
Type startupType,
string swaggerRequestUri)
string swaggerRequestUri,
string openApiVersion = null)
{
var testSite = new TestSite(startupType, outputHelper);
using var client = testSite.BuildClient();
Expand All @@ -34,7 +37,7 @@ public async Task SwaggerEndpoint_ReturnsValidSwaggerJson(

await Verify(NormalizeLineBreaks(swagger))
.UseDirectory(SnapshotsDirectory)
.UseParameters(startupType, GetVersion(swaggerRequestUri));
.UseParameters(startupType, openApiVersion ?? GetVersion(swaggerRequestUri));
}

[Fact]
Expand Down
Loading
Loading