parser_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package parser
  2. import (
  3. _ "embed"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/zeromicro/go-zero/tools/goctl/model/sql/model"
  9. "github.com/zeromicro/go-zero/tools/goctl/model/sql/util"
  10. "github.com/zeromicro/go-zero/tools/goctl/util/pathx"
  11. )
  12. func TestParsePlainText(t *testing.T) {
  13. sqlFile := filepath.Join(pathx.MustTempDir(), "tmp.sql")
  14. err := os.WriteFile(sqlFile, []byte("plain text"), 0o777)
  15. assert.Nil(t, err)
  16. _, err = Parse(sqlFile, "go_zero", false)
  17. assert.NotNil(t, err)
  18. }
  19. func TestParseSelect(t *testing.T) {
  20. sqlFile := filepath.Join(pathx.MustTempDir(), "tmp.sql")
  21. err := os.WriteFile(sqlFile, []byte("select * from user"), 0o777)
  22. assert.Nil(t, err)
  23. tables, err := Parse(sqlFile, "go_zero", false)
  24. assert.Nil(t, err)
  25. assert.Equal(t, 0, len(tables))
  26. }
  27. //go:embed testdata/user.sql
  28. var user string
  29. func TestParseCreateTable(t *testing.T) {
  30. sqlFile := filepath.Join(pathx.MustTempDir(), "tmp.sql")
  31. err := os.WriteFile(sqlFile, []byte(user), 0o777)
  32. assert.Nil(t, err)
  33. tables, err := Parse(sqlFile, "go_zero", false)
  34. assert.Equal(t, 1, len(tables))
  35. table := tables[0]
  36. assert.Nil(t, err)
  37. assert.Equal(t, "test_user", table.Name.Source())
  38. assert.Equal(t, "id", table.PrimaryKey.Name.Source())
  39. assert.Equal(t, true, table.ContainsTime())
  40. assert.Equal(t, 2, len(table.UniqueIndex))
  41. assert.True(t, func() bool {
  42. for _, e := range table.Fields {
  43. if e.Comment != util.TrimNewLine(e.Comment) {
  44. return false
  45. }
  46. }
  47. return true
  48. }())
  49. }
  50. func TestConvertColumn(t *testing.T) {
  51. t.Run("missingPrimaryKey", func(t *testing.T) {
  52. columnData := model.ColumnData{
  53. Db: "user",
  54. Table: "user",
  55. Columns: []*model.Column{
  56. {
  57. DbColumn: &model.DbColumn{
  58. Name: "id",
  59. DataType: "bigint",
  60. },
  61. },
  62. },
  63. }
  64. _, err := columnData.Convert()
  65. assert.NotNil(t, err)
  66. assert.Contains(t, err.Error(), "missing primary key")
  67. })
  68. t.Run("jointPrimaryKey", func(t *testing.T) {
  69. columnData := model.ColumnData{
  70. Db: "user",
  71. Table: "user",
  72. Columns: []*model.Column{
  73. {
  74. DbColumn: &model.DbColumn{
  75. Name: "id",
  76. DataType: "bigint",
  77. },
  78. Index: &model.DbIndex{
  79. IndexName: "PRIMARY",
  80. },
  81. },
  82. {
  83. DbColumn: &model.DbColumn{
  84. Name: "mobile",
  85. DataType: "varchar",
  86. Comment: "手机号",
  87. },
  88. Index: &model.DbIndex{
  89. IndexName: "PRIMARY",
  90. },
  91. },
  92. },
  93. }
  94. _, err := columnData.Convert()
  95. assert.NotNil(t, err)
  96. assert.Contains(t, err.Error(), "joint primary key is not supported")
  97. })
  98. t.Run("normal", func(t *testing.T) {
  99. columnData := model.ColumnData{
  100. Db: "user",
  101. Table: "user",
  102. Columns: []*model.Column{
  103. {
  104. DbColumn: &model.DbColumn{
  105. Name: "id",
  106. DataType: "bigint",
  107. Extra: "auto_increment",
  108. },
  109. Index: &model.DbIndex{
  110. IndexName: "PRIMARY",
  111. SeqInIndex: 1,
  112. },
  113. },
  114. {
  115. DbColumn: &model.DbColumn{
  116. Name: "mobile",
  117. DataType: "varchar",
  118. Comment: "手机号",
  119. },
  120. Index: &model.DbIndex{
  121. IndexName: "mobile_unique",
  122. SeqInIndex: 1,
  123. },
  124. },
  125. },
  126. }
  127. table, err := columnData.Convert()
  128. assert.Nil(t, err)
  129. assert.True(t, table.PrimaryKey.Index.IndexName == "PRIMARY" && table.PrimaryKey.Name == "id")
  130. for _, item := range table.Columns {
  131. if item.Name == "mobile" {
  132. assert.True(t, item.Index.NonUnique == 0)
  133. break
  134. }
  135. }
  136. })
  137. }