spec/bin_spec.rb in bin-0.6.3 vs spec/bin_spec.rb in bin-0.7.0

- old
+ new

@@ -1,15 +1,207 @@ require 'helper' -describe Bin do - it "autoloads Store" do - lambda { Bin::Store }.should_not raise_error(NameError) +describe ActiveSupport::Cache::Bin do + let(:collection) { DB['bin_cache'] } + let(:store) { ActiveSupport::Cache::Bin.new(collection) } + + it "has a collection" do + store.collection.should == collection end + + it "should also work with Bin::Store for backwards compat" do + Bin::Store.should == ActiveSupport::Cache::Bin + end - it "autoloads Compatibility" do - lambda { Bin::Compatibility }.should_not raise_error(NameError) + it "defaults expires_in to 1.year" do + store.expires_in.should == 1.year end - it "autoloads Version" do - lambda { Bin::Version }.should_not raise_error(NameError) + it "can set default expires_in" do + ActiveSupport::Cache::Bin.new(collection, :expires_in => 5.minutes).expires_in.should == 5.minutes + end + + describe "#write" do + before(:each) do + store.write('foo', 'bar') + end + let(:document) { collection.find_one(:_id => 'foo') } + + it "sets _id to key" do + document['_id'].should == 'foo' + end + + it "sets value key to value" do + store.read('foo').should == 'bar' + end + + it "should marshal value by default" do + document['value'].to_s.should == BSON::Binary.new(Marshal.dump('bar')).to_s + document['raw'].should be_false + end + + it "should be able to store in raw format" do + store.write('foo', 'bar', :raw => true) + document['value'].should == 'bar' + document['raw'].should be_true + end + + it "sets expires in to default if not provided" do + document['expires_at'].to_i.should == (Time.now.utc + 1.year).to_i + end + + it "sets expires_at if expires_in provided" do + store.write('foo', 'bar', :expires_in => 5.seconds) + document['expires_at'].to_i.should == (Time.now.utc + 5.seconds).to_i + end + + it "always sets key as string" do + store.write(:baz, 'wick') + doc = collection.find_one(:_id => 'baz') + doc.should_not be_nil + doc['_id'].should be_instance_of(String) + end + end + + describe "#read" do + before(:each) do + store.write('foo', 'bar') + end + let(:document) { collection.find_one(:_id => 'foo') } + + it "returns nil for key not found" do + store.read('non:existent:key').should be_nil + end + + it "returns unmarshalled value key value for key found" do + store.read('foo').should == 'bar' + end + + it "returns raw value if document raw key is true" do + store.write('foo', 'bar', :raw => true) + store.read('foo').should == 'bar' + end + + it "returns nil for existing but expired key" do + collection.save(:_id => 'foo', :value => 'bar', :expires_at => 5.seconds.ago) + store.read('foo').should be_nil + end + + it "return value for existing and not expired key" do + store.write('foo', 'bar', :expires_in => 20.seconds) + store.read('foo').should == 'bar' + end + + it "works with symbol" do + store.read(:foo).should == 'bar' + end + end + + describe "#delete" do + before(:each) do + store.write('foo', 'bar') + end + + it "delete key from cache" do + store.read('foo').should_not be_nil + store.delete('foo') + store.read('foo').should be_nil + end + + it "works with symbol" do + store.read(:foo).should_not be_nil + store.delete(:foo) + store.read(:foo).should be_nil + end + end + + describe "#delete_matched" do + before(:each) do + store.write('foo1', 'bar') + store.write('foo2', 'bar') + store.write('baz', 'wick') + end + + it "deletes matching keys" do + store.read('foo1').should_not be_nil + store.read('foo2').should_not be_nil + store.delete_matched(/foo/) + store.read('foo1').should be_nil + store.read('foo2').should be_nil + end + + it "does not delete unmatching keys" do + store.delete_matched('foo') + store.read('baz').should_not be_nil + end + end + + describe "#exist?" do + before(:each) do + store.write('foo', 'bar') + end + + it "returns true if key found" do + store.exist?('foo').should be_true + end + + it "returns false if key not found" do + store.exist?('not:found:key').should be_false + end + + it "works with symbol" do + store.exist?(:foo).should be_true + store.exist?(:notfoundkey).should be_false + end + end + + describe "#clear" do + before(:each) do + store.write('foo', 'bar') + store.write('baz', 'wick') + end + + it "clear all keys" do + collection.count.should == 2 + store.clear + collection.count.should == 0 + end + end + + describe "#increment" do + it "increment key by amount" do + store.increment('views', 1) + store.read('views').should == 1 + store.increment('views', 2) + store.read('views').should == 3 + end + + it "works with symbol" do + store.increment(:views, 2) + store.read(:views).should == 2 + end + end + + describe "#decrement" do + it "decrement key by amount" do + store.increment('views', 5) + store.decrement('views', 2) + store.read('views').should == 3 + store.decrement('views', 2) + store.read('views').should == 1 + end + + it "works with symbol" do + store.increment(:views, 2) + store.decrement(:views, 1) + store.read(:views).should == 1 + end + end + + describe "#stats" do + it "returns stats" do + %w[ns count size].each do |key| + store.stats.should have_key(key) + end + end end end \ No newline at end of file