From 812400f3038f5aaaec1faa80eb7b2de07379d18c Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 00:39:04 +0000 Subject: [PATCH] feat(openapi): keep empty describable group tags Co-Authored-By: Virgil --- openapi.go | 2 +- openapi_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/openapi.go b/openapi.go index 4156883..7b379fb 100644 --- a/openapi.go +++ b/openapi.go @@ -586,7 +586,7 @@ func (sb *SpecBuilder) buildTags(groups []preparedRouteGroup) []map[string]any { for _, g := range groups { name := strings.TrimSpace(g.group.Name()) - if name != "" && !seen[name] && (!g.describable || len(g.descs) > 0) { + if name != "" && !seen[name] { tags = append(tags, map[string]any{ "name": name, "description": name + " endpoints", diff --git a/openapi_test.go b/openapi_test.go index cc50d27..10798ea 100644 --- a/openapi_test.go +++ b/openapi_test.go @@ -1469,6 +1469,50 @@ func TestSpecBuilder_Good_NonDescribableGroup(t *testing.T) { } } +func TestSpecBuilder_Good_EmptyDescribableGroupStillAddsTag(t *testing.T) { + sb := &api.SpecBuilder{ + Title: "Test", + Version: "1.0.0", + } + + group := &specStubGroup{ + name: "empty", + basePath: "/api/empty", + descs: nil, + } + + data, err := sb.Build([]api.RouteGroup{group}) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + var spec map[string]any + if err := json.Unmarshal(data, &spec); err != nil { + t.Fatalf("invalid JSON: %v", err) + } + + tags := spec["tags"].([]any) + foundEmpty := false + for _, tag := range tags { + tm := tag.(map[string]any) + if tm["name"] == "empty" { + foundEmpty = true + break + } + } + if !foundEmpty { + t.Fatal("expected empty describable group to appear in spec tags") + } + + paths := spec["paths"].(map[string]any) + if len(paths) != 1 { + t.Fatalf("expected only /health path, got %d paths", len(paths)) + } + if _, ok := paths["/health"]; !ok { + t.Fatal("expected /health path in spec") + } +} + func TestSpecBuilder_Good_DefaultTagsFromGroupName(t *testing.T) { sb := &api.SpecBuilder{ Title: "Test",