session_schema_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. // Copyright 2017 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package xorm
  5. import (
  6. "fmt"
  7. "os"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestStoreEngine(t *testing.T) {
  13. assert.NoError(t, prepareEngine())
  14. assert.NoError(t, testEngine.DropTables("user_store_engine"))
  15. type UserinfoStoreEngine struct {
  16. Id int64
  17. Name string
  18. }
  19. assert.NoError(t, testEngine.StoreEngine("InnoDB").Table("user_store_engine").CreateTable(&UserinfoStoreEngine{}))
  20. }
  21. func TestCreateTable(t *testing.T) {
  22. assert.NoError(t, prepareEngine())
  23. assert.NoError(t, testEngine.DropTables("user_user"))
  24. type UserinfoCreateTable struct {
  25. Id int64
  26. Name string
  27. }
  28. assert.NoError(t, testEngine.Table("user_user").CreateTable(&UserinfoCreateTable{}))
  29. }
  30. func TestCreateMultiTables(t *testing.T) {
  31. assert.NoError(t, prepareEngine())
  32. session := testEngine.NewSession()
  33. defer session.Close()
  34. type UserinfoMultiTable struct {
  35. Id int64
  36. Name string
  37. }
  38. user := &UserinfoMultiTable{}
  39. assert.NoError(t, session.Begin())
  40. for i := 0; i < 10; i++ {
  41. tableName := fmt.Sprintf("user_%v", i)
  42. assert.NoError(t, session.DropTable(tableName))
  43. assert.NoError(t, session.Table(tableName).CreateTable(user))
  44. }
  45. assert.NoError(t, session.Commit())
  46. }
  47. type SyncTable1 struct {
  48. Id int64
  49. Name string
  50. Dev int `xorm:"index"`
  51. }
  52. type SyncTable2 struct {
  53. Id int64
  54. Name string `xorm:"unique"`
  55. Number string `xorm:"index"`
  56. Dev int
  57. Age int
  58. }
  59. func (SyncTable2) TableName() string {
  60. return "sync_table1"
  61. }
  62. func TestSyncTable(t *testing.T) {
  63. assert.NoError(t, prepareEngine())
  64. assert.NoError(t, testEngine.Sync2(new(SyncTable1)))
  65. assert.NoError(t, testEngine.Sync2(new(SyncTable2)))
  66. }
  67. func TestIsTableExist(t *testing.T) {
  68. assert.NoError(t, prepareEngine())
  69. exist, err := testEngine.IsTableExist(new(CustomTableName))
  70. assert.NoError(t, err)
  71. assert.False(t, exist)
  72. assert.NoError(t, testEngine.CreateTables(new(CustomTableName)))
  73. exist, err = testEngine.IsTableExist(new(CustomTableName))
  74. assert.NoError(t, err)
  75. assert.True(t, exist)
  76. }
  77. func TestIsTableEmpty(t *testing.T) {
  78. assert.NoError(t, prepareEngine())
  79. type NumericEmpty struct {
  80. Numeric float64 `xorm:"numeric(26,2)"`
  81. }
  82. type PictureEmpty struct {
  83. Id int64
  84. Url string `xorm:"unique"` //image's url
  85. Title string
  86. Description string
  87. Created time.Time `xorm:"created"`
  88. ILike int
  89. PageView int
  90. From_url string
  91. Pre_url string `xorm:"unique"` //pre view image's url
  92. Uid int64
  93. }
  94. assert.NoError(t, testEngine.DropTables(&PictureEmpty{}, &NumericEmpty{}))
  95. assert.NoError(t, testEngine.Sync(new(PictureEmpty), new(NumericEmpty)))
  96. isEmpty, err := testEngine.IsTableEmpty(&PictureEmpty{})
  97. assert.NoError(t, err)
  98. assert.True(t, isEmpty)
  99. tbName := testEngine.TableMapper.Obj2Table("PictureEmpty")
  100. isEmpty, err = testEngine.IsTableEmpty(tbName)
  101. assert.NoError(t, err)
  102. assert.True(t, isEmpty)
  103. }
  104. type CustomTableName struct {
  105. Id int64
  106. Name string
  107. }
  108. func (c *CustomTableName) TableName() string {
  109. return "customtablename"
  110. }
  111. func TestCustomTableName(t *testing.T) {
  112. assert.NoError(t, prepareEngine())
  113. c := new(CustomTableName)
  114. assert.NoError(t, testEngine.DropTables(c))
  115. assert.NoError(t, testEngine.CreateTables(c))
  116. }
  117. func TestDump(t *testing.T) {
  118. assert.NoError(t, prepareEngine())
  119. fp := testEngine.Dialect().URI().DbName + ".sql"
  120. os.Remove(fp)
  121. assert.NoError(t, testEngine.DumpAllToFile(fp))
  122. }
  123. type IndexOrUnique struct {
  124. Id int64
  125. Index int `xorm:"index"`
  126. Unique int `xorm:"unique"`
  127. Group1 int `xorm:"index(ttt)"`
  128. Group2 int `xorm:"index(ttt)"`
  129. UniGroup1 int `xorm:"unique(lll)"`
  130. UniGroup2 int `xorm:"unique(lll)"`
  131. }
  132. func TestIndexAndUnique(t *testing.T) {
  133. assert.NoError(t, prepareEngine())
  134. assert.NoError(t, testEngine.CreateTables(&IndexOrUnique{}))
  135. assert.NoError(t, testEngine.DropTables(&IndexOrUnique{}))
  136. assert.NoError(t, testEngine.CreateTables(&IndexOrUnique{}))
  137. assert.NoError(t, testEngine.CreateIndexes(&IndexOrUnique{}))
  138. assert.NoError(t, testEngine.CreateUniques(&IndexOrUnique{}))
  139. assert.NoError(t, testEngine.DropIndexes(&IndexOrUnique{}))
  140. }
  141. func TestMetaInfo(t *testing.T) {
  142. assert.NoError(t, prepareEngine())
  143. assert.NoError(t, testEngine.Sync2(new(CustomTableName), new(IndexOrUnique)))
  144. tables, err := testEngine.DBMetas()
  145. assert.NoError(t, err)
  146. assert.EqualValues(t, 2, len(tables))
  147. assert.EqualValues(t, "customtablename", tables[0].Name)
  148. assert.EqualValues(t, "index_or_unique", tables[1].Name)
  149. }
  150. func TestCharst(t *testing.T) {
  151. assert.NoError(t, prepareEngine())
  152. err := testEngine.DropTables("user_charset")
  153. if err != nil {
  154. t.Error(err)
  155. panic(err)
  156. }
  157. err = testEngine.Charset("utf8").Table("user_charset").CreateTable(&Userinfo{})
  158. if err != nil {
  159. t.Error(err)
  160. panic(err)
  161. }
  162. }