fakeredis 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,209 @@
1
+ require 'spec_helper'
2
+
3
+ module FakeRedis
4
+ describe "#bitop" do
5
+ before(:all) do
6
+ @client = Redis.new
7
+ end
8
+
9
+ before(:each) do
10
+ @client.discard rescue nil
11
+ end
12
+
13
+ it 'raises an argument error when passed unsupported operation' do
14
+ lambda { @client.bitop("meh", "dest1", "key1") }.should raise_error(Redis::CommandError)
15
+ end
16
+
17
+ describe "or" do
18
+ it_should_behave_like "a bitwise operation", "or"
19
+
20
+ it "should apply bitwise or operation" do
21
+ @client.setbit("key1", 0, 0)
22
+ @client.setbit("key1", 1, 1)
23
+ @client.setbit("key1", 2, 1)
24
+ @client.setbit("key1", 3, 0)
25
+
26
+ @client.setbit("key2", 0, 1)
27
+ @client.setbit("key2", 1, 1)
28
+ @client.setbit("key2", 2, 0)
29
+ @client.setbit("key2", 3, 0)
30
+
31
+ @client.bitop("or", "dest1", "key1", "key2").should be == 1
32
+ @client.bitcount("dest1").should be == 3
33
+ @client.getbit("dest1", 0).should be == 1
34
+ @client.getbit("dest1", 1).should be == 1
35
+ @client.getbit("dest1", 2).should be == 1
36
+ @client.getbit("dest1", 3).should be == 0
37
+ end
38
+
39
+ it "should apply bitwise or operation with empty values" do
40
+ @client.setbit("key1", 1, 1)
41
+
42
+ @client.bitop("or", "dest1", "key1", "nothing_here1", "nothing_here2").should be == 1
43
+ @client.bitcount("dest1").should be == 1
44
+ @client.getbit("dest1", 0).should be == 0
45
+ @client.getbit("dest1", 1).should be == 1
46
+ @client.getbit("dest1", 2).should be == 0
47
+ end
48
+
49
+ it "should apply bitwise or operation with multiple keys" do
50
+ @client.setbit("key1", 1, 1)
51
+ @client.setbit("key1", 3, 1)
52
+
53
+ @client.setbit("key2", 5, 1)
54
+ @client.setbit("key2", 10, 1)
55
+
56
+ @client.setbit("key3", 13, 1)
57
+ @client.setbit("key3", 15, 1)
58
+
59
+ @client.bitop("or", "dest1", "key1", "key2", "key3").should be == 2
60
+ @client.bitcount("dest1").should be == 6
61
+ @client.getbit("dest1", 1).should be == 1
62
+ @client.getbit("dest1", 3).should be == 1
63
+ @client.getbit("dest1", 5).should be == 1
64
+ @client.getbit("dest1", 10).should be == 1
65
+ @client.getbit("dest1", 13).should be == 1
66
+ @client.getbit("dest1", 15).should be == 1
67
+ @client.getbit("dest1", 2).should be == 0
68
+ @client.getbit("dest1", 12).should be == 0
69
+ end
70
+ end
71
+
72
+ describe "and" do
73
+ it_should_behave_like "a bitwise operation", "and"
74
+
75
+ it "should apply bitwise and operation" do
76
+ @client.setbit("key1", 0, 1)
77
+ @client.setbit("key1", 1, 1)
78
+ @client.setbit("key1", 2, 0)
79
+
80
+ @client.setbit("key2", 0, 0)
81
+ @client.setbit("key2", 1, 1)
82
+ @client.setbit("key2", 2, 1)
83
+
84
+ @client.bitop("and", "dest1", "key1", "key2").should be == 1
85
+ @client.bitcount("dest1").should be == 1
86
+ @client.getbit("dest1", 0).should be == 0
87
+ @client.getbit("dest1", 1).should be == 1
88
+ @client.getbit("dest1", 2).should be == 0
89
+ end
90
+
91
+ it "should apply bitwise and operation with empty values" do
92
+ @client.setbit("key1", 1, 1)
93
+
94
+ @client.bitop("and", "dest1", "key1", "nothing_here").should be == 1
95
+ @client.bitcount("dest1").should be == 1
96
+ @client.getbit("dest1", 0).should be == 0
97
+ @client.getbit("dest1", 1).should be == 1
98
+ @client.getbit("dest1", 2).should be == 0
99
+ end
100
+
101
+ it "should apply bitwise and operation with multiple keys" do
102
+ @client.setbit("key1", 1, 1)
103
+ @client.setbit("key1", 2, 1)
104
+ @client.setbit("key1", 3, 1)
105
+ @client.setbit("key1", 4, 1)
106
+
107
+ @client.setbit("key2", 2, 1)
108
+ @client.setbit("key2", 3, 1)
109
+ @client.setbit("key2", 4, 1)
110
+ @client.setbit("key2", 5, 1)
111
+
112
+ @client.setbit("key3", 2, 1)
113
+ @client.setbit("key3", 4, 1)
114
+ @client.setbit("key3", 5, 1)
115
+ @client.setbit("key3", 6, 1)
116
+
117
+ @client.bitop("and", "dest1", "key1", "key2", "key3").should be == 1
118
+ @client.bitcount("dest1").should be == 2
119
+ @client.getbit("dest1", 1).should be == 0
120
+ @client.getbit("dest1", 2).should be == 1
121
+ @client.getbit("dest1", 3).should be == 0
122
+ @client.getbit("dest1", 4).should be == 1
123
+ @client.getbit("dest1", 5).should be == 0
124
+ @client.getbit("dest1", 6).should be == 0
125
+ end
126
+ end
127
+
128
+ describe "xor" do
129
+ it_should_behave_like "a bitwise operation", "xor"
130
+
131
+ it "should apply bitwise xor operation" do
132
+ @client.setbit("key1", 0, 0)
133
+ @client.setbit("key1", 1, 1)
134
+ @client.setbit("key1", 2, 0)
135
+ @client.setbit("key1", 3, 0)
136
+
137
+ @client.setbit("key2", 0, 1)
138
+ @client.setbit("key2", 1, 1)
139
+ @client.setbit("key2", 2, 1)
140
+ @client.setbit("key2", 3, 0)
141
+
142
+ @client.bitop("xor", "dest1", "key1", "key2").should be == 1
143
+ @client.bitcount("dest1").should be == 2
144
+ @client.getbit("dest1", 0).should be == 1
145
+ @client.getbit("dest1", 1).should be == 0
146
+ @client.getbit("dest1", 2).should be == 1
147
+ @client.getbit("dest1", 3).should be == 0
148
+ end
149
+
150
+ it "should apply bitwise xor operation with empty values" do
151
+ @client.setbit("key1", 1, 1)
152
+
153
+ @client.bitop("xor", "dest1", "key1", "nothing_here1", "nothing_here2").should be == 1
154
+ @client.bitcount("dest1").should be == 1
155
+ @client.getbit("dest1", 0).should be == 0
156
+ @client.getbit("dest1", 1).should be == 1
157
+ @client.getbit("dest1", 2).should be == 0
158
+ end
159
+
160
+ it "should apply bitwise xor operation with multiple keys" do
161
+ @client.setbit("key1", 1, 1)
162
+ @client.setbit("key1", 3, 1)
163
+ @client.setbit("key1", 5, 1)
164
+ @client.setbit("key1", 6, 1)
165
+
166
+ @client.setbit("key2", 2, 1)
167
+ @client.setbit("key2", 3, 1)
168
+ @client.setbit("key2", 4, 1)
169
+ @client.setbit("key2", 6, 1)
170
+
171
+ @client.bitop("xor", "dest1", "key1", "key2").should be == 1
172
+ @client.bitcount("dest1").should be == 4
173
+ @client.getbit("dest1", 1).should be == 1
174
+ @client.getbit("dest1", 2).should be == 1
175
+ @client.getbit("dest1", 3).should be == 0
176
+ @client.getbit("dest1", 4).should be == 1
177
+ @client.getbit("dest1", 5).should be == 1
178
+ @client.getbit("dest1", 6).should be == 0
179
+ end
180
+ end
181
+
182
+ describe "not" do
183
+ it 'raises an argument error when not passed any keys' do
184
+ lambda { @client.bitop("not", "destkey") }.should raise_error(Redis::CommandError)
185
+ end
186
+
187
+ it 'raises an argument error when not passed too many keys' do
188
+ lambda { @client.bitop("not", "destkey", "key1", "key2") }.should raise_error(Redis::CommandError)
189
+ end
190
+
191
+ it "should apply bitwise negation operation" do
192
+ @client.setbit("key1", 1, 1)
193
+ @client.setbit("key1", 3, 1)
194
+ @client.setbit("key1", 5, 1)
195
+
196
+ @client.bitop("not", "dest1", "key1").should be == 1
197
+ @client.bitcount("dest1").should be == 5
198
+ @client.getbit("dest1", 0).should be == 1
199
+ @client.getbit("dest1", 1).should be == 0
200
+ @client.getbit("dest1", 2).should be == 1
201
+ @client.getbit("dest1", 3).should be == 0
202
+ @client.getbit("dest1", 4).should be == 1
203
+ @client.getbit("dest1", 5).should be == 0
204
+ @client.getbit("dest1", 6).should be == 1
205
+ @client.getbit("dest1", 7).should be == 1
206
+ end
207
+ end
208
+ end
209
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module FakeRedis
4
4
  describe "Compatibility" do
