session_cond_test.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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. conds = make([]Condition, 0)
  70. err = testEngine.NotIn("col_name", "col1", "col2").Find(&conds)
  71. assert.NoError(t, err)
  72. assert.EqualValues(t, 0, len(conds), "records should not exist")
  73. // complex condtions
  74. var where = builder.NewCond()
  75. if true {
  76. where = where.And(builder.Eq{"col_name": "col1"})
  77. where = where.Or(builder.And(builder.In("col_name", "col1", "col2"), builder.Expr("col_name = ?", "col1")))
  78. }
  79. conds = make([]Condition, 0)
  80. err = testEngine.Where(where).Find(&conds)
  81. assert.NoError(t, err)
  82. assert.EqualValues(t, 1, len(conds), "records should exist")
  83. }
  84. func TestIn(t *testing.T) {
  85. assert.NoError(t, prepareEngine())
  86. assert.NoError(t, testEngine.Sync2(new(Userinfo)))
  87. cnt, err := testEngine.Insert([]Userinfo{
  88. {
  89. Username: "user1",
  90. Departname: "dev",
  91. },
  92. {
  93. Username: "user2",
  94. Departname: "dev",
  95. },
  96. {
  97. Username: "user3",
  98. Departname: "dev",
  99. },
  100. })
  101. assert.NoError(t, err)
  102. assert.EqualValues(t, 3, cnt)
  103. var usrs []Userinfo
  104. err = testEngine.Limit(3).Find(&usrs)
  105. if err != nil {
  106. t.Error(err)
  107. panic(err)
  108. }
  109. if len(usrs) != 3 {
  110. err = errors.New("there are not 3 records")
  111. t.Error(err)
  112. panic(err)
  113. }
  114. var ids []int64
  115. var idsStr string
  116. for _, u := range usrs {
  117. ids = append(ids, u.Uid)
  118. idsStr = fmt.Sprintf("%d,", u.Uid)
  119. }
  120. idsStr = idsStr[:len(idsStr)-1]
  121. users := make([]Userinfo, 0)
  122. err = testEngine.In("(id)", ids[0], ids[1], ids[2]).Find(&users)
  123. if err != nil {
  124. t.Error(err)
  125. panic(err)
  126. }
  127. fmt.Println(users)
  128. if len(users) != 3 {
  129. err = errors.New("in uses should be " + idsStr + " total 3")
  130. t.Error(err)
  131. panic(err)
  132. }
  133. users = make([]Userinfo, 0)
  134. err = testEngine.In("(id)", ids).Find(&users)
  135. if err != nil {
  136. t.Error(err)
  137. panic(err)
  138. }
  139. fmt.Println(users)
  140. if len(users) != 3 {
  141. err = errors.New("in uses should be " + idsStr + " total 3")
  142. t.Error(err)
  143. panic(err)
  144. }
  145. for _, user := range users {
  146. if user.Uid != ids[0] && user.Uid != ids[1] && user.Uid != ids[2] {
  147. err = errors.New("in uses should be " + idsStr + " total 3")
  148. t.Error(err)
  149. panic(err)
  150. }
  151. }
  152. users = make([]Userinfo, 0)
  153. var idsInterface []interface{}
  154. for _, id := range ids {
  155. idsInterface = append(idsInterface, id)
  156. }
  157. department := "`" + testEngine.ColumnMapper.Obj2Table("Departname") + "`"
  158. err = testEngine.Where(department+" = ?", "dev").In("(id)", idsInterface...).Find(&users)
  159. if err != nil {
  160. t.Error(err)
  161. panic(err)
  162. }
  163. fmt.Println(users)
  164. if len(users) != 3 {
  165. err = errors.New("in uses should be " + idsStr + " total 3")
  166. t.Error(err)
  167. panic(err)
  168. }
  169. for _, user := range users {
  170. if user.Uid != ids[0] && user.Uid != ids[1] && user.Uid != ids[2] {
  171. err = errors.New("in uses should be " + idsStr + " total 3")
  172. t.Error(err)
  173. panic(err)
  174. }
  175. }
  176. dev := testEngine.ColumnMapper.Obj2Table("Dev")
  177. err = testEngine.In("(id)", 1).In("(id)", 2).In(department, dev).Find(&users)
  178. if err != nil {
  179. t.Error(err)
  180. panic(err)
  181. }
  182. fmt.Println(users)
  183. cnt, err = testEngine.In("(id)", ids[0]).Update(&Userinfo{Departname: "dev-"})
  184. if err != nil {
  185. t.Error(err)
  186. panic(err)
  187. }
  188. if cnt != 1 {
  189. err = errors.New("update records not 1")
  190. t.Error(err)
  191. panic(err)
  192. }
  193. user := new(Userinfo)
  194. has, err := testEngine.Id(ids[0]).Get(user)
  195. if err != nil {
  196. t.Error(err)
  197. panic(err)
  198. }
  199. if !has {
  200. err = errors.New("get record not 1")
  201. t.Error(err)
  202. panic(err)
  203. }
  204. if user.Departname != "dev-" {
  205. err = errors.New("update not success")
  206. t.Error(err)
  207. panic(err)
  208. }
  209. cnt, err = testEngine.In("(id)", ids[0]).Update(&Userinfo{Departname: "dev"})
  210. if err != nil {
  211. t.Error(err)
  212. panic(err)
  213. }
  214. if cnt != 1 {
  215. err = errors.New("update records not 1")
  216. t.Error(err)
  217. panic(err)
  218. }
  219. cnt, err = testEngine.In("(id)", ids[1]).Delete(&Userinfo{})
  220. if err != nil {
  221. t.Error(err)
  222. panic(err)
  223. }
  224. if cnt != 1 {
  225. err = errors.New("deleted records not 1")
  226. t.Error(err)
  227. panic(err)
  228. }
  229. }
  230. func TestFindAndCount(t *testing.T) {
  231. assert.NoError(t, prepareEngine())
  232. type FindAndCount struct {
  233. Id int64
  234. Name string
  235. }
  236. assert.NoError(t, testEngine.Sync2(new(FindAndCount)))
  237. _, err := testEngine.Insert([]FindAndCount{
  238. {
  239. Name: "test1",
  240. },
  241. {
  242. Name: "test2",
  243. },
  244. })
  245. assert.NoError(t, err)
  246. var results []FindAndCount
  247. sess := testEngine.Where("name = ?", "test1")
  248. conds := sess.Conds()
  249. err = sess.Find(&results)
  250. assert.NoError(t, err)
  251. assert.EqualValues(t, 1, len(results))
  252. total, err := testEngine.Where(conds).Count(new(FindAndCount))
  253. assert.NoError(t, err)
  254. assert.EqualValues(t, 1, total)
  255. }