// 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 300-411 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 'removeDoc' before_each doc = {"Name" : "Louanne Katraine", "Callsign" : "Kat", "_id" : "345"}; saved_doc = {}; db.saveDoc(doc, { success: function(resp){ saved_doc = resp; }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should result in a deleted document' db.removeDoc({_id : "345", _rev : saved_doc.rev}, { success: function(resp){ db.openDoc("345", { error: function(status, error, reason){ status.should.eql 404 error.should.eql "not_found" reason.should.eql "deleted" }, success: function(resp){successCallback(resp)} }); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return ok true, the ID and the revision of the deleted document' db.removeDoc({_id : "345", _rev : saved_doc.rev}, { success: function(resp){ resp.ok.should.be_true resp.id.should.eql "345" 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 record the revision in the deleted document' db.removeDoc({_id : "345", _rev : saved_doc.rev}, { success: function(resp){ db.openDoc("345", { rev: resp.rev, success: function(resp2){ resp2._rev.should.eql resp.rev resp2._id.should.eql resp.id resp2._deleted.should.be_true }, error: function(status, error, reason){errorCallback(status, error, reason)} }); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should alert with an error message prefix' db.removeDoc({_id: "asdf"}); alert_msg.should.match /The document could not be deleted/ end end describe 'bulkRemove' before_each doc = {"Name" : "Kara Thrace", "Callsign" : "Starbuck", "_id" : "123"}; doc2 = {"Name" : "Karl C. Agathon", "Callsign" : "Helo", "_id" : "456"}; doc3 = {"Name" : "Sharon Valerii", "Callsign" : "Boomer", "_id" : "789"}; docs = [doc, doc2, doc3]; db.bulkSave({"docs": docs}, { success: function(resp){ for (var i = 0; i < docs.length; i++) { docs[i]._rev = resp[i].rev; } }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should remove all documents specified' db.bulkRemove({"docs": docs}); db.allDocs({ success: function(resp) { resp.total_rows.should.eql 0 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should not remove documents that should not have been deleted' db.bulkRemove({"docs": [doc3]}); db.allDocs({ success: function(resp) { resp.total_rows.should.eql 2 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should result in deleted documents' db.bulkRemove({"docs": docs}, { success: function(resp){ db.openDoc("123", { error: function(status, error, reason){ status.should.eql 404 error.should.eql "not_found" reason.should.eql "deleted" }, success: function(resp){successCallback(resp)} }); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return the ID and the revision of the deleted documents' db.bulkRemove({"docs": docs}, { success: function(resp){ resp[0].id.should.eql "123" resp[0].rev.should.be_a String resp[0].rev.length.should.be_at_least 30 resp[1].id.should.eql "456" resp[1].rev.should.be_a String resp[1].rev.length.should.be_at_least 30 resp[2].id.should.eql "789" 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 record the revision in the deleted documents' db.bulkRemove({"docs": docs}, { success: function(resp){ db.openDoc("123", { rev: resp[0].rev, success: function(resp2){ resp2._rev.should.eql resp[0].rev resp2._id.should.eql resp[0].id resp2._deleted.should.be_true }, error: function(status, error, reason){errorCallback(status, error, reason)} }); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should alert with an error message prefix' db.bulkRemove({docs: ["asdf"]}); alert_msg.should.match /The documents could not be deleted/ end end describe 'copyDoc' before_each doc = {"Name" : "Sharon Agathon", "Callsign" : "Athena", "_id" : "123"}; db.saveDoc(doc); end it 'should result in another document with same data and new id' db.copyDoc("123", { success: function(resp){ resp.id.should.eql "456" resp.rev.length.should.be_at_least 30 }, error: function(status, error, reason){errorCallback(status, error, reason)} }, { headers: {"Destination":"456"} }); db.openDoc("456", { success: function(resp){ resp.Name.should.eql "Sharon Agathon" resp.Callsign.should.eql "Athena" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should throw an error when trying to overwrite a document without providing a revision' doc2 = {"Name" : "Louanne Katraine", "Callsign" : "Kat", "_id" : "456"}; db.saveDoc(doc2); db.copyDoc("123", { error: function(status, error, reason){ status.should.eql 409 error.should.eql "conflict" reason.should.eql "Document update conflict." }, success: function(resp){successCallback(resp)} }, { headers: {"Destination":"456"} }); end it 'should overwrite a document with the correct revision' doc2 = {"Name" : "Louanne Katraine", "Callsign" : "Kat", "_id" : "456"}; var doc2_rev; db.saveDoc(doc2, { success: function(resp){ doc2_rev = resp.rev; } }); db.copyDoc("123", { success: function(resp){ resp.id.should.eql "456" resp.rev.length.should.be_at_least 30 }, error: function(status, error, reason){errorCallback(status, error, reason)} }, { headers: {"Destination":"456?rev=" + doc2_rev} }); db.openDoc("456", { success: function(resp){ resp.Name.should.eql "Sharon Agathon" resp.Callsign.should.eql "Athena" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should alert with an error message prefix' db.copyDoc("asdf", {}, {}); alert_msg.should.match /The document could not be copied/ end end describe 'query' before_each db.saveDoc({"Name" : "Cally Tyrol", "job" : "deckhand", "_id" : "789"}); db.saveDoc({"Name" : "Felix Gaeta", "job" : "officer", "_id" : "123"}); db.saveDoc({"Name" : "Samuel T. Anders", "job" : "pilot", "_id" : "456"}); map_function = "function(doc) { emit(doc._id, 1); }"; reduce_function = "function(key, values, rereduce) { return sum(values); }"; end it 'should apply the map function' db.query(map_function, null, null, { success: function(resp){ resp.rows.should.have_length 3 resp.rows[0].id.should.eql "123" resp.rows[0].key.should.eql "123" resp.rows[0].value.should.eql 1 resp.rows[1].id.should.eql "456" resp.rows[1].key.should.eql "456" resp.rows[1].value.should.eql 1 resp.rows[2].id.should.eql "789" resp.rows[2].key.should.eql "789" resp.rows[2].value.should.eql 1 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should apply the reduce function' db.query(map_function, reduce_function, null, { success: function(resp){ resp.rows.should.have_length 1 resp.rows[0].key.should.be_null resp.rows[0].value.should_eql 3 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through the options' db.query(map_function, null, null, { "startkey": "456", success: function(resp){ resp.rows.should.have_length 2 resp.rows[0].id.should.eql "456" resp.rows[0].key.should.eql "456" resp.rows[0].value.should.eql 1 resp.rows[1].id.should.eql "789" resp.rows[1].key.should.eql "789" resp.rows[1].value.should.eql 1 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through the keys' //shouldn't this better work? TODO: implement in jquery.couch.js console.log("shouldn't this better work? TODO: implement in jquery.couch.js") db.query(map_function, null, null, { "keys": ["456", "123"], success: function(resp){ resp.rows.should.have_length 2 resp.rows[0].id.should.eql "456" resp.rows[0].key.should.eql "456" resp.rows[0].value.should.eql 1 resp.rows[1].id.should.eql "123" resp.rows[1].key.should.eql "123" resp.rows[1].value.should.eql 1 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through the options and the keys' //shouldn't this better work? TODO: implement in jquery.couch.js console.log("shouldn't this better work? TODO: implement in jquery.couch.js") db.query(map_function, null, null, { "include_docs":"true", "keys": ["456"], success: function(resp){ resp.rows.should.have_length 1 resp.rows[0].id.should.eql "456" resp.rows[0].key.should.eql "456" resp.rows[0].value.should.eql 1 resp.rows[0].doc["job"].should.eql "pilot" resp.rows[0].doc["_rev"].length.should.be_at_least 30 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should apply a query in erlang also' // when this test fails, read this: http://wiki.apache.org/couchdb/EnableErlangViews var erlang_map = 'fun({Doc}) -> ' + 'ID = proplists:get_value(<<"_id">>, Doc, null), ' + 'Emit(ID, 1) ' + 'end.'; db.query(erlang_map, null, "erlang", { success: function(resp){ resp.rows.should.have_length 3 resp.rows[0].id.should.eql "123" resp.rows[0].key.should.eql "123" resp.rows[0].value.should.eql 1 resp.rows[1].id.should.eql "456" resp.rows[1].key.should.eql "456" resp.rows[1].value.should.eql 1 resp.rows[2].id.should.eql "789" resp.rows[2].key.should.eql "789" resp.rows[2].value.should.eql 1 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should alert with an error message prefix' db.query("asdf"); alert_msg.should.match /An error occurred querying the database/ end end describe 'view' before_each db.saveDoc({"Name" : "Cally Tyrol", "job" : "deckhand", "_id" : "789"}); db.saveDoc({"Name" : "Felix Gaeta", "job" : "officer", "_id" : "123"}); db.saveDoc({"Name" : "Samuel T. Anders", "job" : "pilot", "_id" : "456"}); view = { "views" : { "people" : { "map" : "function(doc) { emit(doc._id, doc.Name); }" } }, "_id" : "_design/spec_db" }; db.saveDoc(view); end it 'should apply the view' db.view('spec_db/people', { success: function(resp){ resp.rows.should.have_length 3 resp.rows[0].id.should.eql "123" resp.rows[0].key.should.eql "123" resp.rows[0].value.should.eql "Felix Gaeta" resp.rows[1].id.should.eql "456" resp.rows[1].key.should.eql "456" resp.rows[1].value.should.eql "Samuel T. Anders" resp.rows[2].id.should.eql "789" resp.rows[2].key.should.eql "789" resp.rows[2].value.should.eql "Cally Tyrol" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through the options' db.view('spec_db/people', { "skip":"2", success: function(resp){ resp.rows.should.have_length 1 resp.rows[0].id.should.eql "789" resp.rows[0].key.should.eql "789" resp.rows[0].value.should.eql "Cally Tyrol" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through the keys' db.view('spec_db/people', { "keys":["456", "123"], success: function(resp){ resp.rows.should.have_length 2 resp.rows[0].id.should.eql "456" resp.rows[0].key.should.eql "456" resp.rows[0].value.should.eql "Samuel T. Anders" resp.rows[1].id.should.eql "123" resp.rows[1].key.should.eql "123" resp.rows[1].value.should.eql "Felix Gaeta" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through the options and the keys' db.view('spec_db/people', { "include_docs":"true", "keys":["456"], success: function(resp){ resp.rows.should.have_length 1 resp.rows[0].id.should.eql "456" resp.rows[0].key.should.eql "456" resp.rows[0].value.should.eql "Samuel T. Anders" resp.rows[0].doc["job"].should.eql "pilot" resp.rows[0].doc["_rev"].length.should.be_at_least 30 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should throw a 404 when the view doesnt exist' db.view('spec_db/non_existing_view', { error: function(status, error, reason){ status.should.eql 404 error.should.eql "not_found" reason.should.eql "missing_named_view" }, success: function(resp){successCallback(resp)} }); end it 'should alert with an error message prefix' db.view("asdf"); alert_msg.should.match /An error occurred accessing the view/ end end describe 'setDbProperty' it 'should return ok true' db.setDbProperty("_revs_limit", 1500, { success: function(resp){ resp.ok.should.be_true }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should set a db property' db.setDbProperty("_revs_limit", 1500); db.getDbProperty("_revs_limit", { success: function(resp){ resp.should.eql 1500 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); db.setDbProperty("_revs_limit", 1200); db.getDbProperty("_revs_limit", { success: function(resp){ resp.should.eql 1200 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should alert with an error message prefix' db.setDbProperty("asdf"); alert_msg.should.match /The property could not be updated/ end end describe 'getDbProperty' it 'should get a db property' db.setDbProperty("_revs_limit", 1200); db.getDbProperty("_revs_limit", { success: function(resp){ resp.should.eql 1200 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should throw a 404 when the property doesnt exist' db.getDbProperty("_doesnt_exist", { 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 alert with an error message prefix' db.getDbProperty("asdf"); alert_msg.should.match /The property could not be retrieved/ end end end