gen_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package gen
  2. import (
  3. "database/sql"
  4. "io/ioutil"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/tal-tech/go-zero/core/logx"
  12. "github.com/tal-tech/go-zero/core/stringx"
  13. "github.com/tal-tech/go-zero/tools/goctl/config"
  14. "github.com/tal-tech/go-zero/tools/goctl/model/sql/builderx"
  15. "github.com/tal-tech/go-zero/tools/goctl/util"
  16. )
  17. var source = "CREATE TABLE `test_user` (\n `id` bigint NOT NULL AUTO_INCREMENT,\n `mobile` varchar(255) COLLATE utf8mb4_bin NOT NULL,\n `class` bigint NOT NULL,\n `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,\n `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,\n PRIMARY KEY (`id`),\n UNIQUE KEY `mobile_unique` (`mobile`),\n UNIQUE KEY `class_name_unique` (`class`,`name`),\n KEY `create_index` (`create_time`),\n KEY `name_index` (`name`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;"
  18. func TestCacheModel(t *testing.T) {
  19. logx.Disable()
  20. _ = Clean()
  21. sqlFile := filepath.Join(util.MustTempDir(), "tmp.sql")
  22. err := ioutil.WriteFile(sqlFile, []byte(source), 0o777)
  23. assert.Nil(t, err)
  24. dir := filepath.Join(util.MustTempDir(), "./testmodel")
  25. cacheDir := filepath.Join(dir, "cache")
  26. noCacheDir := filepath.Join(dir, "nocache")
  27. g, err := NewDefaultGenerator(cacheDir, &config.Config{
  28. NamingFormat: "GoZero",
  29. })
  30. assert.Nil(t, err)
  31. err = g.StartFromDDL(sqlFile, true, "go_zero")
  32. assert.Nil(t, err)
  33. assert.True(t, func() bool {
  34. _, err := os.Stat(filepath.Join(cacheDir, "TestUserModel.go"))
  35. return err == nil
  36. }())
  37. g, err = NewDefaultGenerator(noCacheDir, &config.Config{
  38. NamingFormat: "gozero",
  39. })
  40. assert.Nil(t, err)
  41. err = g.StartFromDDL(sqlFile, false, "go_zero")
  42. assert.Nil(t, err)
  43. assert.True(t, func() bool {
  44. _, err := os.Stat(filepath.Join(noCacheDir, "testusermodel.go"))
  45. return err == nil
  46. }())
  47. }
  48. func TestNamingModel(t *testing.T) {
  49. logx.Disable()
  50. _ = Clean()
  51. sqlFile := filepath.Join(util.MustTempDir(), "tmp.sql")
  52. err := ioutil.WriteFile(sqlFile, []byte(source), 0o777)
  53. assert.Nil(t, err)
  54. dir, _ := filepath.Abs("./testmodel")
  55. camelDir := filepath.Join(dir, "camel")
  56. snakeDir := filepath.Join(dir, "snake")
  57. defer func() {
  58. _ = os.RemoveAll(dir)
  59. }()
  60. g, err := NewDefaultGenerator(camelDir, &config.Config{
  61. NamingFormat: "GoZero",
  62. })
  63. assert.Nil(t, err)
  64. err = g.StartFromDDL(sqlFile, true, "go_zero")
  65. assert.Nil(t, err)
  66. assert.True(t, func() bool {
  67. _, err := os.Stat(filepath.Join(camelDir, "TestUserModel.go"))
  68. return err == nil
  69. }())
  70. g, err = NewDefaultGenerator(snakeDir, &config.Config{
  71. NamingFormat: "go_zero",
  72. })
  73. assert.Nil(t, err)
  74. err = g.StartFromDDL(sqlFile, true, "go_zero")
  75. assert.Nil(t, err)
  76. assert.True(t, func() bool {
  77. _, err := os.Stat(filepath.Join(snakeDir, "test_user_model.go"))
  78. return err == nil
  79. }())
  80. }
  81. func TestWrapWithRawString(t *testing.T) {
  82. assert.Equal(t, "``", wrapWithRawString("", false))
  83. assert.Equal(t, "``", wrapWithRawString("``", false))
  84. assert.Equal(t, "`a`", wrapWithRawString("a", false))
  85. assert.Equal(t, "a", wrapWithRawString("a", true))
  86. assert.Equal(t, "` `", wrapWithRawString(" ", false))
  87. }
  88. func TestFields(t *testing.T) {
  89. type Student struct {
  90. ID int64 `db:"id"`
  91. Name string `db:"name"`
  92. Age sql.NullInt64 `db:"age"`
  93. Score sql.NullFloat64 `db:"score"`
  94. CreateTime time.Time `db:"create_time"`
  95. UpdateTime sql.NullTime `db:"update_time"`
  96. }
  97. var (
  98. studentFieldNames = builderx.RawFieldNames(&Student{})
  99. studentRows = strings.Join(studentFieldNames, ",")
  100. studentRowsExpectAutoSet = strings.Join(stringx.Remove(studentFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
  101. studentRowsWithPlaceHolder = strings.Join(stringx.Remove(studentFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
  102. )
  103. assert.Equal(t, []string{"`id`", "`name`", "`age`", "`score`", "`create_time`", "`update_time`"}, studentFieldNames)
  104. assert.Equal(t, "`id`,`name`,`age`,`score`,`create_time`,`update_time`", studentRows)
  105. assert.Equal(t, "`name`,`age`,`score`", studentRowsExpectAutoSet)
  106. assert.Equal(t, "`name`=?,`age`=?,`score`=?", studentRowsWithPlaceHolder)
  107. }