added Response and Database classes
[couchobject.git] / spec / persistable_spec.rb
blobfea4b944253bb5a7a775dc666771d8e6ada859dc
1 require File.dirname(__FILE__) + '/spec_helper.rb'
3 class Bike
4   include CouchObject::Persistable
5   
6   def initialize
7     @wheels = 2
8   end
9   
10   def to_couch
11     {:wheels => @wheels}
12   end
13 end
15 describe CouchObject::Persistable, "when mixed into a Class" do
16   before(:each) do
17     @bike = Bike.new
18     @db = mock("mock db")
19     
20     @empty_response = mock("couch response")
21     @empty_response.stub!(:code).and_return(200)
22     @empty_response.stub!(:body).and_return("{}")
23     
24     @response = mock("couch response")
25     @response.stub!(:body).and_return("{\"ok\":true, \"_id\":\"123BAC\", \"_rev\":\"946B7D1C\"}")
26     @response.stub!(:code).and_return(200)
27     
28     @document_response = mock("couch response")
29     @document_response.stub!(:body).and_return("{\"title\":\"My Document\", \"_id\":\"123BAC\", \"_rev\":\"946B7D1C\"}")
30     @document_response.stub!(:code).and_return(200)
31   end
32   
33   it "should give the class a save method that saves the object" do
34     CouchObject::Database.should_receive(:new).and_return(@db)
35     @db.should_receive(:post).with("", @bike.to_json).and_return(@empty_response)
36     @bike.save("foo")
37   end
38   
39   it "should raise if no to_couch on class" do
40     klass = Class.new{ include CouchObject::Persistable }
41     proc{ klass.new.to_json }.should raise_error(CouchObject::Persistable::NoToCouchMethodError)
42   end
43   
44   it "should return the doc id on successfull save" do
45     CouchObject::Database.should_receive(:new).and_return(@db)
46     @db.should_receive(:post).with("", @bike.to_json).and_return(@response)
47     @bike.save("foo")["_id"].should == "123BAC"
48   end  
49   
50   it "should assign the returned id to itself on successful save" do
51     CouchObject::Database.should_receive(:new).and_return(@db)
52     @db.should_receive(:post).with("", @bike.to_json).and_return(@response)
53     @bike.save("foo")
54     @bike.id.should == "123BAC"
55   end
56   
57   it "should know if itself is a new object" do
58     CouchObject::Database.should_receive(:new).and_return(@db)
59     @db.should_receive(:post).with("", @bike.to_json).and_return(@response)
60     @bike.new?.should == true
61     @bike.save("foo")
62     @bike.new?.should == false
63   end
64   
65   it "should get document by id" do
66     CouchObject::Database.should_receive(:new).and_return(@db)
67     @db.should_receive(:get).with("123BAC").and_return(@document_response)
68     Bike.get_by_id("foo", "123BAC")["title"].should == "My Document"
69   end
70 end