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,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#hincrby(key, field, increment)' do
4
+ before do
5
+ @key = 'mock-redis-test:hincrby'
6
+ @field = 'count'
7
+ end
8
+
9
+ it "returns the value after the increment" do
10
+ @redises.hset(@key, @field, 2)
11
+ @redises.hincrby(@key, @field, 2).should == 4
12
+ end
13
+
14
+ it "treats a missing key like 0" do
15
+ @redises.hincrby(@key, @field, 1).should == 1
16
+ end
17
+
18
+ it "creates a hash if nothing is present" do
19
+ @redises.hincrby(@key, @field, 1)
20
+ @redises.hget(@key, @field).should == "1"
21
+ end
22
+
23
+ it "increments negative numbers" do
24
+ @redises.hset(@key, @field, -10)
25
+ @redises.hincrby(@key, @field, 2).should == -8
26
+ end
27
+
28
+ it "works multiple times" do
29
+ @redises.hincrby(@key, @field, 2).should == 2
30
+ @redises.hincrby(@key, @field, 2).should == 4
31
+ @redises.hincrby(@key, @field, 2).should == 6
32
+ end
33
+
34
+ it "accepts an integer-ish string" do
35
+ @redises.hincrby(@key, @field, "2").should == 2
36
+ end
37
+
38
+ it "raises an error if the value does not look like an integer" do
39
+ @redises.hset(@key, @field, "one")
40
+ lambda do
41
+ @redises.hincrby(@key, @field, 1)
42
+ end.should raise_error(RuntimeError)
43
+ end
44
+
45
+ it "raises an error if the delta does not look like an integer" do
46
+ lambda do
47
+ @redises.hincrby(@key, @field, "foo")
48
+ end.should raise_error(RuntimeError)
49
+ end
50
+
51
+ it_should_behave_like "a hash-only command"
52
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hkeys(key)" do
4
+ before do
5
+ @key = "mock-redis-test:hkeys"
6
+ @redises.hset(@key, 'k1', 'v1')
7
+ @redises.hset(@key, 'k2', 'v2')
8
+ end
9
+
10
+ it "returns the keys stored in the hash" do
11
+ @redises.hkeys(@key).sort.should == %w[k1 k2]
12
+ end
13
+
14
+ it "returns [] when there is no such key" do
15
+ @redises.hkeys('mock-redis-test:nonesuch').should == []
16
+ end
17
+
18
+ it_should_behave_like "a hash-only command"
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hlen(key)" do
4
+ before do
5
+ @key = "mock-redis-test:hlen"
6
+ @redises.hset(@key, 'k1', 'v1')
7
+ @redises.hset(@key, 'k2', 'v2')
8
+ end
9
+
10
+ it "returns the number of keys stored in the hash" do
11
+ @redises.hlen(@key).should == 2
12
+ end
13
+
14
+ it "returns [] when there is no such key" do
15
+ @redises.hlen('mock-redis-test:nonesuch').should == 0
16
+ end
17
+
18
+ it_should_behave_like "a hash-only command"
19
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hmget(key, field [, field, ...])" do
4
+ before do
5
+ @key = "mock-redis-test:hmget"
6
+ @redises.hset(@key, 'k1', 'v1')
7
+ @redises.hset(@key, 'k2', 'v2')
8
+ end
9
+
10
+ it "returns the values for those keys" do
11
+ @redises.hmget(@key, 'k1', 'k2').sort.should == %w[v1 v2]
12
+ end
13
+
14
+ it "returns nils when there are no such fields" do
15
+ @redises.hmget(@key, 'k1', 'mock-redis-test:nonesuch').
16
+ should == ['v1', nil]
17
+ end
18
+
19
+ it "returns nils when there is no such key" do
20
+ @redises.hmget(@key, 'mock-redis-test:nonesuch').should == [nil]
21
+ end
22
+
23
+ it "raises an error if given no fields" do
24
+ lambda do
25
+ @redises.hmget(@key)
26
+ end.should raise_error(RuntimeError)
27
+ end
28
+
29
+ it_should_behave_like "a hash-only command"
30
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hmset(key, field, value [, field, value ...])" do
4
+ before do
5
+ @key = "mock-redis-test:hmset"
6
+ end
7
+
8
+ it "returns 'OK'" do
9
+ @redises.hmset(@key, 'k1', 'v1', 'k2', 'v2').should == "OK"
10
+ end
11
+
12
+ it "sets the values" do
13
+ @redises.hmset(@key, 'k1', 'v1', 'k2', 'v2')
14
+ @redises.hmget(@key, 'k1', 'k2').should == %w[v1 v2]
15
+ end
16
+
17
+ it "updates an existing hash" do
18
+ @redises.hset(@key, 'foo', 'bar')
19
+ @redises.hmset(@key, 'bert', 'ernie', 'diet', 'coke')
20
+
21
+ @redises.hmget(@key, 'foo', 'bert', 'diet').
22
+ should == %w[bar ernie coke]
23
+ end
24
+
25
+ it "stores the values as strings" do
26
+ @redises.hmset(@key, 'one', 1)
27
+ @redises.hget(@key, 'one').should == "1"
28
+ end
29
+
30
+ it "raises an error if given no fields or values" do
31
+ lambda do
32
+ @redises.hmset(@key)
33
+ end.should raise_error(RuntimeError)
34
+ end
35
+
36
+ it "raises an error if given an odd number of fields+values" do
37
+ lambda do
38
+ @redises.hmset(@key, 'k1', 1, 'k2')
39
+ end.should raise_error(RuntimeError)
40
+ end
41
+
42
+ it_should_behave_like "a hash-only command"
43
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hset(key, field)" do
4
+ before do
5
+ @key = "mock-redis-test:hset"
6
+ end
7
+
8
+ it "returns true" do
9
+ @redises.hset(@key, 'k1', 'v1').should == true
10
+ end
11
+
12
+ it "creates a hash there is no such field" do
13
+ @redises.hset(@key, 'k1', 'v1')
14
+ @redises.hget(@key, 'k1').should == 'v1'
15
+ end
16
+
17
+ it "stores values as strings" do
18
+ @redises.hset(@key, "num", 1)
19
+ @redises.hget(@key, 'num').should == "1"
20
+ end
21
+
22
+ it_should_behave_like "a hash-only command"
23
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hsetnx(key, field)" do
4
+ before do
5
+ @key = "mock-redis-test:hsetnx"
6
+ end
7
+
8
+ it "returns true if the field is absent" do
9
+ @redises.hsetnx(@key, 'field', 'val').should be_true
10
+ end
11
+
12
+ it "returns 0 if the field is present" do
13
+ @redises.hset(@key, 'field', 'val')
14
+ @redises.hsetnx(@key, 'field', 'val').should be_false
15
+ end
16
+
17
+ it "leaves the field unchanged if the field is present" do
18
+ @redises.hset(@key, 'field', 'old')
19
+ @redises.hsetnx(@key, 'field', 'new')
20
+ @redises.hget(@key, 'field').should == 'old'
21
+ end
22
+
23
+ it "sets the field if the field is absent" do
24
+ @redises.hsetnx(@key, 'field', 'new')
25
+ @redises.hget(@key, 'field').should == 'new'
26
+ end
27
+
28
+ it "creates a hash if there is no such field" do
29
+ @redises.hsetnx(@key, 'field', 'val')
30
+ @redises.hget(@key, 'field').should == 'val'
31
+ end
32
+
33
+ it "stores values as strings" do
34
+ @redises.hsetnx(@key, "num", 1)
35
+ @redises.hget(@key, 'num').should == "1"
36
+ end
37
+
38
+ it_should_behave_like "a hash-only command"
39
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#hvals(key)" do
4
+ before do
5
+ @key = "mock-redis-test:hvals"
6
+ @redises.hset(@key, 'k1', 'v1')
7
+ @redises.hset(@key, 'k2', 'v2')
8
+ end
9
+
10
+ it "returns the values stored in the hash" do
11
+ @redises.hvals(@key).sort.should == %w[v1 v2]
12
+ end
13
+
14
+ it "returns [] when there is no such key" do
15
+ @redises.hvals('mock-redis-test:nonesuch').should == []
16
+ end
17
+
18
+ it_should_behave_like "a hash-only command"
19
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#incr(key)' do
4
+ before { @key = 'mock-redis-test:33888' }
5
+
6
+ it "returns the value after the increment" do
7
+ @redises.set(@key, 1)
8
+ @redises.incr(@key).should == 2
9
+ end
10
+
11
+ it "treats a missing key like 0" do
12
+ @redises.incr(@key).should == 1
13
+ end
14
+
15
+ it "increments negative numbers" do
16
+ @redises.set(@key, -10)
17
+ @redises.incr(@key).should == -9
18
+ end
19
+
20
+ it "works multiple times" do
21
+ @redises.incr(@key).should == 1
22
+ @redises.incr(@key).should == 2
23
+ @redises.incr(@key).should == 3
24
+ end
25
+
26
+ it "raises an error if the value does not look like an integer" do
27
+ @redises.set(@key, "one")
28
+ lambda do
29
+ @redises.incr(@key)
30
+ end.should raise_error(RuntimeError)
31
+ end
32
+
33
+ it_should_behave_like "a string-only command"
34
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#incrby(key, increment)' do
4
+ before { @key = 'mock-redis-test:65374' }
5
+
6
+ it "returns the value after the increment" do
7
+ @redises.set(@key, 2)
8
+ @redises.incrby(@key, 2).should == 4
9
+ end
10
+
11
+ it "treats a missing key like 0" do
12
+ @redises.incrby(@key, 1).should == 1
13
+ end
14
+
15
+ it "increments negative numbers" do
16
+ @redises.set(@key, -10)
17
+ @redises.incrby(@key, 2).should == -8
18
+ end
19
+
20
+ it "works multiple times" do
21
+ @redises.incrby(@key, 2).should == 2
22
+ @redises.incrby(@key, 2).should == 4
23
+ @redises.incrby(@key, 2).should == 6
24
+ end
25
+
26
+ it "accepts an integer-ish string" do
27
+ @redises.incrby(@key, "2").should == 2
28
+ end
29
+
30
+ it "raises an error if the value does not look like an integer" do
31
+ @redises.set(@key, "one")
32
+ lambda do
33
+ @redises.incrby(@key, 1)
34
+ end.should raise_error(RuntimeError)
35
+ end
36
+
37
+ it "raises an error if the delta does not look like an integer" do
38
+ lambda do
39
+ @redises.incrby(@key, "foo")
40
+ end.should raise_error(RuntimeError)
41
+ end
42
+
43
+ it_should_behave_like "a string-only command"
44
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#info [mock only]' do
4
+ before { @info = @redises.mock.info }
5
+
6
+ it "responds with a config hash" do
7
+ @info.should be_a(Hash)
8
+ end
9
+
10
+ it "has some data in it" do
11
+ @info.keys.length.should > 0
12
+ end
13
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#keys()' do
4
+
5
+ it "returns [] when no keys are found (no regex characters)" do
6
+ @redises.keys("mock-redis-test:29016").should == []
7
+ end
8
+
9
+ it "returns [] when no keys are found (some regex characters)" do
10
+ @redises.keys("mock-redis-test:29016*").should == []
11
+ end
12
+
13
+ describe "with pattern matching" do
14
+ before do
15
+ @redises.set("mock-redis-test:key1", 1)
16
+ @redises.set("mock-redis-test:key2", 2)
17
+ @redises.set("mock-redis-test:key3", 3)
18
+ @redises.set("mock-redis-test:key10", 10)
19
+ @redises.set("mock-redis-test:key20", 20)
20
+ @redises.set("mock-redis-test:key30", 30)
21
+
22
+ @redises.set("mock-redis-test:special-key?", 'true')
23
+ @redises.set("mock-redis-test:special-key*", 'true')
24
+ end
25
+
26
+ describe "the ? character" do
27
+ it "is treated as a single character (at the end of the pattern)" do
28
+ @redises.keys("mock-redis-test:key?").sort.should == [
29
+ 'mock-redis-test:key1',
30
+ 'mock-redis-test:key2',
31
+ 'mock-redis-test:key3',
32
+ ]
33
+ end
34
+
35
+ it "is treated as a single character (in the middle of the pattern)" do
36
+ @redises.keys("mock-redis-test:key?0").sort.should == [
37
+ 'mock-redis-test:key10',
38
+ 'mock-redis-test:key20',
39
+ 'mock-redis-test:key30',
40
+ ]
41
+ end
42
+
43
+ it "treats \? as a literal ?" do
44
+ @redises.keys('mock-redis-test:special-key\?').sort.should == [
45
+ 'mock-redis-test:special-key?'
46
+ ]
47
+ end
48
+ end
49
+
50
+ describe "the * character" do
51
+ it "is treated as 1 or more characters" do
52
+ @redises.keys("mock-redis-test:key*").sort.should == [
53
+ 'mock-redis-test:key1',
54
+ 'mock-redis-test:key10',
55
+ 'mock-redis-test:key2',
56
+ 'mock-redis-test:key20',
57
+ 'mock-redis-test:key3',
58
+ 'mock-redis-test:key30',
59
+ ]
60
+ end
61
+
62
+ it "treats \* as a literal *" do
63
+ @redises.keys('mock-redis-test:special-key\*').sort.should == [
64
+ 'mock-redis-test:special-key*'
65
+ ]
66
+ end
67
+ end
68
+
69
+ describe "character classes ([abcde])" do
70
+ it "matches any one of those characters" do
71
+ @redises.keys('mock-redis-test:key[12]').sort.should == [
72
+ 'mock-redis-test:key1',
73
+ 'mock-redis-test:key2',
74
+ ]
75
+ end
76
+ end
77
+
78
+ describe "combining metacharacters" do
79
+ it "works with different metacharacters simultaneously" do
80
+ @redises.keys('mock-redis-test:k*[12]?').sort.should == [
81
+ 'mock-redis-test:key10',
82
+ 'mock-redis-test:key20',
83
+ ]
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#lastsave [mock only]" do
4
+ # can't test against both since it's timing-dependent
5
+ it "returns a Unix time" do
6
+ @redises.mock.lastsave.to_s.should =~ /^\d+$/
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#lindex(key, index)' do
4
+ before { @key = 'mock-redis-test:69312' }
5
+
6
+ it "gets an element from the list by its index" do
7
+ @redises.lpush(@key, 20)
8
+ @redises.lpush(@key, 10)
9
+
10
+ @redises.lindex(@key, 0).should == "10"
11
+ @redises.lindex(@key, 1).should == "20"
12
+ end
13
+
14
+ it "treats negative indices as coming from the right" do
15
+ @redises.lpush(@key, 20)
16
+ @redises.lpush(@key, 10)
17
+
18
+ @redises.lindex(@key, -1).should == "20"
19
+ @redises.lindex(@key, -2).should == "10"
20
+ end
21
+
22
+ it "returns nil if the index is too large (and positive)" do
23
+ @redises.lpush(@key, 20)
24
+
25
+ @redises.lindex(@key, 100).should be_nil
26
+ end
27
+
28
+ it "returns nil if the index is too large (and negative)" do
29
+ @redises.lpush(@key, 20)
30
+
31
+ @redises.lindex(@key, -100).should be_nil
32
+ end
33
+
34
+ it "returns nil for nonexistent values" do
35
+ @redises.lindex(@key, 0).should be_nil
36
+ end
37
+
38
+ it_should_behave_like "a list-only command"
39
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#linsert(key, :before|:after, pivot, value)" do
4
+ before { @key = 'mock-redis-test:48733' }
5
+
6
+ it "returns the new size of the list when the pivot is found" do
7
+ @redises.lpush(@key, 'X')
8
+
9
+ @redises.linsert(@key, :before, 'X', 'Y').should == 2
10
+ @redises.lpushx(@key, 'X').should == 3
11
+ end
12
+
13
+ it "does nothing when run against a nonexistent key" do
14
+ @redises.linsert(@key, :before, 1, 2).should == 0
15
+ @redises.get(@key).should be_nil
16
+ end
17
+
18
+ it "returns -1 if the pivot is not found" do
19
+ @redises.lpush(@key, 1)
20
+ @redises.linsert(@key, :after, 'X', 'Y').should == -1
21
+ end
22
+
23
+ it "inserts elements before the pivot when given :before as position" do
24
+ @redises.lpush(@key, 'bert')
25
+ @redises.linsert(@key, :before, 'bert', 'ernie')
26
+
27
+ @redises.lindex(@key, 0).should == 'ernie'
28
+ @redises.lindex(@key, 1).should == 'bert'
29
+ end
30
+
31
+ it "inserts elements before the pivot when given 'before' as position" do
32
+ @redises.lpush(@key, 'bert')
33
+ @redises.linsert(@key, 'before', 'bert', 'ernie')
34
+
35
+ @redises.lindex(@key, 0).should == 'ernie'
36
+ @redises.lindex(@key, 1).should == 'bert'
37
+ end
38
+
39
+ it "inserts elements after the pivot when given :after as position" do
40
+ @redises.lpush(@key, 'bert')
41
+ @redises.linsert(@key, :after, 'bert', 'ernie')
42
+
43
+ @redises.lindex(@key, 0).should == 'bert'
44
+ @redises.lindex(@key, 1).should == 'ernie'
45
+ end
46
+
47
+ it "inserts elements after the pivot when given 'after' as position" do
48
+ @redises.lpush(@key, 'bert')
49
+ @redises.linsert(@key, 'after', 'bert', 'ernie')
50
+
51
+ @redises.lindex(@key, 0).should == 'bert'
52
+ @redises.lindex(@key, 1).should == 'ernie'
53
+ end
54
+
55
+ it "raises an error when given a position that is neither before nor after" do
56
+ lambda do
57
+ @redises.linsert(@key, :near, 1, 2)
58
+ end.should raise_error(RuntimeError)
59
+ end
60
+
61
+ it "stores values as strings" do
62
+ @redises.lpush(@key, 1)
63
+ @redises.linsert(@key, :before, 1, 2)
64
+ @redises.lindex(@key, 0).should == "2"
65
+ end
66
+
67
+ it_should_behave_like "a list-only command"
68
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#llen(key)" do
4
+ before { @key = 'mock-redis-test:78407' }
5
+
6
+ it "returns 0 for a nonexistent key" do
7
+ @redises.llen(@key).should == 0
8
+ end
9
+
10
+ it "returns the length of the list" do
11
+ 5.times { @redises.lpush(@key, 'X') }
12
+ @redises.llen(@key).should == 5
13
+ end
14
+
15
+ it_should_behave_like "a list-only command"
16
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#lpop(key)' do
4
+ before { @key = 'mock-redis-test:65374' }
5
+
6
+ it "returns and removes the first element of a list" do
7
+ @redises.lpush(@key, 1)
8
+ @redises.lpush(@key, 2)
9
+
10
+ @redises.lpop(@key).should == "2"
11
+
12
+ @redises.llen(@key).should == 1
13
+ end
14
+
15
+ it "returns nil if the list is empty" do
16
+ @redises.lpush(@key, 'foo')
17
+ @redises.lpop(@key)
18
+
19
+ @redises.lpop(@key).should be_nil
20
+ end
21
+
22
+ it "returns nil for nonexistent values" do
23
+ @redises.lpop(@key).should be_nil
24
+ end
25
+
26
+ it "removes empty lists" do
27
+ @redises.lpush(@key, 'foo')
28
+ @redises.lpop(@key)
29
+
30
+ @redises.get(@key).should be_nil
31
+ end
32
+
33
+ it_should_behave_like "a list-only command"
34
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#lpush(key, value)" do
4
+ before { @key = 'mock-redis-test:57367' }
5
+
6
+ it "returns the new size of the list" do
7
+ @redises.lpush(@key, 'X').should == 1
8
+ @redises.lpush(@key, 'X').should == 2
9
+ end
10
+
11
+ it "creates a new list when run against a nonexistent key" do
12
+ @redises.lpush(@key, 'value')
13
+ @redises.llen(@key).should == 1
14
+ end
15
+
16
+ it "prepends items to the list" do
17
+ @redises.lpush(@key, "bert")
18
+ @redises.lpush(@key, "ernie")
19
+
20
+ @redises.lindex(@key, 0).should == "ernie"
21
+ @redises.lindex(@key, 1).should == "bert"
22
+ end
23
+
24
+ it "stores values as strings" do
25
+ @redises.lpush(@key, 1)
26
+ @redises.lindex(@key, 0).should == "1"
27
+ end
28
+
29
+ it_should_behave_like "a list-only command"
30
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#lpushx(key, value)" do
4
+ before { @key = 'mock-redis-test:81267' }
5
+
6
+ it "returns the new size of the list" do
7
+ @redises.lpush(@key, 'X')
8
+
9
+ @redises.lpushx(@key, 'X').should == 2
10
+ @redises.lpushx(@key, 'X').should == 3
11
+ end
12
+
13
+ it "does nothing when run against a nonexistent key" do
14
+ @redises.lpushx(@key, 'value')
15
+ @redises.get(@key).should be_nil
16
+ end
17
+
18
+ it "prepends items to the list" do
19
+ @redises.lpush(@key, "bert")
20
+ @redises.lpushx(@key, "ernie")
21
+
22
+ @redises.lindex(@key, 0).should == "ernie"
23
+ @redises.lindex(@key, 1).should == "bert"
24
+ end
25
+
26
+ it "stores values as strings" do
27
+ @redises.lpush(@key, 1)
28
+ @redises.lpushx(@key, 2)
29
+ @redises.lindex(@key, 0).should == "2"
30
+ end
31
+
32
+ it_should_behave_like "a list-only command"
33
+ end