fa29906900
* 'master' of git://github.com/jchris/couchrest:
all specs pass; refined attachment api
add mattetti's 5aebd53a93
fix rebase end balance
Started on the ExtendedDocument class with features moved to mixins.
Started on the ExtendedDocument class with features moved to mixins.
updated readme file
Started the refactoring work on couchrest.
added some monkey patches to improve the http connection speed. (by keeping the http connection open)
slight change of API, CR::Document now uses <action>_doc instead of <action>, also added #create! and #recreate! to Document instances
Added attachment methods to CouchRest::Document: #put_attachment, #fetch_attachment and #delete_attachment. Note you can overwrite exisitng attachments with #put_attachment.
- Added Database#delete_attachment, for removing them directly
documentation for Document#copy and #move, copied from Database
database replication methods, no conflict resolution provided
314 lines
8.8 KiB
Ruby
314 lines
8.8 KiB
Ruby
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
|
|
class Video < CouchRest::Document; end
|
|
|
|
describe CouchRest::Document do
|
|
|
|
before(:all) do
|
|
@couch = CouchRest.new
|
|
@db = @couch.database!(TESTDB)
|
|
end
|
|
|
|
describe "[]=" do
|
|
before(:each) do
|
|
@doc = CouchRest::Document.new
|
|
end
|
|
it "should work" do
|
|
@doc["enamel"].should == nil
|
|
@doc["enamel"] = "Strong"
|
|
@doc["enamel"].should == "Strong"
|
|
end
|
|
it "[]= should convert to string" do
|
|
@doc["enamel"].should == nil
|
|
@doc[:enamel] = "Strong"
|
|
@doc["enamel"].should == "Strong"
|
|
end
|
|
it "should read as a string" do
|
|
@doc[:enamel] = "Strong"
|
|
@doc[:enamel].should == "Strong"
|
|
end
|
|
end
|
|
|
|
describe "default database" do
|
|
before(:each) do
|
|
Video.use_database nil
|
|
end
|
|
it "should be set using use_database on the model" do
|
|
Video.new.database.should be_nil
|
|
Video.use_database @db
|
|
Video.new.database.should == @db
|
|
Video.use_database nil
|
|
end
|
|
|
|
it "should be overwritten by instance" do
|
|
db = @couch.database('test')
|
|
article = Video.new
|
|
article.database.should be_nil
|
|
article.database = db
|
|
article.database.should_not be_nil
|
|
article.database.should == db
|
|
end
|
|
end
|
|
|
|
describe "new" do
|
|
before(:each) do
|
|
@doc = CouchRest::Document.new("key" => [1,2,3], :more => "values")
|
|
end
|
|
it "should create itself from a Hash" do
|
|
@doc["key"].should == [1,2,3]
|
|
@doc["more"].should == "values"
|
|
end
|
|
it "should not have rev and id" do
|
|
@doc.rev.should be_nil
|
|
@doc.id.should be_nil
|
|
end
|
|
|
|
it "should freak out when saving without a database" do
|
|
lambda{@doc.save}.should raise_error(ArgumentError)
|
|
end
|
|
|
|
end
|
|
|
|
# move to database spec
|
|
describe "saving using a database" do
|
|
before(:all) do
|
|
@doc = CouchRest::Document.new("key" => [1,2,3], :more => "values")
|
|
@db = reset_test_db!
|
|
@resp = @db.save_doc(@doc)
|
|
end
|
|
it "should apply the database" do
|
|
@doc.database.should == @db
|
|
end
|
|
it "should get id and rev" do
|
|
@doc.id.should == @resp["id"]
|
|
@doc.rev.should == @resp["rev"]
|
|
end
|
|
end
|
|
|
|
describe "bulk saving" do
|
|
before :all do
|
|
@db = reset_test_db!
|
|
end
|
|
|
|
it "should use the document bulk save cache" do
|
|
doc = CouchRest::Document.new({"_id" => "bulkdoc", "val" => 3})
|
|
doc.database = @db
|
|
doc.save(true)
|
|
lambda { doc.database.get(doc["_id"]) }.should raise_error(RestClient::ResourceNotFound)
|
|
doc.database.bulk_save
|
|
doc.database.get(doc["_id"])["val"].should == doc["val"]
|
|
end
|
|
end
|
|
|
|
describe "getting from a database" do
|
|
before(:all) do
|
|
@db = reset_test_db!
|
|
@resp = @db.save_doc({
|
|
"key" => "value"
|
|
})
|
|
@doc = @db.get @resp['id']
|
|
end
|
|
it "should return a document" do
|
|
@doc.should be_an_instance_of(CouchRest::Document)
|
|
end
|
|
it "should have a database" do
|
|
@doc.database.should == @db
|
|
end
|
|
it "should be saveable and resavable" do
|
|
@doc["more"] = "keys"
|
|
@doc.save
|
|
@db.get(@resp['id'])["more"].should == "keys"
|
|
@doc["more"] = "these keys"
|
|
@doc.save
|
|
@db.get(@resp['id'])["more"].should == "these keys"
|
|
end
|
|
end
|
|
|
|
describe "destroying a document from a db" do
|
|
before(:all) do
|
|
@db = reset_test_db!
|
|
@resp = @db.save_doc({
|
|
"key" => "value"
|
|
})
|
|
@doc = @db.get @resp['id']
|
|
end
|
|
it "should make it disappear" do
|
|
@doc.destroy
|
|
lambda{@db.get @resp['id']}.should raise_error
|
|
end
|
|
it "should error when there's no db" do
|
|
@doc = CouchRest::Document.new("key" => [1,2,3], :more => "values")
|
|
lambda{@doc.destroy}.should raise_error(ArgumentError)
|
|
end
|
|
end
|
|
|
|
describe "bulk saving" do
|
|
before :all do
|
|
@db = reset_test_db!
|
|
end
|
|
|
|
describe "destroying a document from a db using bulk save" do
|
|
before(:all) do
|
|
@db = reset_test_db!
|
|
@resp = @db.save_doc({
|
|
"key" => "value"
|
|
})
|
|
@doc = @db.get @resp['id']
|
|
end
|
|
it "should defer actual deletion" do
|
|
@doc.destroy(true)
|
|
@doc['_id'].should == nil
|
|
@doc['_rev'].should == nil
|
|
lambda{@db.get @resp['id']}.should_not raise_error
|
|
@db.bulk_save
|
|
lambda{@db.get @resp['id']}.should raise_error
|
|
end
|
|
end
|
|
|
|
describe "copying a document" do
|
|
before :each do
|
|
@db = reset_test_db!
|
|
@resp = @db.save_doc({'key' => 'value'})
|
|
@docid = 'new-location'
|
|
@doc = @db.get(@resp['id'])
|
|
end
|
|
describe "to a new location" do
|
|
it "should work" do
|
|
@doc.copy @docid
|
|
newdoc = @db.get(@docid)
|
|
newdoc['key'].should == 'value'
|
|
end
|
|
it "should fail without a database" do
|
|
lambda{CouchRest::Document.new({"not"=>"a real doc"}).copy}.should raise_error(ArgumentError)
|
|
end
|
|
end
|
|
describe "to an existing location" do
|
|
before :each do
|
|
@db.save_doc({'_id' => @docid, 'will-exist' => 'here'})
|
|
end
|
|
it "should fail without a rev" do
|
|
lambda{@doc.copy @docid}.should raise_error(RestClient::RequestFailed)
|
|
end
|
|
it "should succeed with a rev" do
|
|
@to_be_overwritten = @db.get(@docid)
|
|
@doc.copy "#{@docid}?rev=#{@to_be_overwritten['_rev']}"
|
|
newdoc = @db.get(@docid)
|
|
newdoc['key'].should == 'value'
|
|
end
|
|
it "should succeed given the doc to overwrite" do
|
|
@to_be_overwritten = @db.get(@docid)
|
|
@doc.copy @to_be_overwritten
|
|
newdoc = @db.get(@docid)
|
|
newdoc['key'].should == 'value'
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "MOVE existing document" do
|
|
before :each do
|
|
@db = reset_test_db!
|
|
@resp = @db.save_doc({'key' => 'value'})
|
|
@docid = 'new-location'
|
|
@doc = @db.get(@resp['id'])
|
|
end
|
|
describe "to a new location" do
|
|
it "should work" do
|
|
@doc.move @docid
|
|
newdoc = @db.get(@docid)
|
|
newdoc['key'].should == 'value'
|
|
lambda {@db.get(@resp['id'])}.should raise_error(RestClient::ResourceNotFound)
|
|
end
|
|
it "should fail without a database" do
|
|
lambda{CouchRest::Document.new({"not"=>"a real doc"}).move}.should raise_error(ArgumentError)
|
|
lambda{CouchRest::Document.new({"_id"=>"not a real doc"}).move}.should raise_error(ArgumentError)
|
|
end
|
|
end
|
|
describe "to an existing location" do
|
|
before :each do
|
|
@db.save_doc({'_id' => @docid, 'will-exist' => 'here'})
|
|
end
|
|
it "should fail without a rev" do
|
|
lambda{@doc.move @docid}.should raise_error(RestClient::RequestFailed)
|
|
lambda{@db.get(@resp['id'])}.should_not raise_error
|
|
end
|
|
it "should succeed with a rev" do
|
|
@to_be_overwritten = @db.get(@docid)
|
|
@doc.move "#{@docid}?rev=#{@to_be_overwritten['_rev']}"
|
|
newdoc = @db.get(@docid)
|
|
newdoc['key'].should == 'value'
|
|
lambda {@db.get(@resp['id'])}.should raise_error(RestClient::ResourceNotFound)
|
|
end
|
|
it "should succeed given the doc to overwrite" do
|
|
@to_be_overwritten = @db.get(@docid)
|
|
@doc.move @to_be_overwritten
|
|
newdoc = @db.get(@docid)
|
|
newdoc['key'].should == 'value'
|
|
lambda {@db.get(@resp['id'])}.should raise_error(RestClient::ResourceNotFound)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "dealing with attachments" do
|
|
before do
|
|
@db = reset_test_db!
|
|
@attach = "<html><head><title>My Doc</title></head><body><p>Has words.</p></body></html>"
|
|
response = @db.save({'key' => 'value'})
|
|
@doc = @db.get(response['id'])
|
|
end
|
|
|
|
def append_attachment(name='test.html', attach=@attach)
|
|
@doc['_attachments'] ||= {}
|
|
@doc['_attachments'][name] = {
|
|
'type' => 'text/html',
|
|
'data' => attach
|
|
}
|
|
@doc.save
|
|
@rev = @doc['_rev']
|
|
end
|
|
|
|
describe "PUTing an attachment directly to the doc" do
|
|
before do
|
|
@doc.put_attachment('test.html', @attach)
|
|
end
|
|
|
|
it "is there" do
|
|
@db.fetch_attachment(@doc, 'test.html').should == @attach
|
|
end
|
|
|
|
it "updates the revision" do
|
|
@doc['_rev'].should_not == @rev
|
|
end
|
|
|
|
it "updates attachments" do
|
|
@attach2 = "<html><head><title>My Doc</title></head><body><p>Is Different.</p></body></html>"
|
|
@doc.put_attachment('test.html', @attach2)
|
|
@db.fetch_attachment(@doc, 'test.html').should == @attach2
|
|
end
|
|
end
|
|
|
|
describe "fetching an attachment from a doc directly" do
|
|
before do
|
|
append_attachment
|
|
end
|
|
|
|
it "pulls the attachment" do
|
|
@doc.fetch_attachment('test.html').should == @attach
|
|
end
|
|
end
|
|
|
|
describe "deleting an attachment from a doc directly" do
|
|
before do
|
|
append_attachment
|
|
@doc.delete_attachment('test.html')
|
|
end
|
|
|
|
it "removes it" do
|
|
lambda { @db.fetch_attachment(@doc, 'test.html').should }.should raise_error(RestClient::ResourceNotFound)
|
|
end
|
|
|
|
it "updates the revision" do
|
|
@doc['_rev'].should_not == @rev
|
|
end
|
|
end
|
|
|
|
end |