collect.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. package basic
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "testing"
  6. "time"
  7. . "git.wecise.com/wecise/odbserver/odb"
  8. "git.wecise.com/wecise/odbserver/odb/test"
  9. "gitee.com/wecisecode/util/logger"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. )
  13. type CollectTests struct {
  14. Test *testing.T
  15. g *Gutil
  16. }
  17. func AuthGroupUpdateTest(t *testing.T) {
  18. g := test.TestG()
  19. t.Run("InitG", func(t *testing.T) {
  20. test := &CollectTests{Test: t, g: g}
  21. test.InitG()
  22. })
  23. t.Run("AuthGroupUpdate", func(t *testing.T) {
  24. test := &CollectTests{Test: t, g: g}
  25. test.AuthGroupUpdate()
  26. })
  27. }
  28. func CollectTest(t *testing.T) {
  29. g := test.TestG()
  30. t.Run("InitG", func(t *testing.T) {
  31. test := &CollectTests{Test: t, g: g}
  32. test.InitG()
  33. })
  34. t.Run("Class", func(t *testing.T) {
  35. test := &CollectTests{Test: t, g: g}
  36. test.Class()
  37. })
  38. t.Run("Data", func(t *testing.T) {
  39. test := &CollectTests{Test: t, g: g}
  40. test.Data()
  41. })
  42. time.Sleep(time.Duration(1) * time.Second)
  43. t.Run("Valid", func(t *testing.T) {
  44. test := &CollectTests{Test: t, g: g}
  45. test.Valid()
  46. })
  47. time.Sleep(time.Duration(1) * time.Second)
  48. t.Run("Search", func(t *testing.T) {
  49. test := &CollectTests{Test: t, g: g}
  50. test.Search()
  51. })
  52. t.Run("Aggr", func(t *testing.T) {
  53. test := &CollectTests{Test: t, g: g}
  54. test.Aggr()
  55. })
  56. t.Run("AuthGroup", func(t *testing.T) {
  57. test := &CollectTests{Test: t, g: g}
  58. test.AuthGroup()
  59. })
  60. }
  61. func (t *CollectTests) InitG() {
  62. require.NotNil(t.Test, t.g)
  63. }
  64. func (t *CollectTests) Class() {
  65. _, _, err := t.g.Query(`
  66. typedef if not exists STRSTR = varchar ;
  67. typedef if not exists VENUM = enum {
  68. "0":["command", "命令"],
  69. "1":["shell", "shell脚本"],
  70. "2":["lua", "lua脚本"],
  71. "3":["task", "任务"],
  72. "4":["js", "js脚本"]
  73. } ;
  74. typedef if not exists FLIST = float[0..?] ;
  75. typedef if not exists FFLIST = FLIST ;
  76. typedef if not exists FFFLIST = FFLIST ;
  77. create class if not exists /test();
  78. create class if not exists /test/collect (
  79. v_varchar varchar,
  80. v_map map<STRSTR, STRSTR>,
  81. v_list list<STRSTR>,
  82. d_list double[2..3],
  83. f_list FFFLIST,
  84. i_list list<int>,
  85. v_set set<STRSTR>,
  86. v_type VENUM,
  87. indexes(v_varchar, v_map, v_list, v_set, v_type, d_list, f_list, i_list),
  88. keys(v_varchar)
  89. );`)
  90. if err != nil {
  91. logger.Errorf("%v", err)
  92. }
  93. require.Nil(t.Test, err, fmt.Sprint(err))
  94. }
  95. func (t *CollectTests) Data() {
  96. var err error
  97. _, _, err = t.g.Query(`insert into /test/collect (v_varchar, v_map, v_list, d_list, f_list, i_list, v_set, v_type ) values ('1', {"map1": "val1", "map2":"2"}, ["list1", "list2"], [2.5, 2.5], [3.6, 3.6], [1, 2], ["set1", "set2"], "4" )`)
  98. _, _, err = t.g.Query(`insert into /test/collect (v_varchar, v_map, v_list, v_set, v_type ) values ('2', {"map1": "val2", "map2":"2"}, ["list1", "list2"], ["set1", "set3"], "shell脚本" )`)
  99. _, _, err = t.g.Query(`insert into /test/collect (v_varchar, v_map, v_list, v_set, v_type ) values ('3', {"map1": "val3", "map2":"2"}, ["list1", "list3"], ["set1", "set2"], "2" )`)
  100. _, _, err = t.g.Query(`insert into /test/collect (v_varchar, v_map, v_list, v_set, v_type ) values ('4', {"map1": "val3", "map2":"2"}, [], ["set1", "set4"], "3" )`)
  101. _, _, err = t.g.Query(`insert into /test/collect (v_varchar, v_map, v_list, v_set, v_type ) values ('5', {"map1": "val3", "map2":"2"}, nil, ["set1", "set4"], "3" )`)
  102. if err != nil {
  103. logger.Errorf("%v", err)
  104. }
  105. require.Nil(t.Test, err, fmt.Sprint(err))
  106. }
  107. func (t *CollectTests) Valid() {
  108. rtn, _, err := t.g.Query(`select * from /test/collect`)
  109. if err != nil {
  110. logger.Errorf("%v", err)
  111. }
  112. if assert.Nil(t.Test, err) {
  113. if assert.NotNil(t.Test, rtn) {
  114. assert.Equal(t.Test, 5, len(rtn), "they should be equal")
  115. }
  116. }
  117. _, _, err = t.g.Query(`alter class /test/collect modify v_type merge enum { "5": [ "测试", "测试" ] }`)
  118. if err != nil {
  119. logger.Errorf("%v", err)
  120. }
  121. require.Nil(t.Test, err, fmt.Sprint(err))
  122. _, _, err = t.g.Query(`alter class /test/collect modify v_type merge enum { "0": [] }`)
  123. if err != nil {
  124. logger.Errorf("%v", err)
  125. }
  126. require.Nil(t.Test, err, fmt.Sprint(err))
  127. _, _, err = t.g.Query(`alter class /test/collect add index column v_text text`)
  128. // if err != nil {
  129. // logger.Errorf("%v", err)
  130. // }
  131. // require.Nil(t.Test, err, fmt.Sprint(err))
  132. // 忽略二次执行报错
  133. }
  134. func (t *CollectTests) Search() {
  135. var err error
  136. var rtn []map[string]interface{}
  137. rtn, _, err = t.g.Query(`select * from /test/collect where v_map[key] = 'map1'`)
  138. if err != nil {
  139. logger.Errorf("%v", err)
  140. }
  141. if assert.Nil(t.Test, err) {
  142. assert.Equal(t.Test, 5, len(rtn), fmt.Sprintf("not find v_map key = %v", "map1"))
  143. }
  144. rtn, _, err = t.g.Query(`select * from /test/collect where v_map = 'val2'`)
  145. if err != nil {
  146. logger.Errorf("%v", err)
  147. }
  148. if assert.Nil(t.Test, err) {
  149. assert.Equal(t.Test, 1, len(rtn), fmt.Sprintf("not find v_map = %v", "val2"))
  150. }
  151. rtn, _, err = t.g.Query(`select * from /test/collect where v_map['map1'] = 'val2'`)
  152. if err != nil {
  153. logger.Errorf("%v", err)
  154. }
  155. if assert.Nil(t.Test, err) {
  156. assert.Equal(t.Test, 1, len(rtn), fmt.Sprintf("not find v_map['map1'] = %v", "val2"))
  157. }
  158. rtn, _, err = t.g.Query(`select * from /test/collect where v_list = 'list1'`)
  159. if err != nil {
  160. logger.Errorf("%v", err)
  161. }
  162. if assert.Nil(t.Test, err) {
  163. assert.Equal(t.Test, 3, len(rtn), fmt.Sprintf("not find v_list = %v", "list1"))
  164. }
  165. rtn, _, err = t.g.Query(`select * from /test/collect where v_set = 'set1'`)
  166. if err != nil {
  167. logger.Errorf("%v", err)
  168. }
  169. if assert.Nil(t.Test, err) {
  170. assert.Equal(t.Test, 5, len(rtn), fmt.Sprintf("not find v_set = %v", "set1"))
  171. }
  172. }
  173. func (t *CollectTests) Aggr() {
  174. var err error
  175. var rtn []map[string]interface{}
  176. rtn, _, err = t.g.Query(`select count(*) from /test/collect group by v_list`)
  177. if err != nil {
  178. logger.Errorf("%v", err)
  179. }
  180. //-------------------------------
  181. // 目前无法区分nil 和 ""
  182. //-------------------------------
  183. if assert.Nil(t.Test, err) {
  184. assert.Equal(t.Test, 3, len(rtn), fmt.Sprintf("not find v_map key = %v", "map1"))
  185. }
  186. }
  187. func (t *CollectTests) AuthGroup() {
  188. var err error
  189. var rtn []map[string]interface{}
  190. stat, err := t.g.Prepare(`update /matrix/group set _group = _group + ? where name in ? `)
  191. if err != nil {
  192. fmt.Printf("%v", err)
  193. }
  194. if assert.Nil(t.Test, err) {
  195. _, _, err = stat.Exec(map[string][]string{"add": []string{"网络部"}, "delete": []string{"网络部"}, "edit": []string{"网络部"}, "list": []string{"网络部"}}, []string{"admin"})
  196. assert.Nil(t.Test, err, err)
  197. rtn, _, err = t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  198. if assert.Nil(t.Test, err) {
  199. if assert.Equal(t.Test, 1, len(rtn), "not find .") {
  200. groups := rtn[0]["_group"].(map[string][]string)
  201. assert.Equal(t.Test, []string{"网络部"}, groups["delete"], "not find .")
  202. }
  203. }
  204. _, _, err = stat.Exec(map[string][]interface{}{"add": []interface{}{"市场部"}}, []interface{}{"admin"})
  205. assert.Nil(t.Test, err)
  206. rtn, _, err = t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  207. if assert.Nil(t.Test, err) {
  208. if assert.Equal(t.Test, 1, len(rtn), "not find .") {
  209. groups := rtn[0]["_group"].(map[string][]string)
  210. assert.Equal(t.Test, 2, len(groups["add"]), "not find .")
  211. }
  212. }
  213. }
  214. }
  215. func (t *CollectTests) AuthGroupUpdate() {
  216. {
  217. rtn, _, err := t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  218. if err != nil {
  219. fmt.Printf("%v", err)
  220. return
  221. }
  222. bs, _ := json.MarshalIndent(rtn, "", " ")
  223. fmt.Println("group info:", string(bs))
  224. rtn, _, err = t.g.Query(`update /matrix/group set _group = null where name = 'admin'`)
  225. if err != nil {
  226. fmt.Printf("%v", err)
  227. return
  228. }
  229. rtn, _, err = t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  230. if err != nil {
  231. fmt.Printf("%v", err)
  232. return
  233. }
  234. bs, _ = json.MarshalIndent(rtn, "", " ")
  235. fmt.Println("null group info:", string(bs))
  236. if len(rtn) != 1 || rtn[0] == nil ||
  237. (rtn[0]["_group"] != nil && rtn[0]["_group"].(map[string][]string) != nil && len(rtn[0]["_group"].(map[string][]string)) > 0) {
  238. err = fmt.Errorf("group info is not null")
  239. fmt.Println(err)
  240. assert.Nil(t.Test, err)
  241. return
  242. }
  243. }
  244. var err error
  245. var rtn []map[string]interface{}
  246. stat, err := t.g.Prepare(`update /matrix/group set _group = _group + ? where name in ? `)
  247. if err != nil {
  248. fmt.Printf("%v", err)
  249. }
  250. if assert.Nil(t.Test, err) {
  251. _, _, err = stat.Exec(map[string][]string{"add": []string{"网络部"}, "delete": []string{"网络部"}, "edit": []string{"网络部"}, "list": []string{"网络部"}}, []string{"admin"})
  252. assert.Nil(t.Test, err, err)
  253. rtn, _, err = t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  254. if assert.Nil(t.Test, err) {
  255. if assert.Equal(t.Test, 1, len(rtn), "not find .") {
  256. groups := rtn[0]["_group"].(map[string][]string)
  257. assert.Equal(t.Test, []string{"网络部"}, groups["delete"], "not find .")
  258. }
  259. }
  260. bs, _ := json.MarshalIndent(rtn, "", " ")
  261. fmt.Println("update 1 group info:", string(bs))
  262. _, _, err = stat.Exec(map[string][]interface{}{"add": []interface{}{"市场部"}}, []interface{}{"admin"})
  263. assert.Nil(t.Test, err)
  264. rtn, _, err = t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  265. if assert.Nil(t.Test, err) {
  266. if assert.Equal(t.Test, 1, len(rtn), "not find .") {
  267. groups := rtn[0]["_group"].(map[string][]string)
  268. assert.Equal(t.Test, 2, len(groups["add"]), "not find .")
  269. }
  270. }
  271. bs, _ = json.MarshalIndent(rtn, "", " ")
  272. fmt.Println("update 2 group info:", string(bs))
  273. }
  274. time.Sleep(300 * time.Millisecond)
  275. rtn, _, err = t.g.Query(`select _group from /matrix/group where name = 'admin' refresh`)
  276. if assert.Nil(t.Test, err) {
  277. if assert.Equal(t.Test, 1, len(rtn), "not find .") {
  278. groups := rtn[0]["_group"].(map[string][]string)
  279. assert.Equal(t.Test, 2, len(groups["add"]), "not find .")
  280. }
  281. }
  282. bs, _ := json.MarshalIndent(rtn, "", " ")
  283. fmt.Println("sleep 300ms group info:", string(bs))
  284. }