gen_test.go 7.2 KB

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