91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
package route
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"go.ipao.vip/atomctl/v2/pkg/utils/gomod"
|
|
)
|
|
|
|
// Test that @Bind with model(field) on a path parameter generates PathModel[T](field, key)
|
|
func Test_PathModelBind_FromRouteComments(t *testing.T) {
|
|
dir := t.TempDir()
|
|
src := `package v1
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
type User struct{}
|
|
|
|
type Demo struct{}
|
|
|
|
// @Router /users/:id [get]
|
|
// @Bind user path key(id) model(id)
|
|
func (d *Demo) Show(ctx context.Context, user *User) (*User, error) {
|
|
return nil, nil
|
|
}`
|
|
|
|
// minimal go.mod so gomod.GetPackageModuleName works without panic
|
|
gomodPath := filepath.Join(dir, "go.mod")
|
|
goModContent := "module example.com/test\n\ngo 1.23\n"
|
|
if err := os.WriteFile(gomodPath, []byte(goModContent), 0o644); err != nil {
|
|
t.Fatalf("write go.mod: %v", err)
|
|
}
|
|
|
|
if err := gomod.Parse(gomodPath); err != nil {
|
|
t.Fatalf("gomod.Parse error: %v", err)
|
|
}
|
|
|
|
file := filepath.Join(dir, "demo.go")
|
|
if err := os.WriteFile(file, []byte(src), 0o644); err != nil {
|
|
t.Fatalf("write file: %v", err)
|
|
}
|
|
|
|
defs := ParseFile(file)
|
|
if len(defs) != 1 {
|
|
t.Fatalf("expected 1 route definition, got %d", len(defs))
|
|
}
|
|
if len(defs[0].Actions) != 1 {
|
|
t.Fatalf("expected 1 action, got %d", len(defs[0].Actions))
|
|
}
|
|
act := defs[0].Actions[0]
|
|
if len(act.Params) != 1 {
|
|
t.Fatalf("expected 1 param, got %d", len(act.Params))
|
|
}
|
|
p := act.Params[0]
|
|
if p.Position != PositionPath {
|
|
t.Fatalf("expected path position, got %s", p.Position)
|
|
}
|
|
if p.Key != "id" {
|
|
t.Fatalf("expected key=id, got %s", p.Key)
|
|
}
|
|
if p.ModelField != "id" {
|
|
t.Fatalf("expected ModelField=id, got %s", p.ModelField)
|
|
}
|
|
if p.Type != "User" { // pointer should be trimmed for non-local
|
|
t.Fatalf("expected Type=User, got %s", p.Type)
|
|
}
|
|
|
|
// Build render data and check binder token
|
|
rd, err := buildRenderData(RenderBuildOpts{
|
|
PackageName: "v1",
|
|
ProjectPackage: "example.com/test",
|
|
Routes: defs,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("buildRenderData error: %v", err)
|
|
}
|
|
// Render to text and assert PathModel usage
|
|
out, err := renderTemplate(rd)
|
|
if err != nil {
|
|
t.Fatalf("renderTemplate error: %v", err)
|
|
}
|
|
got := string(out)
|
|
if !strings.Contains(got, "PathModel[User](\"id\", \"id\")") {
|
|
t.Fatalf("expected generated code to contain PathModel[User](\"id\", \"id\"), got:\n%s", got)
|
|
}
|
|
}
|