Browse Source

chore: Embed unit test data (#1812)

* Embed unit test data

* Add testdata

Co-authored-by: anqiansong <anqiansong@bytedance.com>
anqiansong 3 years ago
parent
commit
16c61c6657
27 changed files with 388 additions and 315 deletions
  1. 0 1
      .gitignore
  2. 50 306
      tools/goctl/api/gogen/gen_test.go
  3. 12 0
      tools/goctl/api/gogen/testdata/anonymous_annotation.api
  4. 14 0
      tools/goctl/api/gogen/testdata/ap_ino_info.api
  5. 15 0
      tools/goctl/api/gogen/testdata/api_has_middleware.api
  6. 4 0
      tools/goctl/api/gogen/testdata/api_has_no_request.api
  7. 16 0
      tools/goctl/api/gogen/testdata/api_jwt.api
  8. 17 0
      tools/goctl/api/gogen/testdata/api_jwt_with_middleware.api
  9. 16 0
      tools/goctl/api/gogen/testdata/api_route_test.api
  10. 20 0
      tools/goctl/api/gogen/testdata/has_comment_api_test.api
  11. 16 0
      tools/goctl/api/gogen/testdata/has_import_api.api
  12. 16 0
      tools/goctl/api/gogen/testdata/has_inline_no_exist_test.api
  13. 3 0
      tools/goctl/api/gogen/testdata/import_api.api
  14. 14 0
      tools/goctl/api/gogen/testdata/invalid_api_file.api
  15. 10 0
      tools/goctl/api/gogen/testdata/nest_type_api.api
  16. 20 0
      tools/goctl/api/gogen/testdata/no_struct_tag_api.api
  17. 36 0
      tools/goctl/api/gogen/testdata/test_api_template.api
  18. 27 0
      tools/goctl/api/gogen/testdata/test_multi_service_template.api
  19. 5 4
      tools/goctl/api/parser/g4/test/ast_test.go
  20. 3 1
      tools/goctl/api/parser/parser_test.go
  21. 18 0
      tools/goctl/api/parser/testdata/test.api
  22. 3 1
      tools/goctl/model/sql/command/command_test.go
  23. 16 0
      tools/goctl/model/sql/command/testdata/user.sql
  24. 3 1
      tools/goctl/model/sql/gen/gen_test.go
  25. 14 0
      tools/goctl/model/sql/gen/testdata/user.sql
  26. 5 1
      tools/goctl/model/sql/parser/parser_test.go
  27. 15 0
      tools/goctl/model/sql/parser/testdata/user.sql

+ 0 - 1
.gitignore

@@ -17,7 +17,6 @@
 
 # for test purpose
 **/adhoc
-**/testdata
 
 # gitlab ci
 .cache

+ 50 - 306
tools/goctl/api/gogen/gen_test.go

@@ -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

+ 12 - 0
tools/goctl/api/gogen/testdata/anonymous_annotation.api

@@ -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)
+}

+ 14 - 0
tools/goctl/api/gogen/testdata/ap_ino_info.api

@@ -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)
+}

+ 15 - 0
tools/goctl/api/gogen/testdata/api_has_middleware.api

@@ -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)
+}

+ 4 - 0
tools/goctl/api/gogen/testdata/api_has_no_request.api

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

+ 16 - 0
tools/goctl/api/gogen/testdata/api_jwt.api

@@ -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)
+}

+ 17 - 0
tools/goctl/api/gogen/testdata/api_jwt_with_middleware.api

@@ -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)
+}

+ 16 - 0
tools/goctl/api/gogen/testdata/api_route_test.api

@@ -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
+}

+ 20 - 0
tools/goctl/api/gogen/testdata/has_comment_api_test.api

@@ -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)
+}

+ 16 - 0
tools/goctl/api/gogen/testdata/has_import_api.api

@@ -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)
+}

+ 16 - 0
tools/goctl/api/gogen/testdata/has_inline_no_exist_test.api

@@ -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)
+}

+ 3 - 0
tools/goctl/api/gogen/testdata/import_api.api

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

+ 14 - 0
tools/goctl/api/gogen/testdata/invalid_api_file.api

@@ -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)
+}

+ 10 - 0
tools/goctl/api/gogen/testdata/nest_type_api.api

@@ -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)
+}

+ 20 - 0
tools/goctl/api/gogen/testdata/no_struct_tag_api.api

@@ -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)
+}

+ 36 - 0
tools/goctl/api/gogen/testdata/test_api_template.api

@@ -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)
+}

+ 27 - 0
tools/goctl/api/gogen/testdata/test_multi_service_template.api

@@ -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)
+}

+ 5 - 4
tools/goctl/api/parser/g4/test/ast_test.go

@@ -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{

+ 3 - 1
tools/goctl/api/parser/parser_test.go

@@ -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)

+ 18 - 0
tools/goctl/api/parser/testdata/test.api

@@ -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);
+    }

+ 3 - 1
tools/goctl/model/sql/command/command_test.go

