File: sets_spec.rb

package info (click to toggle)
ruby-fakeredis 0.8.0-7
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 628 kB
  • sloc: ruby: 4,868; makefile: 2
file content (335 lines) | stat: -rw-r--r-- 11,601 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
require 'spec_helper'

module FakeRedis
  describe "SetsMethods" do
    before(:each) do
      @client = Redis.new
    end

    it "should add a member to a set" do
      expect(@client.sadd("key", "value")).to eq(true)
      expect(@client.sadd("key", "value")).to eq(false)

      expect(@client.smembers("key")).to eq(["value"])
    end

    it "should raise error if command arguments count is not enough" do
      expect { @client.sadd("key", []) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'sadd' command")
      expect { @client.sinter(*[]) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'sinter' command")
      expect { @client.sinter([]) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'sinter' command")
      expect { @client.sunion(*[]) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'sunion' command")
      expect { @client.sunion([]) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'sunion' command")
      expect { @client.srem("key", []) }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'srem' command")

      expect(@client.smembers("key")).to be_empty
    end

    it "should add multiple members to a set" do
      expect(@client.sadd("key", %w(value other something more))).to eq(4)
      expect(@client.sadd("key", %w(and additional values))).to eq(3)
      expect(@client.smembers("key")).to match_array(["value", "other", "something", "more", "and", "additional", "values"])
    end

    it "should get the number of members in a set" do
      @client.sadd("key", "val1")
      @client.sadd("key", "val2")

      expect(@client.scard("key")).to eq(2)
    end

    it "should subtract multiple sets" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")
      @client.sadd("key1", "d")
      @client.sadd("key2", "c")
      @client.sadd("key3", "a")
      @client.sadd("key3", "c")
      @client.sadd("key3", "e")

      expect(@client.sdiff("key1", "key2", "key3")).to match_array(["b", "d"])
      expect(@client.sdiff("key1", ["key2", "key3"])).to match_array(["b", "d"])
    end

    it "should subtract from a nonexistent set" do
      @client.sadd("key2", "a")
      @client.sadd("key2", "b")

      expect(@client.sdiff("key1", "key2")).to eq([])
      expect(@client.sdiff(["key1", "key2"])).to eq([])
    end

    it "should subtract multiple sets and store the resulting set in a key" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")
      @client.sadd("key1", "d")
      @client.sadd("key2", "c")
      @client.sadd("key3", "a")
      @client.sadd("key3", "c")
      @client.sadd("key3", "e")
      @client.sdiffstore("key", "key1", "key2", "key3")
      @client.sdiffstore("new_key", "key1", ["key2", "key3"])

      expect(@client.smembers("key")).to match_array(["b", "d"])
      expect(@client.smembers("new_key")).to match_array(["b", "d"])
    end

    it "should intersect multiple sets" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")
      @client.sadd("key1", "d")
      @client.sadd("key2", "c")
      @client.sadd("key3", "a")
      @client.sadd("key3", "c")
      @client.sadd("key3", "e")

      expect(@client.sinter("key1", "key2", "key3")).to eq(["c"])
      expect(@client.sinter(["key1", "key2", "key3"])).to eq(["c"])
    end

    it "should intersect multiple sets and store the resulting set in a key" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")
      @client.sadd("key1", "d")
      @client.sadd("key2", "c")
      @client.sadd("key3", "a")
      @client.sadd("key3", "c")
      @client.sadd("key3", "e")
      @client.sinterstore("key", "key1", "key2", "key3")
      @client.sinterstore("new_key", ["key1", "key2", "key3"])

      expect(@client.smembers("key")).to eq(["c"])
      expect(@client.smembers("new_key")).to eq(["c"])
    end

    it "should determine if a given value is a member of a set" do
      @client.sadd("key1", "a")

      expect(@client.sismember("key1", "a")).to eq(true)
      expect(@client.sismember("key1", "b")).to eq(false)
      expect(@client.sismember("key2", "a")).to eq(false)
    end

    it "should get all the members in a set" do
      @client.sadd("key", "a")
      @client.sadd("key", "b")
      @client.sadd("key", "c")
      @client.sadd("key", "d")

      expect(@client.smembers("key")).to match_array(["a", "b", "c", "d"])
    end

    it "should move a member from one set to another" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key2", "c")
      expect(@client.smove("key1", "key2", "a")).to eq(true)
      expect(@client.smove("key1", "key2", "a")).to eq(false)

      expect(@client.smembers("key1")).to eq(["b"])
      expect(@client.smembers("key2")).to match_array(["c", "a"])
    end

    it "should remove and return a random member from a set" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")

      expect(["a", "b"].include?(@client.spop("key1"))).to be true
      expect(["a", "b"].include?(@client.spop("key1"))).to be true
      expect(@client.spop("key1")).to be_nil
    end

    it "should get a random member from a set" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")

      expect(["a", "b"].include?(@client.spop("key1"))).to be true
    end

    it "should pop multiple members from a set" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")

      vals = @client.spop("key1", 2)
      expect(vals.count).to eq(2)
      vals.each { |v| expect(["a", "b", "c"].include?(v)).to be true }

      new_vals = @client.spop("key1", 2)
      expect(new_vals.count).to eq(1)
      expect(["a", "b", "c"].include?(new_vals.first)).to be true

      expect(["a", "b", "c"]).to eq((vals + new_vals).sort)
    end

    it "should remove a member from a set" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      expect(@client.srem("key1", "a")).to eq(true)
      expect(@client.srem("key1", "a")).to eq(false)

      expect(@client.smembers("key1")).to eq(["b"])
    end

    it "should remove multiple members from a set" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")

      expect(@client.srem("key1", [ "a", "b"])).to eq(2)
      expect(@client.smembers("key1")).to be_empty
    end

    it "should remove the set's key once it's empty" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.srem("key1", "b")
      @client.srem("key1", "a")

      expect(@client.exists("key1")).to eq(0)
    end

    it "should add multiple sets" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")
      @client.sadd("key1", "d")
      @client.sadd("key2", "c")
      @client.sadd("key3", "a")
      @client.sadd("key3", "c")
      @client.sadd("key3", "e")

      expect(@client.sunion("key1", "key2", "key3")).to match_array(["a", "b", "c", "d", "e"])
    end

    it "should add multiple sets and store the resulting set in a key" do
      @client.sadd("key1", "a")
      @client.sadd("key1", "b")
      @client.sadd("key1", "c")
      @client.sadd("key1", "d")
      @client.sadd("key2", "c")
      @client.sadd("key3", "a")
      @client.sadd("key3", "c")
      @client.sadd("key3", "e")
      @client.sunionstore("key", "key1", "key2", "key3")

      expect(@client.smembers("key")).to match_array(["a", "b", "c", "d", "e"])
    end
  end

  describe 'srandmember' do
    before(:each) do
      @client = Redis.new
    end

    context 'with a set that has three elements' do
      before do
        @client.sadd("key1", "a")
        @client.sadd("key1", "b")
        @client.sadd("key1", "c")
      end

      context 'when called without the optional number parameter' do
        it 'is a random element from the set' do
          random_element = @client.srandmember("key1")

          expect(['a', 'b', 'c'].include?(random_element)).to be true
        end
      end

      context 'when called with the optional number parameter of 1' do
        it 'is an array of one random element from the set' do
          random_elements = @client.srandmember("key1", 1)

          expect([['a'], ['b'], ['c']].include?(random_elements)).to be true
        end
      end

      context 'when called with the optional number parameter of 2' do
        it 'is an array of two unique, random elements from the set' do
          random_elements = @client.srandmember("key1", 2)

          expect(random_elements.count).to eq(2)
          expect(random_elements.uniq.count).to eq(2)
          random_elements.all? do |element|
            expect(['a', 'b', 'c'].include?(element)).to be true
          end
        end
      end

      context 'when called with an optional parameter of -100' do
        it 'is an array of 100 random elements from the set, some of which are repeated' do
          random_elements = @client.srandmember("key1", -100)

          expect(random_elements.count).to eq(100)
          expect(random_elements.uniq.count).to be <= 3
          random_elements.all? do |element|
            expect(['a', 'b', 'c'].include?(element)).to be true
          end
        end
      end

      context 'when called with an optional parameter of 100' do
        it 'is an array of all of the elements from the set, none of which are repeated' do
          random_elements = @client.srandmember("key1", 100)

          expect(random_elements.count).to eq(3)
          expect(random_elements.uniq.count).to eq(3)
          expect(random_elements).to match_array(['a', 'b', 'c'])
        end
      end
    end

    context 'with an empty set' do
      before { @client.del("key1") }

      it 'is nil without the extra parameter' do
        expect(@client.srandmember("key1")).to be_nil
      end

      it 'is an empty array with an extra parameter' do
        expect(@client.srandmember("key1", 1)).to eq([])
      end
    end

    describe "#sscan" do
      it 'with no arguments and few items, returns all items' do
        @client.sadd('set', ['name', 'Jack', 'age', '33'])
        result = @client.sscan('set', 0)

        expect(result[0]).to eq('0')
        expect(result[1]).to eq(['name', 'Jack', 'age', '33'])
      end

      it 'with a count should return that number of members or more' do
        @client.sadd('set', ['a', '1', 'b', '2', 'c', '3', 'd', '4', 'e', '5', 'f', '6', 'g', '7'])
        result = @client.sscan('set', 0, count: 3)
        expect(result[0]).to eq('3')
        expect(result[1]).to eq([ 'a', '1', 'b'])
      end

      it 'returns items starting at the provided cursor' do
        @client.sadd('set', ['a', '1', 'b', '2', 'c', '3', 'd', '4', 'e', '5', 'f', '6', 'g', '7'])
        result = @client.sscan('set', 2, count: 3)
        expect(result[0]).to eq('5')
        expect(result[1]).to eq(['b', '2', 'c'])
      end

      it 'with match, returns items matching the given pattern' do
        @client.sadd('set', ['aa', '1', 'b', '2', 'cc', '3', 'd', '4', 'ee', '5', 'f', '6', 'gg', '7'])
        result = @client.sscan('set', 2, count: 7, match: '??')
        expect(result[0]).to eq('9')
        expect(result[1]).to eq(['cc','ee'])
      end

      it 'returns an empty result if the key is not found' do
        result = @client.sscan('set', 0)

        expect(result[0]).to eq('0')
        expect(result[1]).to eq([])
      end
    end
  end
end