gen_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package gogen
  2. import (
  3. _ "embed"
  4. goformat "go/format"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "testing"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/zeromicro/go-zero/tools/goctl/api/parser"
  12. "github.com/zeromicro/go-zero/tools/goctl/rpc/execx"
  13. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  14. )
  15. var (
  16. //go:embed testdata/test_api_template.api
  17. testApiTemplate string
  18. //go:embed testdata/test_multi_service_template.api
  19. testMultiServiceTemplate string
  20. //go:embed testdata/ap_ino_info.api
  21. apiNoInfo string
  22. //go:embed testdata/invalid_api_file.api
  23. invalidApiFile string
  24. //go:embed testdata/anonymous_annotation.api
  25. anonymousAnnotation string
  26. //go:embed testdata/api_has_middleware.api
  27. apiHasMiddleware string
  28. //go:embed testdata/api_jwt.api
  29. apiJwt string
  30. //go:embed testdata/api_jwt_with_middleware.api
  31. apiJwtWithMiddleware string
  32. //go:embed testdata/api_has_no_request.api
  33. apiHasNoRequest string
  34. //go:embed testdata/api_route_test.api
  35. apiRouteTest string
  36. //go:embed testdata/has_comment_api_test.api
  37. hasCommentApiTest string
  38. //go:embed testdata/has_inline_no_exist_test.api
  39. hasInlineNoExistTest string
  40. //go:embed testdata/import_api.api
  41. importApi string
  42. //go:embed testdata/has_import_api.api
  43. hasImportApi string
  44. //go:embed testdata/no_struct_tag_api.api
  45. noStructTagApi string
  46. //go:embed testdata/nest_type_api.api
  47. nestTypeApi string
  48. )
  49. func TestParser(t *testing.T) {
  50. filename := "greet.api"
  51. err := ioutil.WriteFile(filename, []byte(testApiTemplate), os.ModePerm)
  52. assert.Nil(t, err)
  53. defer os.Remove(filename)
  54. api, err := parser.Parse(filename)
  55. assert.Nil(t, err)
  56. assert.Equal(t, len(api.Types), 2)
  57. assert.Equal(t, len(api.Service.Routes()), 2)
  58. assert.Equal(t, api.Service.Routes()[0].Path, "/greet/from/:name")
  59. assert.Equal(t, api.Service.Routes()[1].Path, "/greet/get")
  60. assert.Equal(t, api.Service.Routes()[1].RequestTypeName(), "Request")
  61. assert.Equal(t, api.Service.Routes()[1].ResponseType, nil)
  62. validate(t, filename)
  63. }
  64. func TestMultiService(t *testing.T) {
  65. filename := "greet.api"
  66. err := ioutil.WriteFile(filename, []byte(testMultiServiceTemplate), os.ModePerm)
  67. assert.Nil(t, err)
  68. defer os.Remove(filename)
  69. api, err := parser.Parse(filename)
  70. assert.Nil(t, err)
  71. assert.Equal(t, len(api.Service.Routes()), 2)
  72. assert.Equal(t, len(api.Service.Groups), 2)
  73. validate(t, filename)
  74. }
  75. func TestApiNoInfo(t *testing.T) {
  76. filename := "greet.api"
  77. err := ioutil.WriteFile(filename, []byte(apiNoInfo), os.ModePerm)
  78. assert.Nil(t, err)
  79. defer os.Remove(filename)
  80. _, err = parser.Parse(filename)
  81. assert.Nil(t, err)
  82. validate(t, filename)
  83. }
  84. func TestInvalidApiFile(t *testing.T) {
  85. filename := "greet.api"
  86. err := ioutil.WriteFile(filename, []byte(invalidApiFile), os.ModePerm)
  87. assert.Nil(t, err)
  88. defer os.Remove(filename)
  89. _, err = parser.Parse(filename)
  90. assert.NotNil(t, err)
  91. }
  92. func TestAnonymousAnnotation(t *testing.T) {
  93. filename := "greet.api"
  94. err := ioutil.WriteFile(filename, []byte(anonymousAnnotation), os.ModePerm)
  95. assert.Nil(t, err)
  96. defer os.Remove(filename)
  97. api, err := parser.Parse(filename)
  98. assert.Nil(t, err)
  99. assert.Equal(t, len(api.Service.Routes()), 1)
  100. assert.Equal(t, api.Service.Routes()[0].Handler, "GreetHandler")
  101. validate(t, filename)
  102. }
  103. func TestApiHasMiddleware(t *testing.T) {
  104. filename := "greet.api"
  105. err := ioutil.WriteFile(filename, []byte(apiHasMiddleware), os.ModePerm)
  106. assert.Nil(t, err)
  107. defer os.Remove(filename)
  108. _, err = parser.Parse(filename)
  109. assert.Nil(t, err)
  110. validate(t, filename)
  111. }
  112. func TestApiHasJwt(t *testing.T) {
  113. filename := "jwt.api"
  114. err := ioutil.WriteFile(filename, []byte(apiJwt), os.ModePerm)
  115. assert.Nil(t, err)
  116. defer os.Remove(filename)
  117. _, err = parser.Parse(filename)
  118. assert.Nil(t, err)
  119. validate(t, filename)
  120. }
  121. func TestApiHasJwtAndMiddleware(t *testing.T) {
  122. filename := "jwt.api"
  123. err := ioutil.WriteFile(filename, []byte(apiJwtWithMiddleware), os.ModePerm)
  124. assert.Nil(t, err)
  125. defer os.Remove(filename)
  126. _, err = parser.Parse(filename)
  127. assert.Nil(t, err)
  128. validate(t, filename)
  129. }
  130. func TestApiHasNoRequestBody(t *testing.T) {
  131. filename := "greet.api"
  132. err := ioutil.WriteFile(filename, []byte(apiHasNoRequest), os.ModePerm)
  133. assert.Nil(t, err)
  134. defer os.Remove(filename)
  135. _, err = parser.Parse(filename)
  136. assert.Nil(t, err)
  137. }
  138. func TestApiRoutes(t *testing.T) {
  139. filename := "greet.api"
  140. err := ioutil.WriteFile(filename, []byte(apiRouteTest), os.ModePerm)
  141. assert.Nil(t, err)
  142. defer os.Remove(filename)
  143. _, err = parser.Parse(filename)
  144. assert.Nil(t, err)
  145. validate(t, filename)
  146. }
  147. func TestHasCommentRoutes(t *testing.T) {
  148. filename := "greet.api"
  149. err := ioutil.WriteFile(filename, []byte(hasCommentApiTest), os.ModePerm)
  150. assert.Nil(t, err)
  151. defer os.Remove(filename)
  152. _, err = parser.Parse(filename)
  153. assert.Nil(t, err)
  154. validate(t, filename)
  155. }
  156. func TestInlineTypeNotExist(t *testing.T) {
  157. filename := "greet.api"
  158. err := ioutil.WriteFile(filename, []byte(hasInlineNoExistTest), os.ModePerm)
  159. assert.Nil(t, err)
  160. defer os.Remove(filename)
  161. _, err = parser.Parse(filename)
  162. assert.NotNil(t, err)
  163. }
  164. func TestHasImportApi(t *testing.T) {
  165. filename := "greet.api"
  166. err := ioutil.WriteFile(filename, []byte(hasImportApi), os.ModePerm)
  167. assert.Nil(t, err)
  168. defer os.Remove(filename)
  169. importApiName := "importApi.api"
  170. err = ioutil.WriteFile(importApiName, []byte(importApi), os.ModePerm)
  171. assert.Nil(t, err)
  172. defer os.Remove(importApiName)
  173. api, err := parser.Parse(filename)
  174. assert.Nil(t, err)
  175. var hasInline bool
  176. for _, ty := range api.Types {
  177. if ty.Name() == "ImportData" {
  178. hasInline = true
  179. break
  180. }
  181. }
  182. assert.True(t, hasInline)
  183. validate(t, filename)
  184. }
  185. func TestNoStructApi(t *testing.T) {
  186. filename := "greet.api"
  187. err := ioutil.WriteFile(filename, []byte(noStructTagApi), os.ModePerm)
  188. assert.Nil(t, err)
  189. defer os.Remove(filename)
  190. spec, err := parser.Parse(filename)
  191. assert.Nil(t, err)
  192. assert.Equal(t, len(spec.Types), 5)
  193. validate(t, filename)
  194. }
  195. func TestNestTypeApi(t *testing.T) {
  196. filename := "greet.api"
  197. err := ioutil.WriteFile(filename, []byte(nestTypeApi), os.ModePerm)
  198. assert.Nil(t, err)
  199. defer os.Remove(filename)
  200. _, err = parser.Parse(filename)
  201. assert.NotNil(t, err)
  202. }
  203. func TestCamelStyle(t *testing.T) {
  204. filename := "greet.api"
  205. err := ioutil.WriteFile(filename, []byte(testApiTemplate), os.ModePerm)
  206. assert.Nil(t, err)
  207. defer os.Remove(filename)
  208. _, err = parser.Parse(filename)
  209. assert.Nil(t, err)
  210. validateWithCamel(t, filename, "GoZero")
  211. }
  212. func validate(t *testing.T, api string) {
  213. validateWithCamel(t, api, "gozero")
  214. }
  215. func validateWithCamel(t *testing.T, api, camel string) {
  216. dir := "workspace"
  217. defer func() {
  218. os.RemoveAll(dir)
  219. }()
  220. err := pathx.MkdirIfNotExist(dir)
  221. assert.Nil(t, err)
  222. err = initMod(dir)
  223. assert.Nil(t, err)
  224. err = DoGenProject(api, dir, camel)
  225. assert.Nil(t, err)
  226. filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  227. if strings.HasSuffix(path, ".go") {
  228. code, err := ioutil.ReadFile(path)
  229. assert.Nil(t, err)
  230. assert.Nil(t, validateCode(string(code)))
  231. }
  232. return nil
  233. })
  234. }
  235. func initMod(mod string) error {
  236. _, err := execx.Run("go mod init "+mod, mod)
  237. return err
  238. }
  239. func validateCode(code string) error {
  240. _, err := goformat.Source([]byte(code))
  241. return err
  242. }