5
5
  it "should be accessible through FakeRedis::Redis" do
6
- lambda { FakeRedis::Redis.new }.should_not raise_error
6
+ expect { FakeRedis::Redis.new }.not_to raise_error
7
7
  end
8
8
  end
9
9
  end
@@ -9,7 +9,7 @@ module FakeRedis
9
9
 
10
10
  if fakeredis?
11
11
  it "should authenticate to the server" do
12
- @client.auth("pass").should be == "OK"
12
+ expect(@client.auth("pass")).to eq("OK")
13
13
  end
14
14
 
15
15
  it "should re-use the same instance with the same host & port" do
@@ -18,40 +18,40 @@ module FakeRedis
18
18
  @client3 = Redis.new(:host => "localhost", :port => 5678)
19
19
 
20
20
  @client1.set("key1", "1")
21
- @client2.get("key1").should be == "1"
22
- @client3.get("key1").should be_nil
21
+ expect(@client2.get("key1")).to eq("1")
22
+ expect(@client3.get("key1")).to be_nil
23
23
 
24
24
  @client2.set("key2", "2")
25
- @client1.get("key2").should be == "2"
26
- @client3.get("key2").should be_nil
25
+ expect(@client1.get("key2")).to eq("2")
26
+ expect(@client3.get("key2")).to be_nil
27
27
 
