session_delete_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. "testing"
  7. "time"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestDelete(t *testing.T) {
  11. assert.NoError(t, prepareEngine())
  12. type UserinfoDelete struct {
  13. Uid int64 `xorm:"id pk not null autoincr"`
  14. IsMan bool
  15. }
  16. assert.NoError(t, testEngine.Sync2(new(UserinfoDelete)))
  17. user := UserinfoDelete{Uid: 1}
  18. cnt, err := testEngine.Insert(&user)
  19. assert.NoError(t, err)
  20. assert.EqualValues(t, 1, cnt)
  21. cnt, err = testEngine.Delete(&UserinfoDelete{Uid: user.Uid})
  22. assert.NoError(t, err)
  23. assert.EqualValues(t, 1, cnt)
  24. user.Uid = 0
  25. user.IsMan = true
  26. has, err := testEngine.ID(1).Get(&user)
  27. assert.NoError(t, err)
  28. assert.False(t, has)
  29. cnt, err = testEngine.Insert(&user)
  30. assert.NoError(t, err)
  31. assert.EqualValues(t, 1, cnt)
  32. cnt, err = testEngine.Where("id=?", user.Uid).Delete(&UserinfoDelete{})
  33. assert.NoError(t, err)
  34. assert.EqualValues(t, 1, cnt)
  35. user.Uid = 0
  36. user.IsMan = true
  37. has, err = testEngine.ID(2).Get(&user)
  38. assert.NoError(t, err)
  39. assert.False(t, has)
  40. }
  41. func TestDeleted(t *testing.T) {
  42. assert.NoError(t, prepareEngine())
  43. type Deleted struct {
  44. Id int64 `xorm:"pk"`
  45. Name string
  46. DeletedAt time.Time `xorm:"deleted"`
  47. }
  48. err := testEngine.DropTables(&Deleted{})
  49. assert.NoError(t, err)
  50. err = testEngine.CreateTables(&Deleted{})
  51. assert.NoError(t, err)
  52. _, err = testEngine.InsertOne(&Deleted{Id: 1, Name: "11111"})
  53. assert.NoError(t, err)
  54. _, err = testEngine.InsertOne(&Deleted{Id: 2, Name: "22222"})
  55. assert.NoError(t, err)
  56. _, err = testEngine.InsertOne(&Deleted{Id: 3, Name: "33333"})
  57. assert.NoError(t, err)
  58. // Test normal Find()
  59. var records1 []Deleted
  60. err = testEngine.Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").Find(&records1, &Deleted{})
  61. assert.EqualValues(t, 3, len(records1))
  62. // Test normal Get()
  63. record1 := &Deleted{}
  64. has, err := testEngine.ID(1).Get(record1)
  65. assert.NoError(t, err)
  66. assert.True(t, has)
  67. // Test Delete() with deleted
  68. affected, err := testEngine.ID(1).Delete(&Deleted{})
  69. assert.NoError(t, err)
  70. assert.EqualValues(t, 1, affected)
  71. has, err = testEngine.ID(1).Get(&Deleted{})
  72. assert.NoError(t, err)
  73. assert.False(t, has)
  74. var records2 []Deleted
  75. err = testEngine.Where("`" + testEngine.ColumnMapper.Obj2Table("Id") + "` > 0").Find(&records2)
  76. assert.NoError(t, err)
  77. assert.EqualValues(t, 2, len(records2))
  78. // Test no rows affected after Delete() again.
  79. affected, err = testEngine.ID(1).Delete(&Deleted{})
  80. assert.NoError(t, err)
  81. assert.EqualValues(t, 0, affected)
  82. // Deleted.DeletedAt must not be updated.
  83. affected, err = testEngine.ID(2).Update(&Deleted{Name: "2", DeletedAt: time.Now()})
  84. assert.NoError(t, err)
  85. assert.EqualValues(t, 1, affected)
  86. record2 := &Deleted{}
  87. has, err = testEngine.ID(2).Get(record2)
  88. assert.NoError(t, err)
  89. assert.True(t, record2.DeletedAt.IsZero())
  90. // Test find all records whatever `deleted`.
  91. var unscopedRecords1 []Deleted
  92. err = testEngine.Unscoped().Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").Find(&unscopedRecords1, &Deleted{})
  93. assert.NoError(t, err)
  94. assert.EqualValues(t, 3, len(unscopedRecords1))
  95. // Delete() must really delete a record with Unscoped()
  96. affected, err = testEngine.Unscoped().ID(1).Delete(&Deleted{})
  97. assert.NoError(t, err)
  98. assert.EqualValues(t, 1, affected)
  99. var unscopedRecords2 []Deleted
  100. err = testEngine.Unscoped().Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").Find(&unscopedRecords2, &Deleted{})
  101. assert.NoError(t, err)
  102. assert.EqualValues(t, 2, len(unscopedRecords2))
  103. var records3 []Deleted
  104. err = testEngine.Where("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` > 0").And("`"+testEngine.ColumnMapper.Obj2Table("Id")+"`> 1").
  105. Or("`"+testEngine.ColumnMapper.Obj2Table("Id")+"` = ?", 3).Find(&records3)
  106. assert.NoError(t, err)
  107. assert.EqualValues(t, 2, len(records3))
  108. }
  109. func TestCacheDelete(t *testing.T) {
  110. assert.NoError(t, prepareEngine())
  111. oldCacher := testEngine.Cacher
  112. cacher := NewLRUCacher(NewMemoryStore(), 1000)
  113. testEngine.SetDefaultCacher(cacher)
  114. type CacheDeleteStruct struct {
  115. Id int64
  116. }
  117. err := testEngine.CreateTables(&CacheDeleteStruct{})
  118. assert.NoError(t, err)
  119. _, err = testEngine.Insert(&CacheDeleteStruct{})
  120. assert.NoError(t, err)
  121. aff, err := testEngine.Delete(&CacheDeleteStruct{
  122. Id: 1,
  123. })
  124. assert.NoError(t, err)
  125. assert.EqualValues(t, aff, 1)
  126. aff, err = testEngine.Unscoped().Delete(&CacheDeleteStruct{
  127. Id: 1,
  128. })
  129. assert.NoError(t, err)
  130. assert.EqualValues(t, aff, 0)
  131. testEngine.SetDefaultCacher(oldCacher)
  132. }
  133. func TestUnscopeDelete(t *testing.T) {
  134. assert.NoError(t, prepareEngine())
  135. type UnscopeDeleteStruct struct {
  136. Id int64
  137. Name string
  138. DeletedAt time.Time `xorm:"deleted"`
  139. }
  140. assertSync(t, new(UnscopeDeleteStruct))
  141. cnt, err := testEngine.Insert(&UnscopeDeleteStruct{
  142. Name: "test",
  143. })
  144. assert.NoError(t, err)
  145. assert.EqualValues(t, 1, cnt)
  146. var nowUnix = time.Now().Unix()
  147. var s UnscopeDeleteStruct
  148. cnt, err = testEngine.ID(1).Delete(&s)
  149. assert.NoError(t, err)
  150. assert.EqualValues(t, 1, cnt)
  151. assert.EqualValues(t, nowUnix, s.DeletedAt.Unix())
  152. var s1 UnscopeDeleteStruct
  153. has, err := testEngine.ID(1).Get(&s1)
  154. assert.NoError(t, err)
  155. assert.False(t, has)
  156. var s2 UnscopeDeleteStruct
  157. has, err = testEngine.ID(1).Unscoped().Get(&s2)
  158. assert.NoError(t, err)
  159. assert.True(t, has)
  160. assert.EqualValues(t, "test", s2.Name)
  161. assert.EqualValues(t, nowUnix, s2.DeletedAt.Unix())
  162. cnt, err = testEngine.ID(1).Unscoped().Delete(new(UnscopeDeleteStruct))
  163. assert.NoError(t, err)
  164. assert.EqualValues(t, 1, cnt)
  165. var s3 UnscopeDeleteStruct
  166. has, err = testEngine.ID(1).Get(&s3)
  167. assert.NoError(t, err)
  168. assert.False(t, has)
  169. var s4 UnscopeDeleteStruct
  170. has, err = testEngine.ID(1).Unscoped().Get(&s4)
  171. assert.NoError(t, err)
  172. assert.False(t, has)
  173. }