mock_redis 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE +19 -0
  5. data/README.md +88 -0
  6. data/Rakefile +10 -0
  7. data/lib/mock_redis/assertions.rb +13 -0
  8. data/lib/mock_redis/database.rb +432 -0
  9. data/lib/mock_redis/exceptions.rb +3 -0
  10. data/lib/mock_redis/expire_wrapper.rb +25 -0
  11. data/lib/mock_redis/hash_methods.rb +102 -0
  12. data/lib/mock_redis/list_methods.rb +187 -0
  13. data/lib/mock_redis/multi_db_wrapper.rb +48 -0
  14. data/lib/mock_redis/set_methods.rb +125 -0
  15. data/lib/mock_redis/string_methods.rb +195 -0
  16. data/lib/mock_redis/transaction_wrapper.rb +75 -0
  17. data/lib/mock_redis/undef_redis_methods.rb +11 -0
  18. data/lib/mock_redis/utility_methods.rb +22 -0
  19. data/lib/mock_redis/version.rb +3 -0
  20. data/lib/mock_redis/zset.rb +80 -0
  21. data/lib/mock_redis/zset_methods.rb +210 -0
  22. data/lib/mock_redis.rb +32 -0
  23. data/mock_redis.gemspec +24 -0
  24. data/spec/cloning_spec.rb +96 -0
  25. data/spec/commands/append_spec.rb +24 -0
  26. data/spec/commands/auth_spec.rb +7 -0
  27. data/spec/commands/bgrewriteaof_spec.rb +7 -0
  28. data/spec/commands/bgsave_spec.rb +7 -0
  29. data/spec/commands/blpop_spec.rb +55 -0
  30. data/spec/commands/brpop_spec.rb +54 -0
  31. data/spec/commands/brpoplpush_spec.rb +53 -0
  32. data/spec/commands/dbsize_spec.rb +18 -0
  33. data/spec/commands/decr_spec.rb +34 -0
  34. data/spec/commands/decrby_spec.rb +34 -0
  35. data/spec/commands/del_spec.rb +20 -0
  36. data/spec/commands/echo_spec.rb +11 -0
  37. data/spec/commands/exists_spec.rb +14 -0
  38. data/spec/commands/expire_spec.rb +83 -0
  39. data/spec/commands/expireat_spec.rb +48 -0
  40. data/spec/commands/flushall_spec.rb +38 -0
  41. data/spec/commands/flushdb_spec.rb +38 -0
  42. data/spec/commands/get_spec.rb +23 -0
  43. data/spec/commands/getbit_spec.rb +34 -0
  44. data/spec/commands/getrange_spec.rb +22 -0
  45. data/spec/commands/getset_spec.rb +23 -0
  46. data/spec/commands/hdel_spec.rb +35 -0
  47. data/spec/commands/hexists_spec.rb +22 -0
  48. data/spec/commands/hget_spec.rb +23 -0
  49. data/spec/commands/hgetall_spec.rb +22 -0
  50. data/spec/commands/hincrby_spec.rb +52 -0
  51. data/spec/commands/hkeys_spec.rb +19 -0
  52. data/spec/commands/hlen_spec.rb +19 -0
  53. data/spec/commands/hmget_spec.rb +30 -0
  54. data/spec/commands/hmset_spec.rb +43 -0
  55. data/spec/commands/hset_spec.rb +23 -0
  56. data/spec/commands/hsetnx_spec.rb +39 -0
  57. data/spec/commands/hvals_spec.rb +19 -0
  58. data/spec/commands/incr_spec.rb +34 -0
  59. data/spec/commands/incrby_spec.rb +44 -0
  60. data/spec/commands/info_spec.rb +13 -0
  61. data/spec/commands/keys_spec.rb +87 -0
  62. data/spec/commands/lastsave_spec.rb +8 -0
  63. data/spec/commands/lindex_spec.rb +39 -0
  64. data/spec/commands/linsert_spec.rb +68 -0
  65. data/spec/commands/llen_spec.rb +16 -0
  66. data/spec/commands/lpop_spec.rb +34 -0
  67. data/spec/commands/lpush_spec.rb +30 -0
  68. data/spec/commands/lpushx_spec.rb +33 -0
  69. data/spec/commands/lrange_spec.rb +35 -0
  70. data/spec/commands/lrem_spec.rb +79 -0
  71. data/spec/commands/lset_spec.rb +38 -0
  72. data/spec/commands/ltrim_spec.rb +35 -0
  73. data/spec/commands/mget_spec.rb +34 -0
  74. data/spec/commands/mset_spec.rb +29 -0
  75. data/spec/commands/msetnx_spec.rb +40 -0
  76. data/spec/commands/persist_spec.rb +49 -0
  77. data/spec/commands/ping_spec.rb +7 -0
  78. data/spec/commands/quit_spec.rb +7 -0
  79. data/spec/commands/randomkey_spec.rb +20 -0
  80. data/spec/commands/rename_spec.rb +31 -0
  81. data/spec/commands/renamenx_spec.rb +36 -0
  82. data/spec/commands/rpop_spec.rb +34 -0
  83. data/spec/commands/rpoplpush_spec.rb +45 -0
  84. data/spec/commands/rpush_spec.rb +30 -0
  85. data/spec/commands/rpushx_spec.rb +33 -0
  86. data/spec/commands/sadd_spec.rb +22 -0
  87. data/spec/commands/save_spec.rb +7 -0
  88. data/spec/commands/scard_spec.rb +18 -0
  89. data/spec/commands/sdiff_spec.rb +47 -0
  90. data/spec/commands/sdiffstore_spec.rb +51 -0
  91. data/spec/commands/select_spec.rb +53 -0
  92. data/spec/commands/set_spec.rb +7 -0
  93. data/spec/commands/setbit_spec.rb +46 -0
  94. data/spec/commands/setex_spec.rb +22 -0
  95. data/spec/commands/setnx_spec.rb +25 -0
  96. data/spec/commands/setrange_spec.rb +30 -0
  97. data/spec/commands/sinter_spec.rb +41 -0
  98. data/spec/commands/sinterstore_spec.rb +46 -0
  99. data/spec/commands/sismember_spec.rb +29 -0
  100. data/spec/commands/smembers_spec.rb +18 -0
  101. data/spec/commands/smove_spec.rb +41 -0
  102. data/spec/commands/spop_spec.rb +25 -0
  103. data/spec/commands/srandmember_spec.rb +25 -0
  104. data/spec/commands/srem_spec.rb +35 -0
  105. data/spec/commands/strlen_spec.rb +19 -0
  106. data/spec/commands/sunion_spec.rb +40 -0
  107. data/spec/commands/sunionstore_spec.rb +46 -0
  108. data/spec/commands/ttl_spec.rb +36 -0
  109. data/spec/commands/type_spec.rb +36 -0
  110. data/spec/commands/unwatch_spec.rb +7 -0
  111. data/spec/commands/watch_spec.rb +7 -0
  112. data/spec/commands/zadd_spec.rb +29 -0
  113. data/spec/commands/zcard_spec.rb +19 -0
  114. data/spec/commands/zcount_spec.rb +23 -0
  115. data/spec/commands/zincrby_spec.rb +24 -0
  116. data/spec/commands/zinterstore_spec.rb +88 -0
  117. data/spec/commands/zrange_spec.rb +31 -0
  118. data/spec/commands/zrangebyscore_spec.rb +42 -0
  119. data/spec/commands/zrank_spec.rb +23 -0
  120. data/spec/commands/zrem_spec.rb +25 -0
  121. data/spec/commands/zremrangebyrank_spec.rb +22 -0
  122. data/spec/commands/zremrangebyscore_spec.rb +21 -0
  123. data/spec/commands/zrevrange_spec.rb +31 -0
  124. data/spec/commands/zrevrangebyscore_spec.rb +42 -0
  125. data/spec/commands/zrevrank_spec.rb +23 -0
  126. data/spec/commands/zscore_spec.rb +16 -0
  127. data/spec/commands/zunionstore_spec.rb +96 -0
  128. data/spec/spec_helper.rb +44 -0
  129. data/spec/support/redis_multiplexer.rb +91 -0
  130. data/spec/support/shared_examples/only_operates_on_hashes.rb +13 -0
  131. data/spec/support/shared_examples/only_operates_on_lists.rb +13 -0
  132. data/spec/support/shared_examples/only_operates_on_sets.rb +13 -0
  133. data/spec/support/shared_examples/only_operates_on_strings.rb +13 -0
  134. data/spec/support/shared_examples/only_operates_on_zsets.rb +57 -0
  135. data/spec/transactions_spec.rb +73 -0
  136. metadata +358 -0
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sdiff(key [, key, ...])' do
4
+ before do
5
+ @numbers = 'mock-redis-test:sdiff:numbers'
6
+ @evens = 'mock-redis-test:sdiff:odds'
7
+ @primes = 'mock-redis-test:sdiff:primes'
8
+
9
+ (1..10).each {|i| @redises.sadd(@numbers, i) }
10
+ [2, 4, 6, 8, 10].each {|i| @redises.sadd(@evens, i) }
11
+ [2, 3, 5, 7].each {|i| @redises.sadd(@primes, i) }
12
+ end
13
+
14
+ it "returns the first set minus the second set" do
15
+ @redises.sdiff(@numbers, @evens).should == %w[1 3 5 7 9]
16
+ end
17
+
18
+ it "returns the first set minus all the other sets" do
19
+ @redises.sdiff(@numbers, @evens, @primes).should == %w[1 9]
20
+ end
21
+
22
+ it "treats missing keys as empty sets" do
23
+ @redises.sdiff(@evens, 'mock-redis-test:nonesuch').should == %w[10 2 4 6 8]
24
+ end
25
+
26
+ it "returns the first set when called with a single argument" do
27
+ @redises.sdiff(@primes).should == %w[2 3 5 7]
28
+ end
29
+
30
+ it "raises an error if given 0 arguments" do
31
+ lambda do
32
+ @redises.sdiff()
33
+ end.should raise_error(RuntimeError)
34
+ end
35
+
36
+ it "raises an error if any argument is not a a set" do
37
+ @redises.set('foo', 1)
38
+
39
+ lambda do
40
+ @redises.sdiff(@numbers, 'foo')
41
+ end.should raise_error(RuntimeError)
42
+
43
+ lambda do
44
+ @redises.sdiff('foo', @numbers)
45
+ end.should raise_error(RuntimeError)
46
+ end
47
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sdiffstore(destination, key [, key, ...])' do
4
+ before do
5
+ @numbers = 'mock-redis-test:sdiffstore:numbers'
6
+ @evens = 'mock-redis-test:sdiffstore:odds'
7
+ @primes = 'mock-redis-test:sdiffstore:primes'
8
+ @destination = 'mock-redis-test:sdiffstore:destination'
9
+
10
+ (1..10).each {|i| @redises.sadd(@numbers, i) }
11
+ [2, 4, 6, 8, 10].each {|i| @redises.sadd(@evens, i) }
12
+ [2, 3, 5, 7].each {|i| @redises.sadd(@primes, i) }
13
+ end
14
+
15
+ it "returns the number of elements in the resulting set" do
16
+ @redises.sdiffstore(@destination, @numbers, @evens).should == 5
17
+ end
18
+
19
+ it "stores the resulting set" do
20
+ @redises.sdiffstore(@destination, @numbers, @evens)
21
+ @redises.smembers(@destination).should == %w[1 3 5 7 9]
22
+ end
23
+
24
+ it "does not store empty sets" do
25
+ @redises.sdiffstore(@destination, @numbers, @numbers).should == 0
26
+ @redises.get(@destination).should be_nil
27
+ end
28
+
29
+ it "treats missing keys as empty sets" do
30
+ @redises.sdiffstore(@destination, @evens, 'mock-redis-test:nonesuch')
31
+ @redises.smembers(@destination).should == %w[10 2 4 6 8]
32
+ end
33
+
34
+ it "raises an error if given 0 sets" do
35
+ lambda do
36
+ @redises.sdiffstore(@destination)
37
+ end.should raise_error(RuntimeError)
38
+ end
39
+
40
+ it "raises an error if any argument is not a a set" do
41
+ @redises.set('mock-redis-test:notset', 1)
42
+
43
+ lambda do
44
+ @redises.sdiffstore(@destination, @numbers, 'mock-redis-test:notset')
45
+ end.should raise_error(RuntimeError)
46
+
47
+ lambda do
48
+ @redises.sdiffstore(@destination, 'mock-redis-test:notset', @numbers)
49
+ end.should raise_error(RuntimeError)
50
+ end
51
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#select(db)" do
4
+ before { @key = 'mock-redis-test:select' }
5
+
6
+ it "returns 'OK'" do
7
+ @redises.select(0).should == 'OK'
8
+ end
9
+
10
+ it "treats '0' and 0 the same" do
11
+ @redises.select('0')
12
+ @redises.set(@key, 'foo')
13
+ @redises.select(0)
14
+ @redises.get(@key).should == 'foo'
15
+ end
16
+
17
+ it "switches databases" do
18
+ @redises.select(0)
19
+ @redises.set(@key, 'foo')
20
+
21
+ @redises.select(1)
22
+ @redises.get(@key).should be_nil
23
+
24
+ @redises.select(0)
25
+ @redises.get(@key).should == 'foo'
26
+ end
27
+
28
+ context "[mock only]" do
29
+ # Time dependence introduces a bit of nondeterminism here
30
+ before do
31
+ @now = Time.now
32
+ Time.stub!(:now).and_return(@now)
33
+
34
+ @mock = @redises.mock
35
+
36
+ @mock.select(0)
37
+ @mock.set(@key, 1)
38
+ @mock.expire(@key, 101)
39
+
40
+ @mock.select(1)
41
+ @mock.set(@key, 2)
42
+ @mock.expire(@key, 201)
43
+ end
44
+
45
+ it "keeps expire times per-db" do
46
+ @mock.select(0)
47
+ @mock.ttl(@key).should == 100
48
+
49
+ @mock.select(1)
50
+ @mock.ttl(@key).should == 200
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#set(key, value)' do
4
+ it "responds with 'OK'" do
5
+ @redises.set('mock-redis-test', 1).should == 'OK'
6
+ end
7
+ end
@@ -0,0 +1,46 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "#setbit(key, offset)" do
5
+ before do
6
+ @key = 'mock-redis-test:setbit'
7
+ @redises.set(@key, 'h') # ASCII 0x68
8
+ end
9
+
10
+ it "returns the original stored bit's value" do
11
+ @redises.setbit(@key, 0, 1).should == 0
12
+ @redises.setbit(@key, 1, 1).should == 1
13
+ end
14
+
15
+ it "sets the bit within the string" do
16
+ $debug = true
17
+ @redises.setbit(@key, 7, 1)
18
+ $debug = false
19
+ @redises.get(@key).should == 'i' # ASCII 0x69
20
+ end
21
+
22
+ it "does the right thing with multibyte characters" do
23
+ @redises.set(@key, "€99.94") # the euro sign is 3 bytes wide in UTF-8
24
+ @redises.setbit(@key, 63, 1).should == 0
25
+ @redises.get(@key).should == "€99.95"
26
+ end
27
+
28
+ it "expands the string if necessary" do
29
+ @redises.setbit(@key, 9, 1)
30
+ @redises.get(@key).should == "h@"
31
+ end
32
+
33
+ it "sets added bits to 0" do
34
+ @redises.setbit(@key, 17, 1)
35
+ @redises.get(@key).should == "h\000@"
36
+ end
37
+
38
+ it "treats missing keys as empty strings" do
39
+ @redises.del(@key)
40
+ @redises.setbit(@key, 1, 1)
41
+ @redises.get(@key).should == "@"
42
+ end
43
+
44
+ it_should_behave_like "a string-only command"
45
+ end
46
+
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#setex(key, seconds, value)' do
4
+ before { @key = 'mock-redis-test:setex' }
5
+
6
+ it "responds with 'OK'" do
7
+ @redises.setex(@key, 10, 'value').should == 'OK'
8
+ end
9
+
10
+ it "sets the value" do
11
+ @redises.setex(@key, 10000, 'value')
12
+ @redises.get(@key).should == 'value'
13
+ end
14
+
15
+ it "sets the expiration time" do
16
+ @redises.setex(@key, 10000, 'value')
17
+
18
+ # no guarantee these are the same
19
+ @redises.real.ttl(@key).should > 0
20
+ @redises.mock.ttl(@key).should > 0
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#setnx(key, value)' do
4
+ before { @key = 'mock-redis-test:setnx' }
5
+
6
+ it "returns true if the key was absent" do
7
+ @redises.setnx(@key, 1).should be_true
8
+ end
9
+
10
+ it "returns false if the key was present" do
11
+ @redises.set(@key, 2)
12
+ @redises.setnx(@key, 1).should be_false
13
+ end
14
+
15
+ it "sets the value if missing" do
16
+ @redises.setnx(@key, 'value')
17
+ @redises.get(@key).should == 'value'
18
+ end
19
+
20
+ it "does nothing if the value is present" do
21
+ @redises.set(@key, 'old')
22
+ @redises.setnx(@key, 'new')
23
+ @redises.get(@key).should == 'old'
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#setrange(key, offset, value)" do
4
+ before do
5
+ @key = 'mock-redis-test:setrange'
6
+ @redises.set(@key, "This is a string")
7
+ end
8
+
9
+ it "returns the string's new length" do
10
+ @redises.setrange(@key, 0, "That").should == 16
11
+ end
12
+
13
+ it "updates part of the string" do
14
+ @redises.setrange(@key, 0, "That")
15
+ @redises.get(@key).should == "That is a string"
16
+ end
17
+
18
+ it "zero-pads the string if necessary" do
19
+ @redises.setrange(@key, 20, "X")
20
+ @redises.get(@key).should == "This is a string\000\000\000\000X"
21
+ end
22
+
23
+ it "stores things as strings" do
24
+ other_key = "mock-redis-test:setrange-other-key"
25
+ @redises.setrange(other_key, 0, 1)
26
+ @redises.get(other_key).should == "1"
27
+ end
28
+
29
+ it_should_behave_like "a string-only command"
30
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sinter(key [, key, ...])' do
4
+ before do
5
+ @numbers = 'mock-redis-test:sinter:numbers'
6
+ @evens = 'mock-redis-test:sinter:evens'
7
+ @primes = 'mock-redis-test:sinter:primes'
8
+
9
+ (1..10).each {|i| @redises.sadd(@numbers, i) }
10
+ [2, 4, 6, 8, 10].each {|i| @redises.sadd(@evens, i) }
11
+ [2, 3, 5, 7].each {|i| @redises.sadd(@primes, i) }
12
+ end
13
+
14
+ it "returns the elements in the resulting set" do
15
+ @redises.sinter(@evens, @primes).should == ["2"]
16
+ end
17
+
18
+ it "treats missing keys as empty sets" do
19
+ @redises.sinter(@destination, 'mock-redis-test:nonesuch').should == []
20
+ end
21
+
22
+ it "raises an error if given 0 sets" do
23
+ lambda do
24
+ @redises.sinter
25
+ end.should raise_error(RuntimeError)
26
+ end
27
+
28
+ it "raises an error if any argument is not a a set" do
29
+ @redises.set('mock-redis-test:notset', 1)
30
+
31
+ lambda do
32
+ @redises.sinter(@numbers, 'mock-redis-test:notset')
33
+ end.should raise_error(RuntimeError)
34
+
35
+ lambda do
36
+ @redises.sinter('mock-redis-test:notset', @numbers)
37
+ end.should raise_error(RuntimeError)
38
+ end
39
+ end
40
+
41
+
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sinterstore(destination, key [, key, ...])' do
4
+ before do
5
+ @numbers = 'mock-redis-test:sinterstore:numbers'
6
+ @evens = 'mock-redis-test:sinterstore:evens'
7
+ @primes = 'mock-redis-test:sinterstore:primes'
8
+ @destination = 'mock-redis-test:sinterstore:destination'
9
+
10
+ (1..10).each {|i| @redises.sadd(@numbers, i) }
11
+ [2, 4, 6, 8, 10].each {|i| @redises.sadd(@evens, i) }
12
+ [2, 3, 5, 7].each {|i| @redises.sadd(@primes, i) }
13
+ end
14
+
15
+ it "returns the number of elements in the resulting set" do
16
+ @redises.sinterstore(@destination, @numbers, @evens).should == 5
17
+ end
18
+
19
+ it "stores the resulting set" do
20
+ @redises.sinterstore(@destination, @numbers, @evens)
21
+ @redises.smembers(@destination).should == %w[10 2 4 6 8]
22
+ end
23
+
24
+ it "does not store empty sets" do
25
+ @redises.sinterstore(@destination, 'mock-redis-test:nonesuch', @numbers).should == 0
26
+ @redises.get(@destination).should be_nil
27
+ end
28
+
29
+ it "raises an error if given 0 sets" do
30
+ lambda do
31
+ @redises.sinterstore(@destination)
32
+ end.should raise_error(RuntimeError)
33
+ end
34
+
35
+ it "raises an error if any argument is not a a set" do
36
+ @redises.set('mock-redis-test:notset', 1)
37
+
38
+ lambda do
39
+ @redises.sinterstore(@destination, @numbers, 'mock-redis-test:notset')
40
+ end.should raise_error(RuntimeError)
41
+
42
+ lambda do
43
+ @redises.sinterstore(@destination, 'mock-redis-test:notset', @numbers)
44
+ end.should raise_error(RuntimeError)
45
+ end
46
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sismember(key, member)' do
4
+ before do
5
+ @key = 'mock-redis-test:sismember'
6
+ @redises.sadd(@key, 'whiskey')
7
+ @redises.sadd(@key, 'beer')
8
+ end
9
+
10
+ it "returns true if member is in set" do
11
+ @redises.sismember(@key, 'whiskey').should be_true
12
+ @redises.sismember(@key, 'beer').should be_true
13
+ end
14
+
15
+ it "returns false if member is not in set" do
16
+ @redises.sismember(@key, 'cola').should be_false
17
+ end
18
+
19
+ it "stringifies member" do
20
+ @redises.sadd(@key, '1')
21
+ @redises.sismember(@key, 1).should be_true
22
+ end
23
+
24
+ it "treats a nonexistent value as an empty set" do
25
+ @redises.sismember('mock-redis-test:nonesuch', 'beer').should be_false
26
+ end
27
+
28
+ it_should_behave_like "a set-only command"
29
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#smembers(key)' do
4
+ before { @key = 'mock-redis-test:smembers' }
5
+
6
+ it "returns [] for an empty set" do
7
+ @redises.smembers(@key).should == []
8
+ end
9
+
10
+ it "returns the set's members" do
11
+ @redises.sadd(@key, 1)
12
+ @redises.sadd(@key, 2)
13
+ @redises.sadd(@key, 3)
14
+ @redises.smembers(@key).should == %w[1 2 3]
15
+ end
16
+
17
+ it_should_behave_like "a set-only command"
18
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#smove(source, destination, member)' do
4
+ before do
5
+ @src = 'mock-redis-test:smove-source'
6
+ @dest = 'mock-redis-test:smove-destination'
7
+
8
+ @redises.sadd(@src, 1)
9
+ @redises.sadd(@dest, 2)
10
+ end
11
+
12
+ it "returns true if the member exists in src" do
13
+ @redises.smove(@src, @dest, 1).should be_true
14
+ end
15
+
16
+ it "returns false if the member exists in src" do
17
+ @redises.smove(@src, @dest, 'nope').should be_false
18
+ end
19
+
20
+ it "returns true if the member exists in src and dest" do
21
+ @redises.sadd(@dest, 1)
22
+ @redises.smove(@src, @dest, 1).should be_true
23
+ end
24
+
25
+ it "moves member from source to destination" do
26
+ @redises.smove(@src, @dest, 1)
27
+ @redises.sismember(@dest, 1).should be_true
28
+ @redises.sismember(@src, 1).should be_false
29
+ end
30
+
31
+ it "cleans up empty sets" do
32
+ @redises.smove(@src, @dest, 1)
33
+ @redises.get(@src).should be_nil
34
+ end
35
+
36
+ it "treats a nonexistent value as an empty set" do
37
+ @redises.smove('mock-redis-test:nonesuch', @dest, 1).should be_false
38
+ end
39
+
40
+ it_should_behave_like "a set-only command"
41
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#spop(key)' do
4
+ before do
5
+ @key = 'mock-redis-test:spop'
6
+
7
+ @redises.sadd(@key, 'value')
8
+ end
9
+
10
+ it "returns a member of the set" do
11
+ @redises.spop(@key).should == 'value'
12
+ end
13
+
14
+ it "removes a member of the set" do
15
+ @redises.spop(@key)
16
+ @redises.smembers(@key).should == []
17
+ end
18
+
19
+ it "returns nil if the set is empty" do
20
+ @redises.spop(@key)
21
+ @redises.spop(@key).should be_nil
22
+ end
23
+
24
+ it_should_behave_like "a set-only command"
25
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#srandmember(key)' do
4
+ before do
5
+ @key = 'mock-redis-test:srandmember'
6
+
7
+ @redises.sadd(@key, 'value')
8
+ end
9
+
10
+ it "returns a member of the set" do
11
+ @redises.srandmember(@key).should == 'value'
12
+ end
13
+
14
+ it "does not modify the set" do
15
+ @redises.srandmember(@key)
16
+ @redises.smembers(@key).should == ['value']
17
+ end
18
+
19
+ it "returns nil if the set is empty" do
20
+ @redises.spop(@key)
21
+ @redises.srandmember(@key).should be_nil
22
+ end
23
+
24
+ it_should_behave_like "a set-only command"
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#srem(key, member)' do
4
+ before do
5
+ @key = 'mock-redis-test:srem'
6
+
7
+ @redises.sadd(@key, 'bert')
8
+ @redises.sadd(@key, 'ernie')
9
+ end
10
+
11
+ it "returns true if member is in the set" do
12
+ @redises.srem(@key, 'bert').should be_true
13
+ end
14
+
15
+ it "returns false if member is not in the set" do
16
+ @redises.srem(@key, 'cookiemonster').should be_false
17
+ end
18
+
19
+ it "removes member from the set" do
20
+ @redises.srem(@key, 'ernie')
21
+ @redises.smembers(@key).should == ['bert']
22
+ end
23
+
24
+ it "stringifies member" do
25
+ @redises.sadd(@key, '1')
26
+ @redises.srem(@key, 1).should be_true
27
+ end
28
+
29
+ it "cleans up empty sets" do
30
+ @redises.smembers(@key).each {|m| @redises.srem(@key, m)}
31
+ @redises.get(@key).should be_nil
32
+ end
33
+
34
+ it_should_behave_like "a set-only command"
35
+ end
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "#strlen(key)" do
5
+ before do
6
+ @key = 'mock-redis-test:73288'
7
+ @redises.set(@key, "5 ∈ (0..10)")
8
+ end
9
+
10
+ it "returns the string's length in bytes" do
11
+ @redises.strlen(@key).should == 13
12
+ end
13
+
14
+ it "returns 0 for a nonexistent value" do
15
+ @redises.strlen('mock-redis-test:does-not-exist').should == 0
16
+ end
17
+
18
+ it_should_behave_like "a string-only command"
19
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sunion(key [, key, ...])' do
4
+ before do
5
+ @evens = 'mock-redis-test:sunion:evens'
6
+ @primes = 'mock-redis-test:sunion:primes'
7
+
8
+ [2, 4, 6, 8, 10].each {|i| @redises.sadd(@evens, i) }
9
+ [2, 3, 5, 7].each {|i| @redises.sadd(@primes, i) }
10
+ end
11
+
12
+ it "returns the elements in the resulting set" do
13
+ @redises.sunion(@evens, @primes).should == %w[10 2 3 4 5 6 7 8]
14
+ end
15
+
16
+ it "treats missing keys as empty sets" do
17
+ @redises.sunion(@primes, 'mock-redis-test:nonesuch').
18
+ should == %w[2 3 5 7]
19
+ end
20
+
21
+ it "raises an error if given 0 sets" do
22
+ lambda do
23
+ @redises.sunion
24
+ end.should raise_error(RuntimeError)
25
+ end
26
+
27
+ it "raises an error if any argument is not a a set" do
28
+ @redises.set('mock-redis-test:notset', 1)
29
+
30
+ lambda do
31
+ @redises.sunion(@numbers, 'mock-redis-test:notset')
32
+ end.should raise_error(RuntimeError)
33
+
34
+ lambda do
35
+ @redises.sunion('mock-redis-test:notset', @numbers)
36
+ end.should raise_error(RuntimeError)
37
+ end
38
+ end
39
+
40
+
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#sunionstore(destination, key [, key, ...])' do
4
+ before do
5
+ @evens = 'mock-redis-test:sunionstore:evens'
6
+ @primes = 'mock-redis-test:sunionstore:primes'
7
+ @destination = 'mock-redis-test:sunionstore:destination'
8
+
9
+ [2, 4, 6, 8, 10].each {|i| @redises.sadd(@evens, i) }
10
+ [2, 3, 5, 7].each {|i| @redises.sadd(@primes, i) }
11
+ end
12
+
13
+ it "returns the number of elements in the resulting set" do
14
+ @redises.sunionstore(@destination, @primes, @evens).should == 8
15
+ end
16
+
17
+ it "stores the resulting set" do
18
+ @redises.sunionstore(@destination, @primes, @evens)
19
+ @redises.smembers(@destination).should == %w[10 2 3 4 5 6 7 8]
20
+ end
21
+
22
+ it "does not store empty sets" do
23
+ @redises.sunionstore(@destination,
24
+ 'mock-redis-test:nonesuch',
25
+ 'mock-redis-test:nonesuch2').should == 0
26
+ @redises.get(@destination).should be_nil
27
+ end
28
+
29
+ it "raises an error if given 0 sets" do
30
+ lambda do
31
+ @redises.sunionstore(@destination)
32
+ end.should raise_error(RuntimeError)
33
+ end
34
+
35
+ it "raises an error if any argument is not a a set" do
36
+ @redises.set('mock-redis-test:notset', 1)
37
+
38
+ lambda do
39
+ @redises.sunionstore(@destination, @primes, 'mock-redis-test:notset')
40
+ end.should raise_error(RuntimeError)
41
+
42
+ lambda do
43
+ @redises.sunionstore(@destination, 'mock-redis-test:notset', @primes)
44
+ end.should raise_error(RuntimeError)
45
+ end
46
+ end