session_cond_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  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. "errors"
  7. "fmt"
  8. "testing"
  9. "github.com/go-xorm/builder"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestBuilder(t *testing.T) {
  13. assert.NoError(t, prepareEngine())
  14. const (
  15. OpEqual int = iota
  16. OpGreatThan
  17. OpLessThan
  18. )
  19. type Condition struct {
  20. Id int64
  21. TableName string
  22. ColName string
  23. Op int
  24. Value string
  25. }
  26. err := testEngine.CreateTables(&Condition{})
  27. assert.NoError(t, err)
  28. _, err = testEngine.Insert(&Condition{TableName: "table1", ColName: "col1", Op: OpEqual, Value: "1"})
  29. assert.NoError(t, err)
  30. var cond Condition
  31. has, err := testEngine.Where(builder.Eq{"col_name": "col1"}).Get(&cond)
  32. assert.NoError(t, err)
  33. assert.Equal(t, true, has, "records should exist")
  34. has, err = testEngine.Where(builder.Eq{"col_name": "col1"}.
  35. And(builder.Eq{"op": OpEqual})).
  36. NoAutoCondition().
  37. Get(&cond)
  38. assert.NoError(t, err)
  39. assert.Equal(t, true, has, "records should exist")
  40. has, err = testEngine.Where(builder.Eq{"col_name": "col1", "op": OpEqual, "value": "1"}).
  41. NoAutoCondition().
  42. Get(&cond)
  43. assert.NoError(t, err)
  44. assert.Equal(t, true, has, "records should exist")
  45. has, err = testEngine.Where(builder.Eq{"col_name": "col1"}.
  46. And(builder.Neq{"op": OpEqual})).
  47. NoAutoCondition().
  48. Get(&cond)
  49. assert.NoError(t, err)
  50. assert.Equal(t, false, has, "records should not exist")
  51. var conds []Condition
  52. err = testEngine.Where(builder.Eq{"col_name": "col1"}.
  53. And(builder.Eq{"op": OpEqual})).
  54. Find(&conds)
  55. assert.NoError(t, err)
  56. assert.EqualValues(t, 1, len(conds), "records should exist")
  57. conds = make([]Condition, 0)
  58. err = testEngine.Where(builder.Like{"col_name", "col"}).Find(&conds)
  59. assert.NoError(t, err)
  60. assert.EqualValues(t, 1, len(conds), "records should exist")
  61. conds = make([]Condition, 0)
  62. err = testEngine.Where(builder.Expr("col_name = ?", "col1")).Find(&conds)
  63. assert.NoError(t, err)
  64. assert.EqualValues(t, 1, len(conds), "records should exist")
  65. conds = make([]Condition, 0)
  66. err = testEngine.Where(builder.In("col_name", "col1", "col2")).Find(&conds)
  67. assert.NoError(t, err)
  68. assert.EqualValues(t, 1, len(conds), "records should exist")
  69. // complex condtions
  70. var where = builder.NewCond()
  71. if true {
  72. where = where.And(builder.Eq{"col_name": "col1"})
  73. where = where.Or(builder.And(builder.In("col_name", "col1", "col2"), builder.Expr("col_name = ?", "col1")))
  74. }
  75. conds = make([]Condition, 0)
  76. err = testEngine.Where(where).Find(&conds)
  77. assert.NoError(t, err)
  78. assert.EqualValues(t, 1, len(conds), "records should exist")
  79. }
  80. func TestIn(t *testing.T) {
  81. assert.NoError(t, prepareEngine())
  82. assert.NoError(t, testEngine.Sync2(new(Userinfo)))
  83. cnt, err := testEngine.Insert([]Userinfo{
  84. {
  85. Username: "user1",
  86. Departname: "dev",
  87. },
  88. {
  89. Username: "user2",
  90. Departname: "dev",
  91. },
  92. {
  93. Username: "user3",
  94. Departname: "dev",
  95. },
  96. })
  97. assert.NoError(t, err)
  98. assert.EqualValues(t, 3, cnt)
  99. var usrs []Userinfo
  100. err = testEngine.Limit(3).Find(&usrs)
  101. if err != nil {
  102. t.Error(err)
  103. panic(err)
  104. }
  105. if len(usrs) != 3 {
  106. err = errors.New("there are not 3 records")
  107. t.Error(err)
  108. panic(err)
  109. }
  110. var ids []int64
  111. var idsStr string
  112. for _, u := range usrs {
  113. ids = append(ids, u.Uid)
  114. idsStr = fmt.Sprintf("%d,", u.Uid)
  115. }
  116. idsStr = idsStr[:len(idsStr)-1]
  117. users := make([]Userinfo, 0)
  118. err = testEngine.In("(id)", ids[0], ids[1], ids[2]).Find(&users)
  119. if err != nil {
  120. t.Error(err)
  121. panic(err)
  122. }
  123. fmt.Println(users)
  124. if len(users) != 3 {
  125. err = errors.New("in uses should be " + idsStr + " total 3")
  126. t.Error(err)
  127. panic(err)
  128. }
  129. users = make([]Userinfo, 0)
  130. err = testEngine.In("(id)", ids).Find(&users)
  131. if err != nil {
  132. t.Error(err)
  133. panic(err)
  134. }
  135. fmt.Println(users)
  136. if len(users) != 3 {
  137. err = errors.New("in uses should be " + idsStr + " total 3")
  138. t.Error(err)
  139. panic(err)
  140. }
  141. for _, user := range users {
  142. if user.Uid != ids[0] && user.Uid != ids[1] && user.Uid != ids[2] {
  143. err = errors.New("in uses should be " + idsStr + " total 3")
  144. t.Error(err)
  145. panic(err)
  146. }
  147. }
  148. users = make([]Userinfo, 0)
  149. var idsInterface []interface{}
  150. for _, id := range ids {
  151. idsInterface = append(idsInterface, id)
  152. }
  153. department := "`" + testEngine.ColumnMapper.Obj2Table("Departname") + "`"
  154. err = testEngine.Where(department+" = ?", "dev").In("(id)", idsInterface...).Find(&users)
  155. if err != nil {
  156. t.Error(err)
  157. panic(err)
  158. }
  159. fmt.Println(users)
  160. if len(users) != 3 {
  161. err = errors.New("in uses should be " + idsStr + " total 3")
  162. t.Error(err)
  163. panic(err)
  164. }
  165. for _, user := range users {
  166. if user.Uid != ids[0] && user.Uid != ids[1] && user.Uid != ids[2] {
  167. err = errors.New("in uses should be " + idsStr + " total 3")
  168. t.Error(err)
  169. panic(err)
  170. }
  171. }
  172. dev := testEngine.ColumnMapper.Obj2Table("Dev")
  173. err = testEngine.In("(id)", 1).In("(id)", 2).In(department, dev).Find(&users)
  174. if err != nil {
  175. t.Error(err)
  176. panic(err)
  177. }
  178. fmt.Println(users)
  179. cnt, err = testEngine.In("(id)", ids[0]).Update(&Userinfo{Departname: "dev-"})
  180. if err != nil {
  181. t.Error(err)
  182. panic(err)
  183. }
  184. if cnt != 1 {
  185. err = errors.New("update records not 1")
  186. t.Error(err)
  187. panic(err)
  188. }
  189. user := new(Userinfo)
  190. has, err := testEngine.Id(ids[0]).Get(user)
  191. if err != nil {
  192. t.Error(err)
  193. panic(err)
  194. }
  195. if !has {
  196. err = errors.New("get record not 1")
  197. t.Error(err)
  198. panic(err)
  199. }
  200. if user.Departname != "dev-" {
  201. err = errors.New("update not success")
  202. t.Error(err)
  203. panic(err)
  204. }
  205. cnt, err = testEngine.In("(id)", ids[0]).Update(&Userinfo{Departname: "dev"})
  206. if err != nil {
  207. t.Error(err)
  208. panic(err)
  209. }
  210. if cnt != 1 {
  211. err = errors.New("update records not 1")
  212. t.Error(err)
  213. panic(err)
  214. }
  215. cnt, err = testEngine.In("(id)", ids[1]).Delete(&Userinfo{})
  216. if err != nil {
  217. t.Error(err)
  218. panic(err)
  219. }
  220. if cnt != 1 {
  221. err = errors.New("deleted records not 1")
  222. t.Error(err)
  223. panic(err)
  224. }
  225. }
  226. func TestFindAndCount(t *testing.T) {
  227. assert.NoError(t, prepareEngine())
  228. type FindAndCount struct {
  229. Id int64
  230. Name string
  231. }
  232. assert.NoError(t, testEngine.Sync2(new(FindAndCount)))
  233. _, err := testEngine.Insert([]FindAndCount{
  234. {
  235. Name: "test1",
  236. },
  237. {
  238. Name: "test2",
  239. },
  240. })
  241. assert.NoError(t, err)
  242. var results []FindAndCount
  243. sess := testEngine.Where("name = ?", "test1")
  244. conds := sess.Conds()
  245. err = sess.Find(&results)
  246. assert.NoError(t, err)
  247. assert.EqualValues(t, 1, len(results))
  248. total, err := testEngine.Where(conds).Count(new(FindAndCount))
  249. assert.NoError(t, err)
  250. assert.EqualValues(t, 1, total)
  251. }