1 package redis_test
2
3 import (
4 "fmt"
5
6 "github.com/go-redis/redis"
7
8 . "github.com/onsi/ginkgo"
9 . "github.com/onsi/gomega"
10 )
11
12 var _ = Describe("ScanIterator", func() {
13 var client *redis.Client
14
15 var seed = func(n int) error {
16 pipe := client.Pipeline()
17 for i := 1; i <= n; i++ {
18 pipe.Set(fmt.Sprintf("K%02d", i), "x", 0).Err()
19 }
20 _, err := pipe.Exec()
21 return err
22 }
23
24 var extraSeed = func(n int, m int) error {
25 pipe := client.Pipeline()
26 for i := 1; i <= m; i++ {
27 pipe.Set(fmt.Sprintf("A%02d", i), "x", 0).Err()
28 }
29 for i := 1; i <= n; i++ {
30 pipe.Set(fmt.Sprintf("K%02d", i), "x", 0).Err()
31 }
32 _, err := pipe.Exec()
33 return err
34 }
35
36 var hashKey = "K_HASHTEST"
37 var hashSeed = func(n int) error {
38 pipe := client.Pipeline()
39 for i := 1; i <= n; i++ {
40 pipe.HSet(hashKey, fmt.Sprintf("K%02d", i), "x").Err()
41 }
42 _, err := pipe.Exec()
43 return err
44 }
45
46 BeforeEach(func() {
47 client = redis.NewClient(redisOptions())
48 Expect(client.FlushDB().Err()).NotTo(HaveOccurred())
49 })
50
51 AfterEach(func() {
52 Expect(client.Close()).NotTo(HaveOccurred())
53 })
54
55 It("should scan across empty DBs", func() {
56 iter := client.Scan(0, "", 10).Iterator()
57 Expect(iter.Next()).To(BeFalse())
58 Expect(iter.Err()).NotTo(HaveOccurred())
59 })
60
61 It("should scan across one page", func() {
62 Expect(seed(7)).NotTo(HaveOccurred())
63
64 var vals []string
65 iter := client.Scan(0, "", 0).Iterator()
66 for iter.Next() {
67 vals = append(vals, iter.Val())
68 }
69 Expect(iter.Err()).NotTo(HaveOccurred())
70 Expect(vals).To(ConsistOf([]string{"K01", "K02", "K03", "K04", "K05", "K06", "K07"}))
71 })
72
73 It("should scan across multiple pages", func() {
74 Expect(seed(71)).NotTo(HaveOccurred())
75
76 var vals []string
77 iter := client.Scan(0, "", 10).Iterator()
78 for iter.Next() {
79 vals = append(vals, iter.Val())
80 }
81 Expect(iter.Err()).NotTo(HaveOccurred())
82 Expect(vals).To(HaveLen(71))
83 Expect(vals).To(ContainElement("K01"))
84 Expect(vals).To(ContainElement("K71"))
85 })
86
87 It("should hscan across multiple pages", func() {
88 Expect(hashSeed(71)).NotTo(HaveOccurred())
89
90 var vals []string
91 iter := client.HScan(hashKey, 0, "", 10).Iterator()
92 for iter.Next() {
93 vals = append(vals, iter.Val())
94 }
95 Expect(iter.Err()).NotTo(HaveOccurred())
96 Expect(vals).To(HaveLen(71 * 2))
97 Expect(vals).To(ContainElement("K01"))
98 Expect(vals).To(ContainElement("K71"))
99 })
100
101 It("should scan to page borders", func() {
102 Expect(seed(20)).NotTo(HaveOccurred())
103
104 var vals []string
105 iter := client.Scan(0, "", 10).Iterator()
106 for iter.Next() {
107 vals = append(vals, iter.Val())
108 }
109 Expect(iter.Err()).NotTo(HaveOccurred())
110 Expect(vals).To(HaveLen(20))
111 })
112
113 It("should scan with match", func() {
114 Expect(seed(33)).NotTo(HaveOccurred())
115
116 var vals []string
117 iter := client.Scan(0, "K*2*", 10).Iterator()
118 for iter.Next() {
119 vals = append(vals, iter.Val())
120 }
121 Expect(iter.Err()).NotTo(HaveOccurred())
122 Expect(vals).To(HaveLen(13))
123 })
124
125 It("should scan with match across empty pages", func() {
126 Expect(extraSeed(2, 10)).NotTo(HaveOccurred())
127
128 var vals []string
129 iter := client.Scan(0, "K*", 1).Iterator()
130 for iter.Next() {
131 vals = append(vals, iter.Val())
132 }
133 Expect(iter.Err()).NotTo(HaveOccurred())
134 Expect(vals).To(HaveLen(2))
135 })
136 })
137
View as plain text