chore: Embed unit test data (#1812)

* Embed unit test data

* Add testdata

Co-authored-by: anqiansong <anqiansong@bytedance.com>
This commit is contained in:
anqiansong
2022-04-21 21:49:09 +08:00
committed by GitHub
parent 14bf2f33f7
commit 16c61c6657
27 changed files with 388 additions and 315 deletions

View File

@@ -1,6 +1,7 @@
package gogen
import (
_ "embed"
goformat "go/format"
"io/ioutil"
"os"
@@ -10,314 +11,45 @@ import (
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/tools/goctl/api/parser"
"github.com/zeromicro/go-zero/tools/goctl/rpc/execx"
"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
)
const testApiTemplate = `
info(
title: doc title
desc: ">
doc description first part,
doc description second part<"
version: 1.0
var (
//go:embed testdata/test_api_template.api
testApiTemplate string
//go:embed testdata/test_multi_service_template.api
testMultiServiceTemplate string
//go:embed testdata/ap_ino_info.api
apiNoInfo string
//go:embed testdata/invalid_api_file.api
invalidApiFile string
//go:embed testdata/anonymous_annotation.api
anonymousAnnotation string
//go:embed testdata/api_has_middleware.api
apiHasMiddleware string
//go:embed testdata/api_jwt.api
apiJwt string
//go:embed testdata/api_jwt_with_middleware.api
apiJwtWithMiddleware string
//go:embed testdata/api_has_no_request.api
apiHasNoRequest string
//go:embed testdata/api_route_test.api
apiRouteTest string
//go:embed testdata/has_comment_api_test.api
hasCommentApiTest string
//go:embed testdata/has_inline_no_exist_test.api
hasInlineNoExistTest string
//go:embed testdata/import_api.api
importApi string
//go:embed testdata/has_import_api.api
hasImportApi string
//go:embed testdata/no_struct_tag_api.api
noStructTagApi string
//go:embed testdata/nest_type_api.api
nestTypeApi string
)
// TODO: test
// {
type Request struct { // TODO: test
// TODO
Name string ` + "`" + `path:"name,options=you|me"` + "`" + ` // }
} // TODO: test
// TODO: test
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
@server(
// C0
group: greet/s1
)
// C1
service A-api {
// C2
@server( // C3
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response) // hello
// C4
@handler NoResponseHandler // C5
get /greet/get(Request)
}
`
const testMultiServiceTemplate = `
info(
title: doc title
desc: doc description first part
version: 1.0
)
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
service A-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
service A-api {
@server(
handler: NoResponseHandler
)
get /greet/get(Request)
}
`
const apiNoInfo = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
service A-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
`
const invalidApiFile = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
service A-api
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
`
const anonymousAnnotation = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}
`
const apiHasMiddleware = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
@server(
middleware: TokenValidate
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}
`
const apiJwt = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
@server(
jwt: Auth
signature: true
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}
`
const apiJwtWithMiddleware = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
@server(
jwt: Auth
jwtTransition: Trans
middleware: TokenValidate
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}
`
const apiHasNoRequest = `
service A-api {
@handler GreetHandler
post /greet/ping ()
}
`
const apiRouteTest = `
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + `
}
service A-api {
@handler NormalHandler
get /greet/from/:name(Request) returns (Response)
@handler NoResponseHandler
get /greet/from/:sex(Request)
@handler NoRequestHandler
get /greet/from/request returns (Response)
@handler NoRequestNoResponseHandler
get /greet/from
}
`
const hasCommentApiTest = `
type Inline struct {
}
type Request struct {
Inline
Name string ` + "`" + `path:"name,options=you|me"` + "`" + ` // name in path
}
type Response struct {
Message string ` + "`" + `json:"msg"` + "`" + ` // message
}
service A-api {
@doc ("helloworld")
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
`
const hasInlineNoExistTest = `
type Request struct {
Inline
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + ` // message
}
service A-api {
@doc ("helloworld")
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
`
const importApi = `
type ImportData struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
`
const hasImportApi = `
import "importApi.api"
type Request struct {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type Response struct {
Message string ` + "`" + `json:"message"` + "`" + ` // message
}
service A-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
`
const noStructTagApi = `
type Request {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
}
type XXX {}
type (
Response {
Message string ` + "`" + `json:"message"` + "`" + `
}
A {}
B struct {}
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}
`
const nestTypeApi = `
type Request {
Name string ` + "`" + `path:"name,options=you|me"` + "`" + `
XXX struct {
}
}
service A-api {
@handler GreetHandler
get /greet/from/:name(Request)
}
`
func TestParser(t *testing.T) {
filename := "greet.api"
err := ioutil.WriteFile(filename, []byte(testApiTemplate), os.ModePerm)
@@ -537,8 +269,15 @@ func validate(t *testing.T, api string) {
}
func validateWithCamel(t *testing.T, api, camel string) {
dir := t.TempDir()
err := DoGenProject(api, dir, camel)
dir := "workspace"
defer func() {
os.RemoveAll(dir)
}()
err := pathx.MkdirIfNotExist(dir)
assert.Nil(t, err)
err = initMod(dir)
assert.Nil(t, err)
err = DoGenProject(api, dir, camel)
assert.Nil(t, err)
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if strings.HasSuffix(path, ".go") {
@@ -550,6 +289,11 @@ func validateWithCamel(t *testing.T, api, camel string) {
})
}
func initMod(mod string) error {
_, err := execx.Run("go mod init "+mod, mod)
return err
}
func validateCode(code string) error {
_, err := goformat.Source([]byte(code))
return err

View File

@@ -0,0 +1,12 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,14 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
service A-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,15 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
@server(
middleware: TokenValidate
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,4 @@
service A-api {
@handler GreetHandler
post /greet/ping ()
}

View File

@@ -0,0 +1,16 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
@server(
jwt: Auth
signature: true
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,17 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
@server(
jwt: Auth
jwtTransition: Trans
middleware: TokenValidate
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,16 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
service A-api {
@handler NormalHandler
get /greet/from/:name(Request) returns (Response)
@handler NoResponseHandler
get /greet/from/:sex(Request)
@handler NoRequestHandler
get /greet/from/request returns (Response)
@handler NoRequestNoResponseHandler
get /greet/from
}

View File

@@ -0,0 +1,20 @@
type Inline struct {
}
type Request struct {
Inline
Name string `path:"name,options=you|me"` // name in path
}
type Response struct {
Message string `json:"msg"` // message
}
service A-api {
@doc ("helloworld")
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,16 @@
import "importApi.api"
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"` // message
}
service A-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,16 @@
type Request struct {
Inline
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"` // message
}
service A-api {
@doc ("helloworld")
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,3 @@
type ImportData struct {
Name string `path:"name,options=you|me"`
}

View File

@@ -0,0 +1,14 @@
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
service A-api
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,10 @@
type Request {
Name string `path:"name,options=you|me"`
XXX struct {
}
}
service A-api {
@handler GreetHandler
get /greet/from/:name(Request)
}

View File

@@ -0,0 +1,20 @@
type Request {
Name string `path:"name,options=you|me"`
}
type XXX {}
type (
Response {
Message string `json:"message"`
}
A {}
B struct {}
)
service A-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}

View File

@@ -0,0 +1,36 @@
info(
title: doc title
desc: ">
doc description first part,
doc description second part<"
version: 1.0
)
// TODO: test
// {
type Request struct { // TODO: test
// TODO
Name string `path:"name,options=you|me"` // }
} // TODO: test
// TODO: test
type Response struct {
Message string `json:"message"`
}
@server(
// C0
group: greet/s1
)
// C1
service A-api {
// C2
@server( // C3
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response) // hello
// C4
@handler NoResponseHandler // C5
get /greet/get(Request)
}

View File

@@ -0,0 +1,27 @@
info(
title: doc title
desc: doc description first part
version: 1.0
)
type Request struct {
Name string `path:"name,options=you|me"`
}
type Response struct {
Message string `json:"message"`
}
service A-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response)
}
service A-api {
@server(
handler: NoResponseHandler
)
get /greet/get(Request)
}

View File

@@ -1,7 +1,7 @@
package test
import (
"io/ioutil"
_ "embed"
"testing"
"github.com/stretchr/testify/assert"
@@ -9,16 +9,17 @@ import (
"github.com/zeromicro/go-zero/tools/goctl/api/parser/g4/gen/api"
)
//go:embed apis/test.api
var testApi string
var parser = ast.NewParser(ast.WithParserPrefix("test.api"), ast.WithParserDebug())
func TestApi(t *testing.T) {
fn := func(p *api.ApiParserParser, visitor *ast.ApiVisitor) interface{} {
return p.Api().Accept(visitor)
}
content, err := ioutil.ReadFile("./apis/test.api")
assert.Nil(t, err)
v, err := parser.Accept(fn, string(content))
v, err := parser.Accept(fn, testApi)
assert.Nil(t, err)
api := v.(*ast.Api)
body := &ast.Body{

View File

@@ -1,13 +1,15 @@
package parser
import (
_ "embed"
"testing"
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/tools/goctl/api/spec"
)
var testApi = "// syntax doc\nsyntax = \"v1\" // syntax comment\n\n// type doc\ntype Request {\n\tName string `path:\"name,options=you|me\"`\n}\n\ntype Response {\n\tMessage string `json:\"message\"`\n}\n\n// service doc\nservice greet-api {\n\t// handler doc\n\t@handler GreetHandler // handler comment\n\tget /from/:name(Request) returns (Response);\n}"
//go:embed testdata/test.api
var testApi string
func TestParseContent(t *testing.T) {
sp, err := ParseContent(testApi)

View File

@@ -0,0 +1,18 @@
// syntax doc
syntax = "v1" // syntax comment
// type doc
type Request {
Name string `path:"name,options=you|me"`
}
type Response {
Message string `json:"message"`
}
// service doc
service greet-api {
// handler doc
@handler GreetHandler // handler comment
get /from/:name(Request) returns (Response);
}