diff --git a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGeneratorOptions.cs b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGeneratorOptions.cs index ba659c64ae..58477ebbdf 100644 --- a/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGeneratorOptions.cs +++ b/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGeneratorOptions.cs @@ -110,7 +110,10 @@ private IList DefaultTagsSelector(ApiDescription apiDescription) private string DefaultSortKeySelector(ApiDescription apiDescription) { - return TagsSelector(apiDescription).First(); + return TagsSelector(apiDescription).FirstOrDefault() + ?? apiDescription.RelativePath + ?? apiDescription.ActionDescriptor?.DisplayName + ?? string.Empty; } private static string DefaultPathGroupSelector(ApiDescription apiDescription) diff --git a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs index b315d7f4ab..41b0aca750 100644 --- a/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs +++ b/test/Swashbuckle.AspNetCore.SwaggerGen.Test/SwaggerGenerator/SwaggerGeneratorTests.cs @@ -1408,6 +1408,32 @@ public void GetSwagger_CanReadTagsFromMetadata() Assert.Equal(["Some", "Tags", "Here"], [.. document.Paths["/resource"].Operations[HttpMethod.Post].Tags?.Select(t => t.Reference.Id)]); } + [Fact] + public void GetSwagger_DoesNotThrow_WhenTagsMetadataIsEmpty() + { + var methodInfo = typeof(FakeController).GetMethod(nameof(FakeController.ActionWithParameter)); + var actionDescriptor = new ActionDescriptor + { + EndpointMetadata = [new TagsAttribute()], + RouteValues = new Dictionary + { + ["controller"] = methodInfo.DeclaringType.Name.Replace("Controller", string.Empty) + } + }; + var subject = Subject( + apiDescriptions: + [ + ApiDescriptionFactory.Create(actionDescriptor, methodInfo, groupName: "v1", httpMethod: "POST", relativePath: "resource"), + ] + ); + + var document = subject.GetSwagger("v1"); + + Assert.Equal(["/resource"], [.. document.Paths.Keys]); + Assert.Single(document.Paths["/resource"].Operations); + Assert.Empty(document.Paths["/resource"].Operations[HttpMethod.Post].Tags); + } + [Fact] public void GetSwagger_CanReadEndpointSummaryFromMetadata() {