spec/keys_spec.rb in fakeredis-0.5.0 vs spec/keys_spec.rb in fakeredis-0.6.0
- old
+ new
@@ -10,100 +10,126 @@
it "should delete a key" do
@client.set("key1", "1")
@client.set("key2", "2")
@client.del("key1", "key2")
- @client.get("key1").should be == nil
+ expect(@client.get("key1")).to eq(nil)
end
it "should delete multiple keys" do
@client.set("key1", "1")
@client.set("key2", "2")
@client.del(["key1", "key2"])
- @client.get("key1").should be == nil
- @client.get("key2").should be == nil
+ expect(@client.get("key1")).to eq(nil)
+ expect(@client.get("key2")).to eq(nil)
end
it "should error deleting no keys" do
- lambda { @client.del }.should raise_error(Redis::CommandError, "ERR wrong number of arguments for 'del' command")
- lambda { @client.del [] }.should raise_error(Redis::CommandError, "ERR wrong number of arguments for 'del' command")
+ expect { @client.del }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'del' command")
+ expect { @client.del [] }.to raise_error(Redis::CommandError, "ERR wrong number of arguments for 'del' command")
end
+ it "should return true when setnx keys that don't exist" do
+ expect(@client.setnx("key1", "1")).to eq(true)
+ end
+
+ it "should return false when setnx keys exist" do
+ @client.set("key1", "1")
+ expect(@client.setnx("key1", "1")).to eq(false)
+ end
+
it "should return true when setting expires on keys that exist" do
@client.set("key1", "1")
- @client.expire("key1", 1).should == true
+ expect(@client.expire("key1", 1)).to eq(true)
end
+ it "should return true when setting pexpires on keys that exist" do
+ @client.set("key1", "1")
+ expect(@client.pexpire("key1", 1)).to eq(true)
+ end
+
it "should return false when attempting to set expires on a key that does not exist" do
- @client.expire("key1", 1).should == false
+ expect(@client.expire("key1", 1)).to eq(false)
end
+ it "should return false when attempting to set pexpires on a key that does not exist" do
+ expect(@client.pexpire("key1", 1)).to eq(false)
+ end
+
it "should determine if a key exists" do
@client.set("key1", "1")
- @client.exists("key1").should be == true
- @client.exists("key2").should be == false
+ expect(@client.exists("key1")).to eq(true)
+ expect(@client.exists("key2")).to eq(false)
end
it "should set a key's time to live in seconds" do
@client.set("key1", "1")
@client.expire("key1", 1)
- @client.ttl("key1").should be == 1
+ expect(@client.ttl("key1")).to eq(1)
end
+ it "should set a key's time to live in miliseconds" do
+ allow(Time).to receive(:now).and_return(1000)
+ @client.set("key1", "1")
+ @client.pexpire("key1", 2200)
+ expect(@client.pttl("key1")).to be_within(0.1).of(2200)
+ allow(Time).to receive(:now).and_call_original
+ end
+
it "should set the expiration for a key as a UNIX timestamp" do
@client.set("key1", "1")
@client.expireat("key1", Time.now.to_i + 2)
- @client.ttl("key1").should be == 2
+ expect(@client.ttl("key1")).to eq(2)
end
it "should not have an expiration after re-set" do
@client.set("key1", "1")
@client.expireat("key1", Time.now.to_i + 2)
@client.set("key1", "1")
- @client.ttl("key1").should be == -1
+ expect(@client.ttl("key1")).to eq(-1)
end
it "should not have a ttl if expired (and thus key does not exist)" do
@client.set("key1", "1")
@client.expireat("key1", Time.now.to_i)
- @client.ttl("key1").should be == -2
+ expect(@client.ttl("key1")).to eq(-2)
end
it "should not find a key if expired" do
@client.set("key1", "1")
@client.expireat("key1", Time.now.to_i)
- @client.get("key1").should be_nil
+ expect(@client.get("key1")).to be_nil
end
it "should not find multiple keys if expired" do
@client.set("key1", "1")
@client.set("key2", "2")
@client.expireat("key1", Time.now.to_i)
- @client.mget("key1", "key2").should be == [nil, "2"]
+ expect(@client.mget("key1", "key2")).to eq([nil, "2"])
end
it "should only find keys that aren't expired" do
@client.set("key1", "1")
@client.set("key2", "2")
@client.expireat("key1", Time.now.to_i)
- @client.keys.should be == ["key2"]
+ expect(@client.keys).to eq(["key2"])
end
it "should not exist if expired" do
@client.set("key1", "1")
@client.expireat("key1", Time.now.to_i)
- @client.exists("key1").should be false
+ expect(@client.exists("key1")).to be false
end
it "should find all keys matching the given pattern" do
@client.set("key:a", "1")
@client.set("key:b", "2")
@@ -111,166 +137,166 @@
@client.set("akeyd", "4")
@client.set("key1", "5")
@client.mset("database", 1, "above", 2, "suitability", 3, "able", 4)
- @client.keys("key:*").should =~ ["key:a", "key:b", "key:c"]
- @client.keys("ab*").should =~ ["above", "able"]
+ expect(@client.keys("key:*")).to match_array(["key:a", "key:b", "key:c"])
+ expect(@client.keys("ab*")).to match_array(["above", "able"])
end
it "should remove the expiration from a key" do
@client.set("key1", "1")
@client.expireat("key1", Time.now.to_i + 1)
- @client.persist("key1").should be == true
- @client.persist("key1").should be == false
+ expect(@client.persist("key1")).to eq(true)
+ expect(@client.persist("key1")).to eq(false)
- @client.ttl("key1").should be == -1
+ expect(@client.ttl("key1")).to eq(-1)
end
it "should return a random key from the keyspace" do
@client.set("key1", "1")
@client.set("key2", "2")
- ["key1", "key2"].include?(@client.randomkey).should be == true
+ expect(["key1", "key2"].include?(@client.randomkey)).to eq(true)
end
it "should rename a key" do
@client.set("key1", "2")
@client.rename("key1", "key2")
- @client.get("key1").should be == nil
- @client.get("key2").should be == "2"
+ expect(@client.get("key1")).to eq(nil)
+ expect(@client.get("key2")).to eq("2")
end
it "should rename a key, only if new key does not exist" do
@client.set("key1", "1")
@client.set("key2", "2")
@client.set("key3", "3")
@client.renamenx("key1", "key2")
@client.renamenx("key3", "key4")
- @client.get("key1").should be == "1"
- @client.get("key2").should be == "2"
- @client.get("key3").should be == nil
- @client.get("key4").should be == "3"
+ expect(@client.get("key1")).to eq("1")
+ expect(@client.get("key2")).to eq("2")
+ expect(@client.get("key3")).to eq(nil)
+ expect(@client.get("key4")).to eq("3")
end
it "should determine the type stored at key" do
# Non-existing key
- @client.type("key0").should be == "none"
+ expect(@client.type("key0")).to eq("none")
# String
@client.set("key1", "1")
- @client.type("key1").should be == "string"
+ expect(@client.type("key1")).to eq("string")
# List
@client.lpush("key2", "1")
- @client.type("key2").should be == "list"
+ expect(@client.type("key2")).to eq("list")
# Set
@client.sadd("key3", "1")
- @client.type("key3").should be == "set"
+ expect(@client.type("key3")).to eq("set")
# Sorted Set
@client.zadd("key4", 1.0, "1")
- @client.type("key4").should be == "zset"
+ expect(@client.type("key4")).to eq("zset")
# Hash
@client.hset("key5", "a", "1")
- @client.type("key5").should be == "hash"
+ expect(@client.type("key5")).to eq("hash")
end
it "should convert the value into a string before storing" do
@client.set("key1", 1)
- @client.get("key1").should be == "1"
+ expect(@client.get("key1")).to eq("1")
@client.setex("key2", 30, 1)
- @client.get("key2").should be == "1"
+ expect(@client.get("key2")).to eq("1")
@client.getset("key3", 1)
- @client.get("key3").should be == "1"
+ expect(@client.get("key3")).to eq("1")
end
it "should return 'OK' for the setex command" do
- @client.setex("key4", 30, 1).should be == "OK"
+ expect(@client.setex("key4", 30, 1)).to eq("OK")
end
it "should convert the key into a string before storing" do
@client.set(123, "foo")
- @client.keys.should include("123")
- @client.get("123").should be == "foo"
+ expect(@client.keys).to include("123")
+ expect(@client.get("123")).to eq("foo")
@client.setex(456, 30, "foo")
- @client.keys.should include("456")
- @client.get("456").should be == "foo"
+ expect(@client.keys).to include("456")
+ expect(@client.get("456")).to eq("foo")
@client.getset(789, "foo")
- @client.keys.should include("789")
- @client.get("789").should be == "foo"
+ expect(@client.keys).to include("789")
+ expect(@client.get("789")).to eq("foo")
end
it "should only operate against keys containing string values" do
@client.sadd("key1", "one")
- lambda { @client.get("key1") }.should raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
- lambda { @client.getset("key1", 1) }.should raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
+ expect { @client.get("key1") }.to raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
+ expect { @client.getset("key1", 1) }.to raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
@client.hset("key2", "one", "two")
- lambda { @client.get("key2") }.should raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
- lambda { @client.getset("key2", 1) }.should raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
+ expect { @client.get("key2") }.to raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
+ expect { @client.getset("key2", 1) }.to raise_error(Redis::CommandError, "WRONGTYPE Operation against a key holding the wrong kind of value")
end
it "should move a key from one database to another successfully" do
@client.select(0)
@client.set("key1", "1")
- @client.move("key1", 1).should be == true
+ expect(@client.move("key1", 1)).to eq(true)
@client.select(0)
- @client.get("key1").should be_nil
+ expect(@client.get("key1")).to be_nil
@client.select(1)
- @client.get("key1").should be == "1"
+ expect(@client.get("key1")).to eq("1")
end
it "should fail to move a key that does not exist in the source database" do
@client.select(0)
- @client.get("key1").should be_nil
+ expect(@client.get("key1")).to be_nil
- @client.move("key1", 1).should be == false
+ expect(@client.move("key1", 1)).to eq(false)
@client.select(0)
- @client.get("key1").should be_nil
+ expect(@client.get("key1")).to be_nil
@client.select(1)
- @client.get("key1").should be_nil
+ expect(@client.get("key1")).to be_nil
end
it "should fail to move a key that exists in the destination database" do
@client.select(0)
@client.set("key1", "1")
@client.select(1)
@client.set("key1", "2")
@client.select(0)
- @client.move("key1", 1).should be == false
+ expect(@client.move("key1", 1)).to eq(false)
@client.select(0)
- @client.get("key1").should be == "1"
+ expect(@client.get("key1")).to eq("1")
@client.select(1)
- @client.get("key1").should be == "2"
+ expect(@client.get("key1")).to eq("2")
end
it "should fail to move a key to the same database" do
@client.select(0)
@client.set("key1", "1")
- lambda { @client.move("key1", 0) }.should raise_error(Redis::CommandError, "ERR source and destination objects are the same")
+ expect { @client.move("key1", 0) }.to raise_error(Redis::CommandError, "ERR source and destination objects are the same")
@client.select(0)
- @client.get("key1").should be == "1"
+ expect(@client.get("key1")).to eq("1")
end
it "should scan all keys in the database" do
100.times do |x|
@client.set("key#{x}", "#{x}")
@@ -282,12 +308,12 @@
cursor, keys = @client.scan(cursor)
all_keys += keys
break if cursor == "0"
}
- all_keys.uniq.size.should == 100
- all_keys[0].should =~ /key\d+/
+ expect(all_keys.uniq.size).to eq(100)
+ expect(all_keys[0]).to match(/key\d+/)
end
it "should match keys to a pattern when scanning" do
50.times do |x|
@client.set("key#{x}", "#{x}")
@@ -302,70 +328,161 @@
cursor, keys = @client.scan(cursor, :match => "key*")
all_keys += keys
break if cursor == "0"
}
- all_keys.uniq.size.should == 50
+ expect(all_keys.uniq.size).to eq(50)
end
it "should specify doing more work when scanning" do
100.times do |x|
@client.set("key#{x}", "#{x}")
end
cursor, all_keys = @client.scan(cursor, :count => 100)
- cursor.should == "0"
- all_keys.uniq.size.should == 100
+ expect(cursor).to eq("0")
+ expect(all_keys.uniq.size).to eq(100)
end
context "with extended options" do
it "uses ex option to set the expire time, in seconds" do
ttl = 7
- @client.set("key1", "1", { :ex => ttl }).should == "OK"
- @client.ttl("key1").should == ttl
+ expect(@client.set("key1", "1", { :ex => ttl })).to eq("OK")
+ expect(@client.ttl("key1")).to eq(ttl)
end
it "uses px option to set the expire time, in miliseconds" do
ttl = 7000
- @client.set("key1", "1", { :px => ttl }).should == "OK"
- @client.ttl("key1").should == (ttl / 1000)
+ expect(@client.set("key1", "1", { :px => ttl })).to eq("OK")
+ expect(@client.ttl("key1")).to eq(ttl / 1000)
end
# Note that the redis-rb implementation will always give PX last.
# Redis seems to process each expiration option and the last one wins.
it "prefers the finer-grained PX expiration option over EX" do
ttl_px = 6000
ttl_ex = 10
@client.set("key1", "1", { :px => ttl_px, :ex => ttl_ex })
- @client.ttl("key1").should == (ttl_px / 1000)
+ expect(@client.ttl("key1")).to eq(ttl_px / 1000)
@client.set("key1", "1", { :ex => ttl_ex, :px => ttl_px })
- @client.ttl("key1").should == (ttl_px / 1000)
+ expect(@client.ttl("key1")).to eq(ttl_px / 1000)
end
it "uses nx option to only set the key if it does not already exist" do
- @client.set("key1", "1", { :nx => true }).should == true
- @client.set("key1", "2", { :nx => true }).should == false
+ expect(@client.set("key1", "1", { :nx => true })).to eq(true)
+ expect(@client.set("key1", "2", { :nx => true })).to eq(false)
- @client.get("key1").should == "1"
+ expect(@client.get("key1")).to eq("1")
end
it "uses xx option to only set the key if it already exists" do
- @client.set("key2", "1", { :xx => true }).should == false
+ expect(@client.set("key2", "1", { :xx => true })).to eq(false)
@client.set("key2", "2")
- @client.set("key2", "1", { :xx => true }).should == true
+ expect(@client.set("key2", "1", { :xx => true })).to eq(true)
- @client.get("key2").should == "1"
+ expect(@client.get("key2")).to eq("1")
end
it "does not set the key if both xx and nx option are specified" do
- @client.set("key2", "1", { :nx => true, :xx => true }).should == false
- @client.get("key2").should be_nil
+ expect(@client.set("key2", "1", { :nx => true, :xx => true })).to eq(false)
+ expect(@client.get("key2")).to be_nil
end
end
+
+ describe "#dump" do
+ it "returns nil for unknown key" do
+ expect(@client.exists("key1")).to be false
+ expect(@client.dump("key1")).to be nil
+ end
+
+ it "dumps a single known key successfully" do
+ @client.set("key1", "zomgwtf")
+
+ value = @client.dump("key1")
+ expect(value).not_to eq nil
+ expect(value).to be_a_kind_of(String)
+ end
+
+ it "errors with more than one argument" do
+ expect { @client.dump("key1", "key2") }.to raise_error(ArgumentError)
+ end
+ end
+
+ describe "#restore" do
+ it "errors with a missing payload" do
+ expect do
+ @client.restore("key1", 0, nil)
+ end.to raise_error(Redis::CommandError, "ERR DUMP payload version or checksum are wrong")
+ end
+
+ it "errors with an invalid payload" do
+ expect do
+ @client.restore("key1", 0, "zomgwtf not valid")
+ end.to raise_error(Redis::CommandError, "ERR DUMP payload version or checksum are wrong")
+ end
+
+ describe "with a dumped value" do
+ before do
+ @client.set("key1", "original value")
+ @dumped_value = @client.dump("key1")
+
+ @client.del("key1")
+ expect(@client.exists("key1")).to be false
+ end
+
+ it "restores to a new key successfully" do
+ response = @client.restore("key1", 0, @dumped_value)
+ expect(response).to eq "OK"
+ end
+
+ it "errors trying to restore to an existing key" do
+ @client.set("key1", "something else")
+
+ expect do
+ @client.restore("key1", 0, @dumped_value)
+ end.to raise_error(Redis::CommandError, "ERR Target key name is busy.")
+ end
+
+ it "restores successfully with a given expire time" do
+ @client.restore("key2", 2000, @dumped_value)
+
+ expect(@client.ttl("key2")).to eq 2
+ end
+
+ it "restores a list successfully" do
+ @client.lpush("key1", "val1")
+ @client.lpush("key1", "val2")
+
+ expect(@client.type("key1")).to eq "list"
+
+ dumped_value = @client.dump("key1")
+
+ response = @client.restore("key2", 0, dumped_value)
+ expect(response).to eq "OK"
+
+ expect(@client.type("key2")).to eq "list"
+ end
+
+ it "restores a set successfully" do
+ @client.sadd("key1", "val1")
+ @client.sadd("key1", "val2")
+
+ expect(@client.type("key1")).to eq "set"
+
+ dumped_value = @client.dump("key1")
+
+ response = @client.restore("key2", 0, dumped_value)
+ expect(response).to eq "OK"
+
+ expect(@client.type("key2")).to eq "set"
+ end
+ end
+ end
+
end
end