diff options
author | Stephen Halter <halter73@gmail.com> | 2022-05-21 04:13:26 +0300 |
---|---|---|
committer | Stephen Halter <halter73@gmail.com> | 2022-05-21 04:13:26 +0300 |
commit | b39b5136e977aef6b6da18dbef20c7ee11efbb1f (patch) | |
tree | 3ade7ba8355b1b6686d5415662156271e6563296 | |
parent | 8a4b4deb09c04134f22f8d39aae21d212282004f (diff) |
Support multiple calls to WithTags in WithOpenApihalter73/more-tags
-rw-r--r-- | src/OpenApi/src/OpenApiGenerator.cs | 22 | ||||
-rw-r--r-- | src/OpenApi/test/OpenApiGeneratorTests.cs | 31 |
2 files changed, 49 insertions, 4 deletions
diff --git a/src/OpenApi/src/OpenApiGenerator.cs b/src/OpenApi/src/OpenApiGenerator.cs index 4936bfba13..eb80857184 100644 --- a/src/OpenApi/src/OpenApiGenerator.cs +++ b/src/OpenApi/src/OpenApiGenerator.cs @@ -328,7 +328,23 @@ internal sealed class OpenApiGenerator private List<OpenApiTag> GetOperationTags(MethodInfo methodInfo, EndpointMetadataCollection metadata) { - var tags = metadata.GetMetadata<ITagsMetadata>(); + var metadataList = metadata.GetOrderedMetadata<ITagsMetadata>(); + + if (metadataList.Count > 0) + { + var tags = new List<OpenApiTag>(); + + foreach (var metadataItem in metadataList) + { + foreach (var tag in metadataItem.Tags) + { + tags.Add(new OpenApiTag() { Name = tag }); + } + } + + return tags; + } + string controllerName; if (methodInfo.DeclaringType is not null && !TypeHelper.IsCompilerGeneratedType(methodInfo.DeclaringType)) @@ -342,9 +358,7 @@ internal sealed class OpenApiGenerator controllerName = _environment?.ApplicationName ?? string.Empty; } - return tags is not null - ? tags.Tags.Select(tag => new OpenApiTag() { Name = tag }).ToList() - : new List<OpenApiTag>() { new OpenApiTag() { Name = controllerName } }; + return new List<OpenApiTag>() { new OpenApiTag() { Name = controllerName } }; } private List<OpenApiParameter> GetOpenApiParameters(MethodInfo methodInfo, EndpointMetadataCollection metadata, RoutePattern pattern, bool disableInferredBody) diff --git a/src/OpenApi/test/OpenApiGeneratorTests.cs b/src/OpenApi/test/OpenApiGeneratorTests.cs index 1d9b84f359..ca88ef7eea 100644 --- a/src/OpenApi/test/OpenApiGeneratorTests.cs +++ b/src/OpenApi/test/OpenApiGeneratorTests.cs @@ -4,6 +4,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Security.Claims; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Metadata; using Microsoft.AspNetCore.Mvc; @@ -51,6 +52,23 @@ public class OpenApiOperationGeneratorTests } [Fact] + public void UsesTagsFromMultipleCallsToWithTags() + { + var testBuilder = new TestEndpointConventionBuilder(); + var routeHandlerBuilder = new RouteHandlerBuilder(new[] { testBuilder }); + + routeHandlerBuilder + .WithTags("A") + .WithTags("B"); + + var operation = GetOpenApiOperation(() => { }, additionalMetadata: testBuilder.Metadata.ToArray()); + + Assert.Collection(operation.Tags, + tag => Assert.Equal("A", tag.Name), + tag => Assert.Equal("B", tag.Name)); + } + + [Fact] public void ThrowsInvalidOperationExceptionGivenUnnamedParameter() { var unnamedParameter = Expression.Parameter(typeof(int)); @@ -923,4 +941,17 @@ public class OpenApiOperationGeneratorTests public InferredJsonClass FromBody { get; set; } public HttpContext Context { get; set; } } + + private class TestEndpointConventionBuilder : EndpointBuilder, IEndpointConventionBuilder + { + public void Add(Action<EndpointBuilder> convention) + { + convention(this); + } + + public override Endpoint Build() + { + throw new NotImplementedException(); + } + } } |