28
28
  @client3.set("key3", "3")
29
- @client1.get("key3").should be_nil
30
- @client2.get("key3").should be_nil
29
+ expect(@client1.get("key3")).to be_nil
30
+ expect(@client2.get("key3")).to be_nil
31
31
 
32
- @client1.dbsize.should be == 2
33
- @client2.dbsize.should be == 2
34
- @client3.dbsize.should be == 1
32
+ expect(@client1.dbsize).to eq(2)
33
+ expect(@client2.dbsize).to eq(2)
34
+ expect(@client3.dbsize).to eq(1)
35
35
  end
36
36
 
37
37
  it "should connect to a specific database" do
38
38
  @client1 = Redis.new(:host => "localhost", :port => 1234, :db => 0)
39
39
  @client1.set("key1", "1")
40
40
  @client1.select(0)
41
- @client1.get("key1").should be == "1"
41
+ expect(@client1.get("key1")).to eq("1")
42
42
 
43
43
  @client2 = Redis.new(:host => "localhost", :port => 1234, :db => 1)
44
44
  @client2.set("key1", "1")
45
45
  @client2.select(1)
46
- @client2.get("key1").should == "1"
46
+ expect(@client2.get("key1")).to eq("1")
47
47
  end
48
48
 
49
49
  it "should not error with shutdown" do
50
- lambda { @client.shutdown }.should_not raise_error
50
+ expect { @client.shutdown }.not_to raise_error
51
51
  end
52
52
 
53
53
  it "should not error with quit" do
54
- lambda { @client.quit }.should_not raise_error
54
+ expect { @client.quit }.not_to raise_error
55
55
  end
56
56
  end
57
57
 
