spec/toy/persistence_spec.rb in toystore-0.8.3 vs spec/toy/persistence_spec.rb in toystore-0.9.0

- old
+ new

@@ -5,48 +5,43 @@ let(:klass) do Class.new { include Toy::Store } end - describe ".store" do + describe ".adapter" do it "sets if arguments and reads if not" do - User.store(:memory, {}) - User.store.should == Adapter[:memory].new({}) + User.adapter(:memory, {}) + User.adapter.should == Adapter[:memory].new({}) end it "defaults options to empty hash" do Adapter[:memory].should_receive(:new).with({}, {}) - User.store(:memory, {}) + User.adapter(:memory, {}) end it "works with options" do Adapter[:memory].should_receive(:new).with({}, :something => true) - User.store(:memory, {}, :something => true) + User.adapter(:memory, {}, :something => true) end it "raises argument error if name provided but not client" do lambda do - klass.store(:memory) + klass.adapter(:memory) end.should raise_error(ArgumentError, 'Client is required') end - it "raises argument error if no name or client provided and has not been set" do - lambda do - klass.store - end.should raise_error(StandardError, 'No store has been set') + it "defaults to memory adapter if no name or client provided and has not been set" do + klass.adapter.should_not be_nil + klass.adapter.client.should eql({}) end - end - describe ".has_store?" do - it "returns true if store set" do - klass.store(:memory, {}) - klass.has_store?.should be_true + it "allows changing adapter even after use of default" do + hash = {} + klass.adapter + klass.adapter :memory, hash + klass.adapter.client.should equal(hash) end - - it "returns false if store not set" do - klass.has_store?.should be_false - end end describe ".create" do before do User.attribute :name, String @@ -54,11 +49,11 @@ @doc = User.create(:name => 'John', :age => 50) end let(:doc) { @doc } it "creates key in database with attributes" do - User.store.read(doc.id).should == { + User.adapter.read(doc.id).should == { 'name' => 'John', 'age' => 50, } end @@ -111,16 +106,65 @@ doc = User.create User.destroy("taco:bell:tacos") end end - describe "#store" do + describe "#adapter" do it "delegates to class" do - User.new.store.should equal(User.store) + User.new.adapter.should equal(User.adapter) end end + describe "declaring an attribute with an abbreviation" do + before do + User.attribute(:twitter_access_token, String, :abbr => 'tat') + end + + it "persists to adapter using abbreviation" do + user = User.create(:twitter_access_token => '1234') + raw = user.adapter.read(user.id) + raw['tat'].should == '1234' + raw.should_not have_key('twitter_access_token') + end + + it "loads from store correctly" do + user = User.create(:twitter_access_token => '1234') + user = User.get(user.id) + user.twitter_access_token.should == '1234' + user.tat.should == '1234' + end + end + + describe "#initialize_from_database" do + before do + User.attribute(:age, Integer, :default => 20) + @user = User.allocate + end + + it "sets new record to false" do + @user.initialize_from_database + @user.should_not be_new_record + end + + it "sets attributes" do + @user.initialize_from_database('age' => 21) + end + + it "sets defaults" do + @user.initialize_from_database + @user.age.should == 20 + end + + it "does not fail with nil" do + @user.initialize_from_database(nil).should == @user + end + + it "returns self" do + @user.initialize_from_database.should == @user + end + end + describe "#new_record?" do it "returns true if new" do User.new.should be_new_record end @@ -161,35 +205,35 @@ it "saves to key" do User.key?(@doc.id) end it "does not persist virtual attributes" do - @doc.store.read(@doc.id).should_not include('accepted_terms') + @doc.adapter.read(@doc.id).should_not include('accepted_terms') end end context "with existing record" do before do @doc = User.create(:name => 'John', :age => 28) @key = @doc.id - @value = User.store.read(@doc.id) + @value = User.adapter.read(@doc.id) @doc.name = 'Bill' @doc.accepted_terms = false @doc.save end let(:doc) { @doc } - it "stores in same key" do + it "does not change primary key" do doc.id.should == @key end - it "updates value in store" do - User.store.read(doc.id).should_not == @value + it "updates value in adapter" do + User.adapter.read(doc.id).should_not == @value end it "does not persist virtual attributes" do - @doc.store.read(@doc.id).should_not include('accepted_terms') + @doc.adapter.read(@doc.id).should_not include('accepted_terms') end it "updates the attributes in the instance" do doc.name.should == 'Bill' end @@ -209,19 +253,19 @@ User.get(user.id).name.should == 'Geoffrey' end end describe "#delete" do - it "should remove the instance from the store" do + it "should remove the instance" do doc = User.create doc.delete User.key?(doc.id).should be_false end end describe "#destroy" do - it "should remove the instance from the store" do + it "should remove the instance" do doc = User.create doc.destroy User.key?(doc.id).should be_false end end @@ -234,8 +278,22 @@ it "should be true if deleted" do doc = User.create doc.delete doc.should be_destroyed + end + end + + describe "#clone" do + it "returns instance that is a new_record" do + User.new.clone.should be_new_record + User.create.clone.should be_new_record + end + + it "is never destroyed" do + user = User.create + user.clone.should_not be_destroyed + user.destroy + user.clone.should_not be_destroyed end end end \ No newline at end of file