Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/aspnetcore.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Halter <halter73@gmail.com>2022-05-21 04:13:26 +0300
committerStephen Halter <halter73@gmail.com>2022-05-21 04:13:26 +0300
commitb39b5136e977aef6b6da18dbef20c7ee11efbb1f (patch)
tree3ade7ba8355b1b6686d5415662156271e6563296
parent8a4b4deb09c04134f22f8d39aae21d212282004f (diff)
Support multiple calls to WithTags in WithOpenApihalter73/more-tags
-rw-r--r--src/OpenApi/src/OpenApiGenerator.cs22
-rw-r--r--src/OpenApi/test/OpenApiGeneratorTests.cs31
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();
+ }
+ }
}