@@ -60,26 +60,26 @@ module FakeRedis
60
60
  @client2 = Redis.new(:host => "localhost", :port => 6379, :db => 2)
61
61
 
62
62
  @client1.set("key1", "one")
63
- @client1.get("key1").should be == "one"
63
+ expect(@client1.get("key1")).to eq("one")
64
64
 
65
65
  @client2.set("key2", "two")
66
- @client2.get("key2").should be == "two"
66
+ expect(@client2.get("key2")).to eq("two")
67
67
 
68
- @client1.get("key1").should be == "one"
68
+ expect(@client1.get("key1")).to eq("one")
69
69
  end
70
70
 
71
71
  it "should not error with a disconnected client" do
72
72
  @client1 = Redis.new
73
73
  @client1.client.disconnect
74
- @client1.get("key1").should be_nil
74
+ expect(@client1.get("key1")).to be_nil
75
75
  end
76
76
 
77
77
  it "should echo the given string" do
78
- @client.echo("something").should == "something"
78
+ expect(@client.echo("something")).to eq("something")
79
79
  end
80
80
 
81
81
  it "should ping the server" do
82
- @client.ping.should == "PONG"
82
+ expect(@client.ping).to eq("PONG")
83
83
  end
84
84
  end
85
85
  end
@@ -9,168 +9,179 @@ module FakeRedis
9
9
  it "should delete a hash field" do
10
10
  @client.hset("key1", "k1", "val1")
11
11
  @client.hset("key1", "k2", "val2")
12
- @client.hdel("key1", "k1").should be(1)
12
+ expect(@client.hdel("key1", "k1")).to be(1)
13
13
 
14
- @client.hget("key1", "k1").should be_nil
15
- @client.hget("key1", "k2").should be == "val2"
14
+ expect(@client.hget("key1", "k1")).to be_nil
15
+ expect(@client.hget("key1", "k2")).to eq("val2")
16
+ end
17
+
18
+ it "should delete array of fields" do
19
+ @client.hset("key1", "k1", "val1")
20
+ @client.hset("key1", "k2", "val2")
21
+ @client.hset("key1", "k3", "val3")
22
+ expect(@client.hdel("key1", ["k1", "k2"])).to be(2)
23
+
24
+ expect(@client.hget("key1", "k1")).to be_nil
25
+ expect(@client.hget("key1", "k2")).to be_nil
26
+ expect(@client.hget("key1", "k3")).to eq("val3")
16
27
  end
17
28
 
18
29
  it "should remove a hash with no keys left" do
19
30
  @client.hset("key1", "k1", "val1")
20
31
  @client.hset("key1", "k2", "val2")
21
- @client.hdel("key1", "k1").should be(1)
22
- @client.hdel("key1", "k2").should be(1)
32
+ expect(@client.hdel("key1", "k1")).to be(1)
33
+ expect(@client.hdel("key1", "k2")).to be(1)
23
34
 
24
- @client.exists("key1").should be == false
35
+ expect(@client.exists("key1")).to eq(false)
25
36
  end
26
37
 
27
38
  it "should convert key to a string for hset" do
28
39
  m = double("key")
29
- m.stub(:to_s).and_return("foo")
40
+ allow(m).to receive(:to_s).and_return("foo")
30
41
 
31
42
  @client.hset("key1", m, "bar")
32
- @client.hget("key1", "foo").should be == "bar"
43
+ expect(@client.hget("key1", "foo")).to eq("bar")
33
44
  end
34
45
 
35
46
  it "should convert key to a string for hget" do
36
47
  m = double("key")
37
- m.stub(:to_s).and_return("foo")
48
+ allow(m).to receive(:to_s).and_return("foo")
38
49
 
39
50
  @client.hset("key1", "foo", "bar")
40
- @client.hget("key1", m).should be == "bar"
51
+ expect(@client.hget("key1", m)).to eq("bar")
41
52
  end
42
53
 
43
54
  it "should determine if a hash field exists" do
44
55
  @client.hset("key1", "index", "value")
45
56
 
46
- @client.hexists("key1", "index").should be true
47
- @client.hexists("key2", "i2").should be false
57
+ expect(@client.hexists("key1", "index")).to be true
58
+ expect(@client.hexists("key2", "i2")).to be false
48
59
  end
49
60
 