@@ -1,6 +1,7 @@
 package command
 
 import (
+	_ "embed"
 	"io/ioutil"
 	"os"
 	"path/filepath"
@@ -13,7 +14,8 @@ import (
 )
 
 var (
-	sql = "-- 用户表 --\nCREATE TABLE `user` (\n  `id` bigint(10) NOT NULL AUTO_INCREMENT,\n  `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名称',\n  `password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码',\n  `mobile` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',\n  `gender` char(5) COLLATE utf8mb4_general_ci NOT NULL COMMENT '男|女|未公开',\n  `nickname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户昵称',\n  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `name_index` (`name`),\n  UNIQUE KEY `mobile_index` (`mobile`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;\n\n"
+	//go:embed testdata/user.sql
+	sql string
 	cfg = &config.Config{
 		NamingFormat: "gozero",
 	}

+ 16 - 0
tools/goctl/model/sql/command/testdata/user.sql

@@ -0,0 +1,16 @@
+-- 用户表 --
+CREATE TABLE `user`
+(
+    `id`          bigint(10) NOT NULL AUTO_INCREMENT,
+    `name`        varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名称',
+    `password`    varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户密码',
+    `mobile`      varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',
+    `gender`      char(5) COLLATE utf8mb4_general_ci      NOT NULL COMMENT '男|女|未公开',
+    `nickname`    varchar(255) COLLATE utf8mb4_general_ci          DEFAULT '' COMMENT '用户昵称',
+    `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+    `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `name_index` (`name`),
+    UNIQUE KEY `mobile_index` (`mobile`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
+

+ 3 - 1
tools/goctl/model/sql/gen/gen_test.go

@@ -2,6 +2,7 @@ package gen
 
 import (
 	"database/sql"
+	_ "embed"
 	"io/ioutil"
 	"os"
 	"path"
@@ -20,7 +21,8 @@ import (
 	"github.com/zeromicro/go-zero/tools/goctl/util/pathx"
 )
 
-var source = "CREATE TABLE `test_user` (\n  `id` bigint NOT NULL AUTO_INCREMENT,\n  `mobile` varchar(255) COLLATE utf8mb4_bin NOT NULL,\n  `class` bigint NOT NULL,\n  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,\n  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `mobile_unique` (`mobile`),\n  UNIQUE KEY `class_name_unique` (`class`,`name`),\n  KEY `create_index` (`create_time`),\n  KEY `name_index` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;"
+//go:embed testdata/user.sql
+var source string
 
 func TestCacheModel(t *testing.T) {
 	logx.Disable()

+ 14 - 0
tools/goctl/model/sql/gen/testdata/user.sql

@@ -0,0 +1,14 @@
+CREATE TABLE `test_user`
+(
+    `id`          bigint                                                 NOT NULL AUTO_INCREMENT,
+    `mobile`      varchar(255) COLLATE utf8mb4_bin                       NOT NULL,
+    `class`       bigint                                                 NOT NULL,
+    `name`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
+    `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
+    `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `mobile_unique` (`mobile`),
+    UNIQUE KEY `class_name_unique` (`class`,`name`),
+    KEY           `create_index` (`create_time`),
+    KEY           `name_index` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

+ 5 - 1
tools/goctl/model/sql/parser/parser_test.go

@@ -1,6 +1,7 @@
 package parser
 
 import (
+	_ "embed"
 	"io/ioutil"
 	"path/filepath"
 	"testing"
@@ -30,9 +31,12 @@ func TestParseSelect(t *testing.T) {
 	assert.Equal(t, 0, len(tables))
 }
 
+//go:embed testdata/user.sql
+var user string
+
 func TestParseCreateTable(t *testing.T) {
 	sqlFile := filepath.Join(pathx.MustTempDir(), "tmp.sql")
-	err := ioutil.WriteFile(sqlFile, []byte("CREATE TABLE `test_user` (\n  `id` bigint NOT NULL AUTO_INCREMENT,\n  `mobile` varchar(255) COLLATE utf8mb4_bin NOT NULL comment '手\\t机  号',\n  `class` bigint NOT NULL comment '班级',\n  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL comment '姓\n  名',\n  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP comment '创建\\r时间',\n  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `mobile_unique` (`mobile`),\n  UNIQUE KEY `class_name_unique` (`class`,`name`),\n  KEY `create_index` (`create_time`),\n  KEY `name_index` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;"), 0o777)
+	err := ioutil.WriteFile(sqlFile, []byte(user), 0o777)
 	assert.Nil(t, err)
 
 	tables, err := Parse(sqlFile, "go_zero")

+ 15 - 0
tools/goctl/model/sql/parser/testdata/user.sql

@@ -0,0 +1,15 @@
+CREATE TABLE `test_user`
+(
+    `id`          bigint                                                 NOT NULL AUTO_INCREMENT,
+    `mobile`      varchar(255) COLLATE utf8mb4_bin                       NOT NULL comment '手\t机  号',
+    `class`       bigint                                                 NOT NULL comment '班级',
+    `name`        varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL comment '姓
+  名',
+    `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP comment '创建\r时间',
+    `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    PRIMARY KEY (`id`),
+    UNIQUE KEY `mobile_unique` (`mobile`),
+    UNIQUE KEY `class_name_unique` (`class`,`name`),
+    KEY           `create_index` (`create_time`),
+    KEY           `name_index` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;