gen_test.go 7.0 KB

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