50
61
  it "should get the value of a hash field" do
51
62
  @client.hset("key1", "index", "value")
52
63
 
53
- @client.hget("key1", "index").should be == "value"
64
+ expect(@client.hget("key1", "index")).to eq("value")
54
65
  end
55
66
 
56
67
  it "should get all the fields and values in a hash" do
57
68
  @client.hset("key1", "i1", "val1")
58
69
  @client.hset("key1", "i2", "val2")
59
70
 
60
- @client.hgetall("key1").should be == {"i1" => "val1", "i2" => "val2"}
71
+ expect(@client.hgetall("key1")).to eq({"i1" => "val1", "i2" => "val2"})
61
72
  end
62
73
 
63
74
  it "should increment the integer value of a hash field by the given number" do
64
75
  @client.hset("key1", "cont1", "5")
65
- @client.hincrby("key1", "cont1", "5").should be == 10
66
- @client.hget("key1", "cont1").should be == "10"
76
+ expect(@client.hincrby("key1", "cont1", "5")).to eq(10)
77
+ expect(@client.hget("key1", "cont1")).to eq("10")
67
78
  end
68
79
 
69
80
  it "should increment non existing hash keys" do
70
- @client.hget("key1", "cont2").should be_nil
71
- @client.hincrby("key1", "cont2", "5").should be == 5
81
+ expect(@client.hget("key1", "cont2")).to be_nil
82
+ expect(@client.hincrby("key1", "cont2", "5")).to eq(5)
72
83
  end
73
84
 
74
85
  it "should increment the float value of a hash field by the given float" do
75
86
  @client.hset("key1", "cont1", 5.0)
76
- @client.hincrbyfloat("key1", "cont1", 4.1).should be == 9.1
77
- @client.hget("key1", "cont1").should be == "9.1"
87
+ expect(@client.hincrbyfloat("key1", "cont1", 4.1)).to eq(9.1)
88
+ expect(@client.hget("key1", "cont1")).to eq("9.1")
78
89
  end
79
90
 
80
91
  it "should increment non existing hash keys" do
81
- @client.hget("key1", "cont2").should be_nil
82
- @client.hincrbyfloat("key1", "cont2", 5.5).should be == 5.5
92
+ expect(@client.hget("key1", "cont2")).to be_nil
93
+ expect(@client.hincrbyfloat("key1", "cont2", 5.5)).to eq(5.5)
83
94
  end
84
95
 
85
96
  it "should get all the fields in a hash" do
86
97
  @client.hset("key1", "i1", "val1")
87
98
  @client.hset("key1", "i2", "val2")
88
99
 
89
- @client.hkeys("key1").should =~ ["i1", "i2"]
90
- @client.hkeys("key2").should be == []
100
+ expect(@client.hkeys("key1")).to match_array(["i1", "i2"])
101
+ expect(@client.hkeys("key2")).to eq([])
91
102
  end
92
103
 
93
104
  it "should get the number of fields in a hash" do
94
105
  @client.hset("key1", "i1", "val1")
95
106
  @client.hset("key1", "i2", "val2")
96
107
 
97
- @client.hlen("key1").should be == 2
108
+ expect(@client.hlen("key1")).to eq(2)
98
109
  end
99
110
 
100
111
  it "should get the values of all the given hash fields" do
101
112
  @client.hset("key1", "i1", "val1")
102
113
  @client.hset("key1", "i2", "val2")
103
114
 
104
- @client.hmget("key1", "i1", "i2", "i3").should =~ ["val1", "val2", nil]
105
- @client.hmget("key1", ["i1", "i2", "i3"]).should =~ ["val1", "val2", nil]
115
+ expect(@client.hmget("key1", "i1", "i2", "i3")).to match_array(["val1", "val2", nil])
116
+ expect(@client.hmget("key1", ["i1", "i2", "i3"])).to match_array(["val1", "val2", nil])
106
117
 
107
- @client.hmget("key2", "i1", "i2").should be == [nil, nil]
118
+ expect(@client.hmget("key2", "i1", "i2")).to eq([nil, nil])
108
119
  end
109
120
 
110
121
  it "should throw an argument error when you don't ask for any keys" do
