From c9eb9ddc89be507d762a0af08734fb90cdcde812 Mon Sep 17 00:00:00 2001 From: rmorris Date: Sat, 6 Mar 2021 08:18:33 +0000 Subject: [PATCH] Support DefaultValueAttribute on parameter-based schemas --- .../SchemaGenerator/SchemaGenerator.cs | 12 +++++++++--- .../JsonSerializerSchemaGeneratorTests.cs | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs index f71fea83d..922ab81e8 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/SchemaGenerator.cs @@ -112,13 +112,19 @@ private OpenApiSchema GenerateSchemaForParameter(ParameterInfo parameterInfo, Sc if (schema.Reference == null) { - if (parameterInfo.HasDefaultValue) + var customAttributes = parameterInfo.GetCustomAttributes(); + + var defaultValue = parameterInfo.HasDefaultValue + ? parameterInfo.DefaultValue + : customAttributes.OfType().FirstOrDefault()?.Value; + + if (defaultValue != null) { - var defaultAsJson = dataContract.JsonConverter(parameterInfo.DefaultValue); + var defaultAsJson = dataContract.JsonConverter(defaultValue); schema.Default = OpenApiAnyFactory.CreateFromJson(defaultAsJson); } - schema.ApplyValidationAttributes(parameterInfo.GetCustomAttributes()); + schema.ApplyValidationAttributes(customAttributes); ApplyFilters(schema, parameterInfo.ParameterType, schemaRepository, parameterInfo: parameterInfo); } diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs index a761f0627..bd2ea2912 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs @@ -12,7 +12,6 @@ using Xunit; using Swashbuckle.AspNetCore.TestSupport; using Microsoft.OpenApi.Any; -using System.Collections.ObjectModel; namespace Swashbuckle.AspNetCore.SwaggerGen.Test { @@ -334,6 +333,22 @@ public void GenerateSchema_SetsReadOnlyAndWriteOnlyFlags_IfPropertyIsRestricted( Assert.True(schema.Properties["WriteOnlyProperty"].WriteOnly); } + [Fact] + public void GenerateSchema_SetsDefault_IfParameterHasDefaultValueAttribute() + { + var schemaRepository = new SchemaRepository(); + + var parameterInfo = typeof(FakeController) + .GetMethod(nameof(FakeController.ActionWithIntParameterWithDefaultValueAttribute)) + .GetParameters() + .First(); + + var schema = Subject().GenerateSchema(parameterInfo.ParameterType, schemaRepository, parameterInfo: parameterInfo); + + Assert.NotNull(schema.Default); + Assert.Equal("3", schema.Default.ToJson()); + } + [Theory] [InlineData(typeof(ComplexType), typeof(ComplexType), "string")] [InlineData(typeof(GenericType), typeof(GenericType), "string")]