Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/clientgen/openapi/openapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ func (g *Generator) newOperationForEncoding(rpc *meta.RPC, method string, reqEnc
Summary: summary,
Description: desc,
OperationID: method + ":" + rpc.ServiceName + "." + rpc.Name,
Tags: rpc.GetOpenapiTags(),
Responses: make(openapi3.Responses),
}

Expand Down
133 changes: 133 additions & 0 deletions pkg/clientgen/openapi/openapi_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package openapi

import (
"bytes"
"encoding/json"
"testing"

qt "github.com/frankban/quicktest"
"github.com/getkin/kin-openapi/openapi3"

"encr.dev/pkg/clientgen/clientgentypes"
meta "encr.dev/proto/encore/parser/meta/v1"
)

func TestOpenAPITagsGeneration(t *testing.T) {
c := qt.New(t)

// Create test metadata with OpenAPI tags
md := &meta.Data{
Svcs: []*meta.Service{
{
Name: "users",
Rpcs: []*meta.RPC{
{
Name: "GetUser",
ServiceName: "users",
AccessType: meta.RPC_PUBLIC,
Path: &meta.Path{
Segments: []*meta.PathSegment{
{Type: meta.PathSegment_LITERAL, Value: "users"},
{Type: meta.PathSegment_PARAM, Value: "id", ValueType: meta.PathSegment_STRING},
},
},
HttpMethods: []string{"GET"},
OpenapiTags: []string{"Users", "Management"},
},
{
Name: "CreateUser",
ServiceName: "users",
AccessType: meta.RPC_PUBLIC,
Path: &meta.Path{
Segments: []*meta.PathSegment{
{Type: meta.PathSegment_LITERAL, Value: "users"},
},
},
HttpMethods: []string{"POST"},
OpenapiTags: []string{"Users"},
},
},
},
},
}

// Generate OpenAPI spec
gen := New(Initial)
params := clientgentypes.GenerateParams{
Meta: md,
AppSlug: "test-app",
Services: clientgentypes.NewServiceSet(md, []string{"users"}, []string{}),
Tags: clientgentypes.NewTagSet([]string{}, []string{}),
Options: clientgentypes.Options{},
Buf: &bytes.Buffer{},
}

err := gen.Generate(params)
c.Assert(err, qt.IsNil)

// Parse generated JSON
var spec openapi3.T
err = json.Unmarshal(params.Buf.Bytes(), &spec)
c.Assert(err, qt.IsNil)

// Test GetUser endpoint has multiple tags
getUserOp := spec.Paths["/users/{id}"].Get
c.Assert(getUserOp, qt.Not(qt.IsNil))
c.Assert(getUserOp.Tags, qt.DeepEquals, []string{"Users", "Management"})

// Test CreateUser endpoint has single tag
createUserOp := spec.Paths["/users"].Post
c.Assert(createUserOp, qt.Not(qt.IsNil))
c.Assert(createUserOp.Tags, qt.DeepEquals, []string{"Users"})
}

func TestOpenAPINoTagsGeneration(t *testing.T) {
c := qt.New(t)

// Create test metadata without OpenAPI tags
md := &meta.Data{
Svcs: []*meta.Service{
{
Name: "users",
Rpcs: []*meta.RPC{
{
Name: "GetUser",
ServiceName: "users",
AccessType: meta.RPC_PUBLIC,
Path: &meta.Path{
Segments: []*meta.PathSegment{
{Type: meta.PathSegment_LITERAL, Value: "users"},
},
},
HttpMethods: []string{"GET"},
OpenapiTags: []string{}, // No OpenAPI tags
},
},
},
},
}

// Generate OpenAPI spec
gen := New(Initial)
params := clientgentypes.GenerateParams{
Meta: md,
AppSlug: "test-app",
Services: clientgentypes.NewServiceSet(md, []string{"users"}, []string{}),
Tags: clientgentypes.NewTagSet([]string{}, []string{}),
Options: clientgentypes.Options{},
Buf: &bytes.Buffer{},
}

err := gen.Generate(params)
c.Assert(err, qt.IsNil)

// Parse generated JSON
var spec openapi3.T
err = json.Unmarshal(params.Buf.Bytes(), &spec)
c.Assert(err, qt.IsNil)

// Test endpoint has no tags
getUserOp := spec.Paths["/users"].Get
c.Assert(getUserOp, qt.Not(qt.IsNil))
c.Assert(getUserOp.Tags, qt.HasLen, 0)
}
Loading