111
- lambda { @client.hmget("key1") }.should raise_error(Redis::CommandError)
122
+ expect { @client.hmget("key1") }.to raise_error(Redis::CommandError)
112
123
  end
113
124
 
114
125
  it "should reject an empty list of values" do
115
- lambda { @client.hmset("key") }.should raise_error(Redis::CommandError)
116
- @client.exists("key").should be false
126
+ expect { @client.hmset("key") }.to raise_error(Redis::CommandError)
127
+ expect(@client.exists("key")).to be false
117
128
  end
118
129
 
119
130
  it "rejects an insert with a key but no value" do
120
- lambda { @client.hmset("key", 'foo') }.should raise_error(Redis::CommandError)
121
- lambda { @client.hmset("key", 'foo', 3, 'bar') }.should raise_error(Redis::CommandError)
122
- @client.exists("key").should be false
131
+ expect { @client.hmset("key", 'foo') }.to raise_error(Redis::CommandError)
132
+ expect { @client.hmset("key", 'foo', 3, 'bar') }.to raise_error(Redis::CommandError)
133
+ expect(@client.exists("key")).to be false
123
134
  end
124
135
 
125
136
  it "should reject the wrong number of arguments" do
126
- lambda { @client.hmset("hash", "foo1", "bar1", "foo2", "bar2", "foo3") }.should raise_error(Redis::CommandError, "ERR wrong number of arguments for HMSET")
137
+ expect { @client.hmset("hash", "foo1", "bar1", "foo2", "bar2", "foo3") }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for HMSET")
127
138
  end
128
139
 
129
140
  it "should set multiple hash fields to multiple values" do
130
141
  @client.hmset("key", "k1", "value1", "k2", "value2")
131
142
 
132
- @client.hget("key", "k1").should be == "value1"
133
- @client.hget("key", "k2").should be == "value2"
143
+ expect(@client.hget("key", "k1")).to eq("value1")
144
+ expect(@client.hget("key", "k2")).to eq("value2")
134
145
  end
135
146
 
136
147
  it "should set multiple hash fields from a ruby hash to multiple values" do
137
148
  @client.mapped_hmset("foo", :k1 => "value1", :k2 => "value2")
138
149
 
139
- @client.hget("foo", "k1").should be == "value1"
140
- @client.hget("foo", "k2").should be == "value2"
150
+ expect(@client.hget("foo", "k1")).to eq("value1")
151
+ expect(@client.hget("foo", "k2")).to eq("value2")
141
152
  end
142
153
 
143
154
  it "should set the string value of a hash field" do
144
- @client.hset("key1", "k1", "val1").should be == true
145
- @client.hset("key1", "k1", "val1").should be == false
155
+ expect(@client.hset("key1", "k1", "val1")).to eq(true)
156
+ expect(@client.hset("key1", "k1", "val1")).to eq(false)
146
157
 
147
- @client.hget("key1", "k1").should be == "val1"
158
+ expect(@client.hget("key1", "k1")).to eq("val1")
148
159
  end
149
160
 
150
161
  it "should set the value of a hash field, only if the field does not exist" do
151
162
  @client.hset("key1", "k1", "val1")
152
- @client.hsetnx("key1", "k1", "value").should be == false
153
- @client.hsetnx("key1", "k2", "val2").should be == true
154
- @client.hsetnx("key1", :k1, "value").should be == false
155
- @client.hsetnx("key1", :k3, "val3").should be == true
156
-
157
- @client.hget("key1", "k1").should be == "val1"
158
- @client.hget("key1", "k2").should be == "val2"
159
- @client.hget("key1", "k3").should be == "val3"
163
+ expect(@client.hsetnx("key1", "k1", "value")).to eq(false)
164
+ expect(@client.hsetnx("key1", "k2", "val2")).to eq(true)
165
+ expect(@client.hsetnx("key1", :k1, "value")).to eq(false)
166
+ expect(@client.hsetnx("key1", :k3, "val3")).to eq(true)
167
+
168
+ expect(@client.hget("key1", "k1")).to eq("val1")
169
+ expect(@client.hget("key1", "k2")).to eq("val2")
170
+ expect(@client.hget("key1", "k3")).to eq("val3")
160
171
  end
161
172
 
162
173
  it "should get all the values in a hash" do
