blob: f2df81b3e6695bfbef67644735aa88cc7b913e42 [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 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