apiparser_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package ast
  2. import (
  3. "io/ioutil"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  10. )
  11. func Test_ImportCycle(t *testing.T) {
  12. const (
  13. mainFilename = "main.api"
  14. subAFilename = "a.api"
  15. subBFilename = "b.api"
  16. mainSrc = `import "./a.api"`
  17. subASrc = `import "./b.api"`
  18. subBSrc = `import "./a.api"`
  19. )
  20. var err error
  21. dir := pathx.MustTempDir()
  22. defer os.RemoveAll(dir)
  23. mainPath := filepath.Join(dir, mainFilename)
  24. err = ioutil.WriteFile(mainPath, []byte(mainSrc), 0o777)
  25. require.NoError(t, err)
  26. subAPath := filepath.Join(dir, subAFilename)
  27. err = ioutil.WriteFile(subAPath, []byte(subASrc), 0o777)
  28. require.NoError(t, err)
  29. subBPath := filepath.Join(dir, subBFilename)
  30. err = ioutil.WriteFile(subBPath, []byte(subBSrc), 0o777)
  31. require.NoError(t, err)
  32. _, err = NewParser().Parse(mainPath)
  33. assert.ErrorIs(t, err, ErrImportCycleNotAllowed)
  34. }
  35. func Test_MultiImportedShouldAllowed(t *testing.T) {
  36. const (
  37. mainFilename = "main.api"
  38. subAFilename = "a.api"
  39. subBFilename = "b.api"
  40. mainSrc = "import \"./b.api\"\n" +
  41. "import \"./a.api\"\n" +
  42. "type Main { b B `json:\"b\"`}"
  43. subASrc = "import \"./b.api\"\n" +
  44. "type A { b B `json:\"b\"`}\n"
  45. subBSrc = `type B{}`
  46. )
  47. var err error
  48. dir := pathx.MustTempDir()
  49. defer os.RemoveAll(dir)
  50. mainPath := filepath.Join(dir, mainFilename)
  51. err = ioutil.WriteFile(mainPath, []byte(mainSrc), 0o777)
  52. require.NoError(t, err)
  53. subAPath := filepath.Join(dir, subAFilename)
  54. err = ioutil.WriteFile(subAPath, []byte(subASrc), 0o777)
  55. require.NoError(t, err)
  56. subBPath := filepath.Join(dir, subBFilename)
  57. err = ioutil.WriteFile(subBPath, []byte(subBSrc), 0o777)
  58. require.NoError(t, err)
  59. _, err = NewParser().Parse(mainPath)
  60. assert.NoError(t, err)
  61. }
  62. func Test_RedundantDeclarationShouldNotBeAllowed(t *testing.T) {
  63. const (
  64. mainFilename = "main.api"
  65. subAFilename = "a.api"
  66. subBFilename = "b.api"
  67. mainSrc = "import \"./a.api\"\n" +
  68. "import \"./b.api\"\n"
  69. subASrc = `import "./b.api"
  70. type A{}`
  71. subBSrc = `type A{}`
  72. )
  73. var err error
  74. dir := pathx.MustTempDir()
  75. defer os.RemoveAll(dir)
  76. mainPath := filepath.Join(dir, mainFilename)
  77. err = ioutil.WriteFile(mainPath, []byte(mainSrc), 0o777)
  78. require.NoError(t, err)
  79. subAPath := filepath.Join(dir, subAFilename)
  80. err = ioutil.WriteFile(subAPath, []byte(subASrc), 0o777)
  81. require.NoError(t, err)
  82. subBPath := filepath.Join(dir, subBFilename)
  83. err = ioutil.WriteFile(subBPath, []byte(subBSrc), 0o777)
  84. require.NoError(t, err)
  85. _, err = NewParser().Parse(mainPath)
  86. assert.Error(t, err)
  87. assert.Contains(t, err.Error(), "duplicate type declaration")
  88. }