Files
go-zero/tools/goctl/rpc/generator/mkdir_test.go

148 lines
3.5 KiB
Go

package generator
import (
"testing"
"github.com/emicklei/proto"
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/tools/goctl/rpc/parser"
)
func TestServiceNameDetermination(t *testing.T) {
tests := []struct {
name string
protoName string
packageName string
hasPackage bool
nameFromFilename bool
expectedName string
}{
{
name: "default uses package name when available",
protoName: "user.proto",
packageName: "userservice",
hasPackage: true,
nameFromFilename: false,
expectedName: "userservice",
},
{
name: "flag enabled uses filename instead of package",
protoName: "user.proto",
packageName: "userservice",
hasPackage: true,
nameFromFilename: true,
expectedName: "user",
},
{
name: "fallback to filename when package is empty",
protoName: "order.proto",
packageName: "",
hasPackage: true,
nameFromFilename: false,
expectedName: "order",
},
{
name: "fallback to filename when package is nil",
protoName: "product.proto",
packageName: "",
hasPackage: false,
nameFromFilename: false,
expectedName: "product",
},
{
name: "flag enabled with nil package uses filename",
protoName: "catalog.proto",
packageName: "",
hasPackage: false,
nameFromFilename: true,
expectedName: "catalog",
},
{
name: "handles proto file with complex name",
protoName: "user-service.proto",
packageName: "user",
hasPackage: true,
nameFromFilename: false,
expectedName: "user",
},
{
name: "handles proto file with complex name and flag",
protoName: "user-service.proto",
packageName: "user",
hasPackage: true,
nameFromFilename: true,
expectedName: "user-service",
},
{
name: "nil context uses package name",
protoName: "account.proto",
packageName: "accountpb",
hasPackage: true,
nameFromFilename: false,
expectedName: "accountpb",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Build the proto struct
p := parser.Proto{
Name: tt.protoName,
}
if tt.hasPackage {
p.Package = parser.Package{
Package: &proto.Package{
Name: tt.packageName,
},
}
}
// Build the context
var ctx *ZRpcContext
if tt.name != "nil context uses package name" {
ctx = &ZRpcContext{
NameFromFilename: tt.nameFromFilename,
}
}
// Call the helper function to determine service name
serviceName := determineServiceName(p, ctx)
assert.Equal(t, tt.expectedName, serviceName)
})
}
}
func TestServiceNameWithNilContext(t *testing.T) {
p := parser.Proto{
Name: "test.proto",
Package: parser.Package{
Package: &proto.Package{
Name: "testpkg",
},
},
}
// nil context should use package name
serviceName := determineServiceName(p, nil)
assert.Equal(t, "testpkg", serviceName)
}
func TestServiceNameFallbackWithEmptyPackage(t *testing.T) {
p := parser.Proto{
Name: "myservice.proto",
Package: parser.Package{
Package: &proto.Package{
Name: "", // empty package name
},
},
}
ctx := &ZRpcContext{
NameFromFilename: false,
}
// Should fall back to filename when package name is empty
serviceName := determineServiceName(p, ctx)
assert.Equal(t, "myservice", serviceName)
}