blob: 8f35affa178f2ccc7732dc8d17a25cd66bbf0150 [file] [log] [blame]
// 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 jquery_couch.js lines 210-299
describe 'jQuery couchdb db'
before
stubAlert();
end
after
destubAlert();
end
before_each
db = $.couch.db('spec_db');
db.create();
end
after_each
db.drop();
end
describe 'info'
before_each
result = {};
db.info({
success: function(resp) { result = resp; },
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should return the name of the database'
result.db_name.should.eql "spec_db"
end
it 'should return the number of documents'
result.doc_count.should.eql 0
end
it 'should return the start time of the db instance'
result.instance_start_time.should.have_length 16
end
end
describe 'allDocs'
it 'should return no docs when there arent any'
db.allDocs({
success: function(resp) {
resp.total_rows.should.eql 0
resp.rows.should.eql []
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
describe 'with docs'
before_each
db.saveDoc({"Name" : "Felix Gaeta", "_id" : "123"});
db.saveDoc({"Name" : "Samuel T. Anders", "_id" : "456"});
end
it 'should return all docs'
db.allDocs({
success: function(resp) {
resp.total_rows.should.eql 2
resp.rows.should.have_length 2
resp.rows[0].id.should.eql "123"
resp.rows[0].key.should.eql "123"
resp.rows[0].value.rev.length.should.be_at_least 30
resp.rows[1].id.should.eql "456"
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should pass through the options'
db.allDocs({
"startkey": "123",
"limit": "1",
success: function(resp) {
resp.rows.should.have_length 1
resp.rows[0].id.should.eql "123"
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
end
end
describe 'allDesignDocs'
it 'should return nothing when there arent any design docs'
db.saveDoc({"Name" : "Felix Gaeta", "_id" : "123"});
db.allDesignDocs({
success: function(resp) {
resp.rows.should.eql []
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should return all design docs'
var designDoc = {
"views" : {
"people" : {
"map" : "function(doc) { emit(doc._id, doc); }"
}
},
"_id" : "_design/spec_db"
};
db.saveDoc(designDoc);
db.saveDoc({"Name" : "Felix Gaeta", "_id" : "123"});
db.allDesignDocs({
success: function(resp) {
resp.total_rows.should.eql 2
resp.rows.should.have_length 1
resp.rows[0].id.should.eql "_design/spec_db"
resp.rows[0].key.should.eql "_design/spec_db"
resp.rows[0].value.rev.length.should.be_at_least 30
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
end
describe 'allApps'
it 'should provide a custom function with appName, appPath and design document when there is an attachment with index.html'
var designDoc = {"_id" : "_design/with_attachments"};
designDoc._attachments = {
"index.html" : {
"content_type": "text\/html",
// this is "<html><p>Hi, here is index!</p></html>", base64 encoded
"data": "PGh0bWw+PHA+SGksIGhlcmUgaXMgaW5kZXghPC9wPjwvaHRtbD4="
}
};
db.saveDoc(designDoc);
db.allApps({
eachApp: function(appName, appPath, ddoc) {
appName.should.eql "with_attachments"
appPath.should.eql "/spec_db/_design/with_attachments/index.html"
ddoc._id.should.eql "_design/with_attachments"
ddoc._attachments["index.html"].content_type.should.eql "text/html"
ddoc._attachments["index.html"].length.should.eql "<html><p>Hi, here is index!</p></html>".length
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should provide a custom function with appName, appPath and design document when there is a couchapp with index file'
var designDoc = {"_id" : "_design/with_index"};
designDoc.couchapp = {
"index" : "cylon"
};
db.saveDoc(designDoc);
db.allApps({
eachApp: function(appName, appPath, ddoc) {
appName.should.eql "with_index"
appPath.should.eql "/spec_db/_design/with_index/cylon"
ddoc._id.should.eql "_design/with_index"
ddoc.couchapp.index.should.eql "cylon"
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should not call the eachApp function when there is neither index.html in _attachments nor a couchapp index file'
var designDoc = {"_id" : "_design/nothing"};
db.saveDoc(designDoc);
var eachApp_called = false;
db.allApps({
eachApp: function(appName, appPath, ddoc) {
eachApp_called = true;
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
eachApp_called.should.be_false
end
it 'should alert with an error message prefix'
db.allApps();
alert_msg.should.match /Please provide an eachApp function for allApps()/
end
end
describe 'openDoc'
before_each
doc = {"Name" : "Louanne Katraine", "Callsign" : "Kat", "_id" : "123"};
db.saveDoc(doc);
end
it 'should open the document'
db.openDoc("123", {
success: function(resp){
resp.should.eql doc
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should raise a 404 error when there is no document with the given ID'
db.openDoc("non_existing", {
error: function(status, error, reason){
status.should.eql 404
error.should.eql "not_found"
reason.should.eql "missing"
},
success: function(resp){successCallback(resp)}
});
end
it 'should pass through the options'
doc.Name = "Sasha";
db.saveDoc(doc);
db.openDoc("123", {
revs: true,
success: function(resp){
resp._revisions.start.should.eql 2
resp._revisions.ids.should.have_length 2
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should alert with an error message prefix'
db.openDoc("asdf");
alert_msg.should.match /The document could not be retrieved/
end
end
describe 'saveDoc'
before_each
doc = {"Name" : "Kara Thrace", "Callsign" : "Starbuck"};
end
it 'should save the document'
db.saveDoc(doc, {
success: function(resp, status){
status.should.eql 201
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should return ok true'
db.saveDoc(doc, {
success: function(resp, status){
resp.ok.should.be_true
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should return ID and revision of the document'
db.saveDoc(doc, {
success: function(resp, status){
resp.id.should.be_a String
resp.id.should.have_length 32
resp.rev.should.be_a String
resp.rev.length.should.be_at_least 30
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should result in a saved document with generated ID'
db.saveDoc(doc, {
success: function(resp, status){
db.openDoc(resp.id, {
success: function(resp2){
resp2.Name.should.eql "Kara Thrace"
resp2.Callsign.should.eql "Starbuck"
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should save the document with the specified ID'
doc._id = "123";
db.saveDoc(doc, {
success: function(resp, status){
resp.id.should.eql "123"
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should pass through the options'
db.saveDoc(doc, {
"batch" : "ok",
success: function(resp, status){
// when using batch ok, couch sends a 202 status immediately
status.should.eql 202
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should alert with an error message prefix'
db.saveDoc("asdf");
alert_msg.should.match /The document could not be saved/
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 all documents'
db.bulkSave({"docs": docs});
db.allDocs({
success: function(resp) {
resp.total_rows.should.eql 3
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should result in saved documents'
doc3._id = "789";
db.bulkSave({"docs": [doc3]});
db.openDoc("789", {
success: function(resp){
resp.Name.should.eql "Sharon Valerii"
resp.Callsign.should.eql "Boomer"
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should return ID and revision of the documents'
db.bulkSave({"docs": docs},{
success: function(resp){
resp[0].id.should.be_a String
resp[0].id.should.have_length 32
resp[0].rev.should.be_a String
resp[0].rev.length.should.be_at_least 30
resp[1].id.should.be_a String
resp[1].id.should.have_length 32
resp[1].rev.should.be_a String
resp[1].rev.length.should.be_at_least 30
resp[2].id.should.be_a String
resp[2].id.should.have_length 32
resp[2].rev.should.be_a String
resp[2].rev.length.should.be_at_least 30
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should save the document with specified IDs'
doc._id = "123";
doc2._id = "456";
docs = [doc, doc2, doc3];
db.bulkSave({"docs": docs},{
success: function(resp){
resp[0].id.should.eql "123"
resp[1].id.should.eql "456"
resp[2].id.should.have_length 32
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should pass through the options'
// a lengthy way to test that a conflict can't be created with the
// all_or_nothing option set to false, but can be when it's true.
var old_doc = {"Name" : "Louanne Katraine", "Callsign" : "Kat", "_id" : "123"};
db.saveDoc(old_doc, {
success: function(resp){
old_doc._rev = resp.rev;
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
var new_doc = {"Name" : "Sasha", "Callsign" : "Kat", "_id" : "123"};
db.bulkSave({"docs": [new_doc], "all_or_nothing": false}, {
success: function(resp){
resp[0].id.should.eql "123"
resp[0].error.should.eql "conflict"
resp[0].reason.should.eql "Document update conflict."
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
db.bulkSave({"docs": [new_doc], "all_or_nothing": true}, {
success: function(resp){
resp[0].id.should.eql "123"
resp[0].rev.should.not.eql old_doc._rev
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
db.openDoc("123", {
"conflicts": true,
success: function(resp){
resp._conflicts[0].should.eql old_doc._rev
},
error: function(status, error, reason){errorCallback(status, error, reason)}
});
end
it 'should alert with an error message prefix'
db.bulkSave("asdf");
alert_msg.should.match /The documents could not be saved/
end
end
end