// 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 48-156 and 415-448 describe 'jQuery couchdb' before stubAlert(); end after destubAlert(); end describe 'activeTasks' before_each db = $.couch.db("spec_db"); db.create(); end after_each db.drop(); end it 'should return an empty array when there are no active tasks' $.couch.activeTasks({ success: function(resp){ resp.should.eql [] }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return an active task' // doing a bit of stuff here so compaction has something to do and takes a while var battlestar, civillian; db.saveDoc({"type":"Battlestar", "name":"Galactica"}, { success: function(resp){ db.openDoc(resp.id, { success: function(resp2){ battlestar = resp2; }, error: function(status, error, reason){errorCallback(status, error, reason)} }); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); battlestar.name = "Pegasus"; db.saveDoc(battlestar); db.saveDoc({"type":"Civillian", "name":"Cloud 9"}, { success: function(resp){ db.openDoc(resp.id, { success: function(resp2){ civillian = resp2; }, error: function(status, error, reason){errorCallback(status, error, reason)} }); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); civillian.name = "Olympic Carrier"; db.saveDoc(civillian); db.removeDoc(civillian); db.compact({ ajaxStart: function(resp){ $.couch.activeTasks({ success: function(resp2){ resp2[0].type.should.eql "Database Compaction" resp2[0].task.should.eql "spec_db" resp2[0].should.have_prop "status" resp2[0].should.include "pid" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); } }); end end describe 'allDbs' it 'should return an array that includes a created database' temp_db = new CouchDB("temp_spec_db", {"X-Couch-Full-Commit":"false"}); temp_db.createDb(); $.couch.allDbs({ success: function(resp){ resp.should.include "temp_spec_db" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); temp_db.deleteDb(); end it 'should return an array that does not include a database that does not exist' $.couch.allDbs({ success: function(resp){ resp.should.not.include("not_existing_temp_spec_db"); }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end end describe 'config' it 'should get the config settings' $.couch.config({ success: function(resp){ resp.httpd.port.should.eql window.location.port resp.stats.samples.should.match /\[.*\]/ resp.native_query_servers.should.have_prop "erlang" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should get a specific config setting' $.couch.config({ success: function(resp){ parseInt(resp.max_document_size).should.be_a Number resp.delayed_commits.should.be_a String resp.database_dir.should.be_a String }, error: function(status, error, reason){errorCallback(status, error, reason)} }, "couchdb"); end it 'should update a config setting' $.couch.config({ success: function(resp){ resp.should.eql "" }, error: function(status, error, reason){errorCallback(status, error, reason)} }, "test", "colony", "Caprica"); $.couch.config({ success: function(resp){ resp.colony.should.eql "Caprica" }, error: function(status, error, reason){errorCallback(status, error, reason)} }, "test"); $.couch.config({}, "test", "colony", null); end it 'should delete a config setting' $.couch.config({}, "test", "colony", "Caprica"); $.couch.config({ success: function(resp){ resp.should.eql "Caprica" }, error: function(status, error, reason){errorCallback(status, error, reason)} }, "test", "colony", null); $.couch.config({ success: function(resp){ resp.should.eql {} }, error: function(status, error, reason){errorCallback(status, error, reason)} }, "test"); end it 'should alert with an error message prefix' $.couch.config("asdf", "asdf", "asdf"); alert_msg.should.match /An error occurred retrieving\/updating the server configuration/ end end describe 'session' it 'should return information about the session' $.couch.session({ success: function(resp){ resp.info.should.have_prop 'authentication_db' resp.userCtx.should.include 'name' resp.userCtx.roles.should.be_an Array }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end end describe 'userDb' it 'should return the userDb' var authentication_db; $.couch.session({ success: function(resp){ authentication_db = resp.info.authentication_db; }, error: function(status, error, reason){errorCallback(status, error, reason)} }); $.couch.userDb(function(resp){ resp.name.should.eql authentication_db }); end it 'should return a db instance' $.couch.userDb(function(resp){ resp.should.respond_to 'allDocs' resp.should.respond_to 'bulkSave' }); end end describe 'user_db stuff' before useTestUserDb(); end after useOldUserDb(); end describe 'signup' it 'should return a saved user' $.couch.signup( {name: "Tom Zarek"}, "secretpass", { success: function(resp){ resp.id.should.eql "org.couchdb.user:Tom Zarek" resp.rev.length.should.be_at_least 30 resp.ok.should.be_true users_db.deleteDoc({_id : resp.id, _rev : resp.rev}) }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should create a userDoc in the user db' $.couch.signup( {name: "Tom Zarek"}, "secretpass", { success: function(resp){ var user = users_db.open(resp.id); user.name.should.eql "Tom Zarek" user._id.should.eql "org.couchdb.user:Tom Zarek" user.roles.should.eql [] user.password_sha.length.should.be_at_least 30 user.password_sha.should.be_a String users_db.deleteDoc({_id : resp.id, _rev : resp.rev}) }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should create a userDoc with roles when specified' $.couch.signup( {name: "Tom Zarek", roles: ["vice_president", "activist"]}, "secretpass", { success: function(resp){ var user = users_db.open(resp.id); user.roles.should.eql ["vice_president", "activist"] users_db.deleteDoc({_id : resp.id, _rev : resp.rev}) }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end end describe 'login' before_each user = {}; $.couch.signup({name: "Tom Zarek", roles: ["vice_president", "activist"]}, "secretpass", { success: function(resp){ user.id = resp.id; user.rev = resp.rev; }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end after_each users_db.deleteDoc({_id : user.id, _rev : user.rev}) end it 'should return the logged in user' $.couch.login({ name: "Tom Zarek", password: "secretpass", success: function(resp){ resp.name.should.eql "Tom Zarek" resp.ok.should.be_true resp.roles.should.eql ["vice_president", "activist"] }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should result in a session for the logged in user' $.couch.login({ name: "Tom Zarek", password: "secretpass" }); $.couch.session({ success: function(resp){ resp.info.authentication_db.should.eql "spec_users_db" resp.userCtx.name.should.eql "Tom Zarek" resp.userCtx.roles.should.eql ["vice_president", "activist"] }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return a 404 when password is wrong' $.couch.login({ name: "Tom Zarek", password: "wrongpass", error: function(status, error, reason){ status.should.eql 401 error.should.eql "unauthorized" reason.should.eql "Name or password is incorrect." }, success: function(resp){successCallback(resp)} }); end it 'should return a 404 when the user doesnt exist in the users db' $.couch.login({ name: "Number Three", password: "secretpass", error: function(status, error, reason){ status.should.eql 401 error.should.eql "unauthorized" reason.should.eql "Name or password is incorrect." }, success: function(resp){successCallback(resp)} }); end it 'should alert with an error message prefix' $.couch.login("asdf"); alert_msg.should.match /An error occurred logging in/ end end describe 'logout' before_each user = {}; $.couch.signup({name: "Tom Zarek", roles: ["vice_president", "activist"]}, "secretpass", { success: function(resp){ user.id = resp.id; user.rev = resp.rev; }, error: function(status, error, reason){errorCallback(status, error, reason)} }); $.couch.login({name: "Tom Zarek", password: "secretpass"}); end after_each users_db.deleteDoc({_id : user.id, _rev : user.rev}) end it 'should return ok true' $.couch.logout({ success: function(resp){ resp.ok.should.be_true }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should result in an empty session' $.couch.logout(); $.couch.session({ success: function(resp){ resp.userCtx.name.should.be_null resp.userCtx.roles.should.not.include ["vice_president"] }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end end end describe 'encodeDocId' it 'should return the encoded docID when it is not a design document' $.couch.encodeDocId("viper").should.eql(encodeURIComponent("viper")) end it 'should encode only the name of the design document' $.couch.encodeDocId("_design/raptor").should.eql("_design/" + encodeURIComponent("raptor")) end it 'should also work when the name of the des' $.couch.encodeDocId("_design/battlestar/_view/crew").should.eql("_design/" + encodeURIComponent("battlestar/_view/crew")) end end describe 'info' it 'should return the CouchDB version' $.couch.info({ success: function(resp){ resp.couchdb.should.eql "Welcome" resp.version.should_match /^\d\d?\.\d\d?\.\d\d?.*/ }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end end describe 'replicate' before_each db = $.couch.db("spec_db"); db.create(); db2 = $.couch.db("spec_db_2"); db2.create(); host = window.location.protocol + "//" + window.location.host ; end after_each db.drop(); db2.drop(); end it 'should return no_changes true when there are no changes between the dbs' $.couch.replicate(host + db.uri, host + db2.uri, { success: function(resp){ resp.ok.should.be_true resp.no_changes.should.be_true }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return the session ID' db.saveDoc({'type':'battlestar', 'name':'galactica'}); $.couch.replicate(host + db.uri, host + db2.uri, { success: function(resp){ resp.session_id.length.should.be_at_least 30 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return source_last_seq' db.saveDoc({'type':'battlestar', 'name':'galactica'}); db.saveDoc({'type':'battlestar', 'name':'pegasus'}); $.couch.replicate(host + db.uri, host + db2.uri, { success: function(resp){ resp.source_last_seq.should.eql 2 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should return the replication history' db.saveDoc({'type':'battlestar', 'name':'galactica'}); db.saveDoc({'type':'battlestar', 'name':'pegasus'}); $.couch.replicate(host + db.uri, host + db2.uri, { success: function(resp){ resp.history[0].docs_written.should.eql 2 resp.history[0].start_last_seq.should.eql 0 }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should pass through replication options' db.saveDoc({'type':'battlestar', 'name':'galactica'}); db2.drop(); $.couch.replicate(host + db.uri, host + db2.uri, { error: function(status, error, reason){ status.should.eql 500 reason.should.match /db_not_found/ }, success: function(resp){successCallback(resp)} }); $.couch.replicate(host + db.uri, host + db2.uri, { success: function(resp){ resp.ok.should.eql true resp.history[0].docs_written.should.eql 1 }, error: function(status, error, reason){errorCallback(status, error, reason)} }, { "create_target":true }); db2.info({ success: function(resp){ resp.db_name.should.eql "spec_db_2" }, error: function(status, error, reason){errorCallback(status, error, reason)} }); end it 'should alert with an error message prefix' $.couch.replicate("asdf"); alert_msg.should.match /Replication failed/ end end describe 'newUUID' it 'should return a new UUID' var new_uuid = $.couch.newUUID(1); new_uuid.should.be_a String new_uuid.should.have_length 32 end it 'should fill the uuidCache with the specified number minus 1' // we can't reach the uuidCache from here, so we mock the next request // to test that the next uuid is not coming from the request, but from the cache. $.couch.newUUID(2); mock_request().and_return({'uuids':['a_sample_uuid']}) $.couch.newUUID(1).should.not.eql 'a_sample_uuid' $.couch.newUUID(1).should.eql 'a_sample_uuid' end it 'should alert with an error message prefix' $.couch.newUUID("asdf"); alert_msg.should.match /Failed to retrieve UUID batch/ end end end