| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| // Specs for couch.js lines 1-130 |
| |
| describe 'CouchDB instance' |
| before_each |
| db = new CouchDB("spec_db", {"X-Couch-Full-Commit":"false"}); |
| end |
| |
| describe '.request' |
| before_each |
| db.createDb(); |
| end |
| |
| after_each |
| db.deleteDb(); |
| end |
| |
| it 'should return a XMLHttpRequest' |
| var req = db.request("GET", "/spec_db"); |
| req.should.include "readyState" |
| req.should.include "responseText" |
| req.should.include "statusText" |
| // in Safari a XMLHttpRequest is actually a XMLHttpRequestConstructor, |
| // otherwise we could just do: |
| // req.should.be_a XMLHttpRequest |
| end |
| |
| it 'should set the options the CouchDB instance has got as httpHeaders' |
| CouchDB.should.receive("request", "once").with_args("GET", "/spec_db", {headers: {"X-Couch-Full-Commit": "false"}}) |
| db.request("GET", "/spec_db"); |
| end |
| |
| it 'should pass through the options' |
| CouchDB.should.receive("request", "once").with_args("GET", "/spec_db", {"X-Couch-Persist": "true", headers: {"X-Couch-Full-Commit": "false"}}) |
| db.request("GET", "/spec_db", {"X-Couch-Persist":"true"}); |
| end |
| end |
| |
| describe '.createDb' |
| after_each |
| db.deleteDb(); |
| end |
| |
| it 'should create the db' |
| db.createDb(); |
| db.last_req.status.should.eql 201 |
| end |
| |
| it 'should return the ok true' |
| db.createDb().should.eql {"ok" : true} |
| end |
| |
| it 'should result in a created db' |
| db.createDb(); |
| try{ |
| db.createDb(); |
| } catch(e) { |
| e.error.should.eql "file_exists" |
| } |
| end |
| |
| it 'should have create a db with update sequence 0' |
| db.createDb(); |
| db.info().update_seq.should.eql 0 |
| end |
| end |
| |
| describe '.deleteDb' |
| before_each |
| db.createDb(); |
| end |
| |
| it 'should delete the db' |
| db.deleteDb(); |
| db.last_req.status.should.eql 200 |
| end |
| |
| it 'should return the responseText of the request' |
| db.deleteDb().should.eql {"ok" : true} |
| end |
| |
| it 'should result in a deleted db' |
| db.deleteDb(); |
| db.deleteDb(); |
| db.last_req.status.should.eql 404 |
| end |
| end |
| |
| describe 'document methods' |
| before_each |
| doc = {"Name" : "Kara Thrace", "Callsign" : "Starbuck"}; |
| db.createDb(); |
| end |
| |
| after_each |
| db.deleteDb(); |
| end |
| |
| describe '.save' |
| it 'should save the document' |
| db.save(doc); |
| db.last_req.status.should.eql 201 |
| end |
| |
| it 'should return ok true' |
| db.save(doc).ok.should.be_true |
| end |
| |
| it 'should return ID and revision of the document' |
| var response = db.save(doc); |
| response.id.should.be_a String |
| response.id.should.have_length 32 |
| response.rev.should.be_a String |
| response.rev.length.should.be_at_least 30 |
| end |
| |
| it 'should result in a saved document with generated ID' |
| var response = db.save(doc); |
| var saved_doc = db.open(response.id); |
| saved_doc.Name.should.eql "Kara Thrace" |
| saved_doc.Callsign.should.eql "Starbuck" |
| end |
| |
| it 'should save the document with the specified ID' |
| doc._id = "123"; |
| var response = db.save(doc); |
| response.id.should.eql "123" |
| end |
| |
| it 'should pass through the options' |
| doc._id = "123"; |
| CouchDB.should.receive("request", "once").with_args("PUT", "/spec_db/123?batch=ok") |
| db.save(doc, {"batch" : "ok"}); |
| end |
| end |
| |
| describe '.open' |
| before_each |
| doc._id = "123"; |
| db.save(doc); |
| end |
| |
| it 'should open the document' |
| db.open("123").should.eql doc |
| end |
| |
| it 'should return null when there is no document with the given ID' |
| db.open("non_existing").should.be_null |
| end |
| |
| it 'should pass through the options' |
| CouchDB.should.receive("request", "once").with_args("GET", "/spec_db/123?revs=true") |
| db.open("123", {"revs" : "true"}); |
| end |
| end |
| |
| describe '.deleteDoc' |
| before_each |
| doc._id = "123"; |
| saved_doc = db.save(doc); |
| delete_response = db.deleteDoc({_id : "123", _rev : saved_doc.rev}); |
| delete_last_req = db.last_req; |
| db.open("123"); |
| end |
| |
| it 'should send a successful request' |
| delete_last_req.status.should.eql 200 |
| end |
| |
| it 'should result in a deleted document' |
| db.open("123").should.be_null |
| end |
| |
| it 'should return ok true, the ID and the revision of the deleted document' |
| delete_response.ok.should.be_true |
| delete_response.id.should.eql "123" |
| delete_response.rev.should.be_a String |
| delete_response.rev.length.should.be_at_least 30 |
| end |
| |
| it 'should mark the document as deleted' |
| var responseText = db.request("GET", "/spec_db/123").responseText; |
| JSON.parse(responseText).should.eql {"error":"not_found","reason":"deleted"} |
| end |
| |
| it 'should record the revision in the deleted document' |
| var responseText = db.request("GET", "/spec_db/123?rev=" + delete_response.rev).responseText; |
| var deleted_doc = JSON.parse(responseText); |
| deleted_doc._rev.should.eql delete_response.rev |
| deleted_doc._id.should.eql delete_response.id |
| deleted_doc._deleted.should.be_true |
| end |
| end |
| |
| describe '.deleteDocAttachment' |
| before_each |
| doc._id = "123"; |
| doc._attachments = { |
| "friend.txt" : { |
| "content_type": "text\/plain", |
| // base64 encoded |
| "data": "TGVlIEFkYW1hIGlzIGEgZm9ybWVyIENvbG9uaWFsIEZsZWV0IFJlc2VydmUgb2ZmaWNlci4=" |
| } |
| }; |
| saved_doc = db.save(doc); |
| end |
| |
| it 'should be executed on a document with attachment' |
| db.open("123")._attachments.should.include "friend.txt" |
| db.open("123")._attachments["friend.txt"].stub.should.be_true |
| end |
| |
| describe 'after delete' |
| before_each |
| delete_response = db.deleteDocAttachment({_id : "123", _rev : saved_doc.rev}, "friend.txt"); |
| db.open("123"); |
| end |
| |
| it 'should send a successful request' |
| db.last_req.status.should.eql 200 |
| end |
| |
| it 'should leave the document untouched' |
| db.open("123").Callsign.should.eql "Starbuck" |
| end |
| |
| it 'should result in a deleted document attachment' |
| db.open("123").should.not.include "_attachments" |
| end |
| |
| it 'should record the revision in the document whose attachment has been deleted' |
| var responseText = db.request("GET", "/spec_db/123?rev=" + delete_response.rev).responseText; |
| var deleted_doc = JSON.parse(responseText); |
| deleted_doc._rev.should.eql delete_response.rev |
| deleted_doc._id.should.eql delete_response.id |
| end |
| |
| it 'should return ok true, the ID and the revision of the document whose attachment has been deleted' |
| delete_response.ok.should.be_true |
| delete_response.id.should.eql "123" |
| delete_response.should.have_property 'rev' |
| end |
| end |
| end |
| |
| describe '.bulkSave' |
| before_each |
| doc = {"Name" : "Kara Thrace", "Callsign" : "Starbuck"}; |
| doc2 = {"Name" : "Karl C. Agathon", "Callsign" : "Helo"}; |
| doc3 = {"Name" : "Sharon Valerii", "Callsign" : "Boomer"}; |
| docs = [doc, doc2, doc3]; |
| end |
| |
| it 'should save the documents' |
| db.bulkSave(docs); |
| db.last_req.status.should.eql 201 |
| end |
| |
| it 'should return ID and revision of the documents' |
| var response = db.bulkSave(docs); |
| response[0].id.should.be_a String |
| response[0].id.should.have_length 32 |
| response[0].rev.should.be_a String |
| response[0].rev.length.should.be_at_least 30 |
| response[1].id.should.be_a String |
| response[1].id.should.have_length 32 |
| response[1].rev.should.be_a String |
| response[1].rev.length.should.be_at_least 30 |
| response[2].id.should.be_a String |
| response[2].id.should.have_length 32 |
| response[2].rev.should.be_a String |
| response[2].rev.length.should.be_at_least 30 |
| end |
| |
| it 'should result in saved documents' |
| var response = db.bulkSave(docs); |
| db.open(response[0].id).Name.should.eql "Kara Thrace" |
| db.open(response[1].id).Name.should.eql "Karl C. Agathon" |
| db.open(response[2].id).Name.should.eql "Sharon Valerii" |
| end |
| |
| it 'should save the document with specified IDs' |
| doc._id = "123"; |
| doc2._id = "456"; |
| docs = [doc, doc2, doc3]; |
| var response = db.bulkSave(docs); |
| response[0].id.should.eql "123" |
| response[1].id.should.eql "456" |
| response[2].id.should.have_length 32 |
| end |
| |
| it 'should pass through the options' |
| doc._id = "123"; |
| docs = [doc]; |
| CouchDB.should.receive("request", "once").with_args("POST", "/spec_db/_bulk_docs", {body: '{"docs":[{"Name":"Kara Thrace","Callsign":"Starbuck","_id":"123"}],"batch":"ok"}'}) |
| db.bulkSave(docs, {"batch" : "ok"}); |
| end |
| end |
| end |
| end |