163
174
  @client.hset("key1", "k1", "val1")
164
175
  @client.hset("key1", "k2", "val2")
165
176
 
166
- @client.hvals("key1").should =~ ["val1", "val2"]
177
+ expect(@client.hvals("key1")).to match_array(["val1", "val2"])
167
178
  end
168
179
 
169
180
  it "should accept a list of array pairs as arguments and not throw an invalid argument number error" do
170
181
  @client.hmset("key1", [:k1, "val1"], [:k2, "val2"], [:k3, "val3"])
171
- @client.hget("key1", :k1).should be == "val1"
172
- @client.hget("key1", :k2).should be == "val2"
173
- @client.hget("key1", :k3).should be == "val3"
182
+ expect(@client.hget("key1", :k1)).to eq("val1")
183
+ expect(@client.hget("key1", :k2)).to eq("val2")
184
+ expect(@client.hget("key1", :k3)).to eq("val3")
174
185
  end
175
186
 
176
187
  it "should reject a list of arrays that contain an invalid number of arguments" do
@@ -179,17 +190,72 @@ module FakeRedis
179
190
 
180
191
  it "should convert a integer field name to string for hdel" do
181
192
  @client.hset("key1", "1", 1)
182
- @client.hdel("key1", 1).should be(1)
193
+ expect(@client.hdel("key1", 1)).to be(1)
183
194
  end
184
195
 
185
196
  it "should convert a integer field name to string for hexists" do
186
197
  @client.hset("key1", "1", 1)
187
- @client.hexists("key1", 1).should be true
198
+ expect(@client.hexists("key1", 1)).to be true
188
199
  end
189
200
 
190
201
  it "should convert a integer field name to string for hincrby" do
191
202
  @client.hset("key1", 1, 0)
192
- @client.hincrby("key1", 1, 1).should be(1)
203
+ expect(@client.hincrby("key1", 1, 1)).to be(1)
204
+ end
205
+
206
+ describe "#hscan" do
207
+ it 'with no arguments and few items, returns all items' do
208
+ @client.hmset('hash', 'name', 'Jack', 'age', '33')
209
+ result = @client.hscan('hash', 0)
210
+
211
+ expect(result[0]).to eq('0')
212
+ expect(result[1]).to eq([['name', 'Jack'], ['age', '33']])
213
+ end
214
+
215
+ it 'with a count should return that number of members or more' do
216
+ @client.hmset('hash',
217
+ 'a', '1', 'b', '2', 'c', '3', 'd', '4', 'e', '5', 'f', '6', 'g', '7'
218
+ )
219
+ result = @client.hscan('hash', 0, count: 3)
220
+ expect(result[0]).to eq('3')
221
+ expect(result[1]).to eq([
222
+ ['a', '1'],
223
+ ['b', '2'],
224
+ ['c', '3'],
225
+ ])
226
+ end
227
+
228
+ it 'returns items starting at the provided cursor' do
229
+ @client.hmset('hash',
230
+ 'a', '1', 'b', '2', 'c', '3', 'd', '4', 'e', '5', 'f', '6', 'g', '7'
231
+ )
232
+ result = @client.hscan('hash', 2, count: 3)
233
+ expect(result[0]).to eq('5')
234
+ expect(result[1]).to eq([
235
+ ['c', '3'],
236
+ ['d', '4'],
237
+ ['e', '5']
238
+ ])
239
+ end
240
+
241
+ it 'with match, returns items matching the given pattern' do
242
+ @client.hmset('hash',
243
+ 'aa', '1', 'b', '2', 'cc', '3', 'd', '4', 'ee', '5', 'f', '6', 'gg', '7'
244
+ )
245
+ result = @client.hscan('hash', 2, count: 3, match: '??')
246
+ expect(result[0]).to eq('5')
247
+ expect(result[1]).to eq([
248
+ ['cc', '3'],
249
+ ['ee', '5']
250
+ ])
251
+ end
252
+
253
+ it 'returns an empty result if the key is not found' do
254
+ result = @client.hscan('hash', 0)
255
+
256
+ expect(result[0]).to eq('0')
257
+ expect(result[1]).to eq([])
258
+ end
193
259
  end
194
260
  end
195
261
  end