blob: 567bbfa870bb2a80d32f1394b9a8d5ea7b1c3723 [file] [log] [blame]
'use strict';
module.exports = function (PouchDB, opts, callback) {
var utils = require('./utils');
var commonUtils = require('../common-utils.js');
var RepTest = require('./replication-test.js')(PouchDB, Promise);
var oneGen = new RepTest();
var twoGen = new RepTest();
var testCases = [
{
name: 'basic-inserts',
assertions: 1,
iterations: 1000,
setup: function (db, callback) {
callback(null, {'yo': 'dawg'});
},
test: function (db, itr, doc, done) {
db.post(doc, done);
}
},
{
name: 'bulk-inserts',
assertions: 1,
iterations: 100,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 100; i++) {
docs.push({much : 'docs', very : 'bulk'});
}
callback(null, {docs : docs});
},
test: function (db, itr, docs, done) {
db.bulkDocs(docs, done);
}
},
{
name: 'basic-updates',
assertions: 1,
iterations: 100,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 100; i++) {
docs.push({});
}
db.bulkDocs(docs, callback);
},
test: function (db, itr, _, done) {
db.allDocs({include_docs: true}, function (err, res) {
if (err) {
return done(err);
}
var docs = res.rows.map(function (x) { return x.doc; });
db.bulkDocs(docs, done);
});
}
},
{
name: 'basic-gets',
assertions: 1,
iterations: 1000,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 1000; i++) {
docs.push({_id : commonUtils.createDocId(i),
foo : 'bar', baz : 'quux'});
}
db.bulkDocs({docs : docs}, callback);
},
test: function (db, itr, docs, done) {
db.get(commonUtils.createDocId(itr), done);
}
},
{
name: 'all-docs-skip-limit',
assertions: 1,
iterations: 10,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 1000; i++) {
docs.push({_id : commonUtils.createDocId(i),
foo : 'bar', baz : 'quux'});
}
db.bulkDocs({docs : docs}, callback);
},
test: function (db, itr, docs, done) {
function taskFactory(i) {
return function () {
return db.allDocs({skip : i * 100, limit : 10});
};
}
var promise = Promise.resolve();
for (var i = 0; i < 10; i++) {
promise = promise.then(taskFactory(i));
}
promise.then(function () {
done();
}, done);
}
},
{
name: 'all-docs-startkey-endkey',
assertions: 1,
iterations: 10,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 1000; i++) {
docs.push({
_id: commonUtils.createDocId(i),
foo: 'bar',
baz: 'quux'
});
}
db.bulkDocs({docs: docs}, callback);
},
test: function (db, itr, docs, done) {
function taskFactory(i) {
return function () {
return db.allDocs({
startkey: commonUtils.createDocId(i * 100),
endkey: commonUtils.createDocId((i * 100) + 10)
});
};
}
var promise = Promise.resolve();
for (var i = 0; i < 10; i++) {
promise = promise.then(taskFactory(i));
}
promise.then(function () {
done();
}, done);
}
},
{
name: 'all-docs-keys',
assertions: 1,
iterations: 100,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 1000; i++) {
docs.push({_id : commonUtils.createDocId(i),
foo : 'bar', baz : 'quux'});
}
db.bulkDocs({docs : docs}, callback);
},
test: function (db, itr, docs, done) {
function randomDocId() {
return commonUtils.createDocId(
Math.floor(Math.random() * 1000));
}
var keys = [];
for (var i = 0; i < 50; i++) {
keys.push(randomDocId());
}
db.allDocs({
keys: keys,
include_docs: true
}, done);
}
},
{
name: 'all-docs-include-docs',
assertions: 1,
iterations: 100,
setup: function (db, callback) {
var docs = [];
for (var i = 0; i < 1000; i++) {
docs.push({
_id: commonUtils.createDocId(i),
foo: 'bar',
baz: 'quux',
_deleted: i % 2 === 1
});
}
db.bulkDocs({docs: docs}, callback);
},
test: function (db, itr, docs, done) {
return db.allDocs({
include_docs: true,
limit: 100
}).then(function () {
return db.post({}); // to invalidate the doc count
}).then(function () {
done();
}, done);
}
},
{
name: 'pull-replication-perf-skimdb',
assertions: 1,
iterations: 0,
setup: function (localDB, callback) {
var remoteCouchUrl = "http://skimdb.iriscouch.com/registry";
var remoteDB = new PouchDB(remoteCouchUrl, {
ajax: {pool: {maxSockets: 15}}
});
var localPouches = [];
for (var i = 0; i < this.iterations; ++i) {
localPouches[i] = new PouchDB(commonUtils.safeRandomDBName());
}
return callback(null, {
localPouches: localPouches,
remoteDB: remoteDB
});
},
test: function (ignoreDB, itr, testContext, done) {
var localDB = testContext.localPouches[itr];
var remoteDB = testContext.remoteDB;
var replication = PouchDB.replicate(remoteDB, localDB, {
live: false,
batch_size: 100
});
replication.on('change', function (info) {
if (info.docs_written >= 200) {
replication.cancel();
done();
}
}).on('error', done);
},
tearDown: function (ignoreDB, testContext) {
if (testContext && testContext.localPouches) {
return Promise.all(
testContext.localPouches.map(function (localPouch) {
return localPouch.destroy();
}));
}
}
},
{
name: 'pull-replication-one-generation',
assertions: 1,
iterations: 1,
setup: oneGen.setup(1, 1),
test: oneGen.test(),
tearDown: oneGen.tearDown()
},
{
name: 'pull-replication-two-generation',
assertions: 1,
iterations: 1,
setup: twoGen.setup(1, 2),
test: twoGen.test(),
tearDown: twoGen.tearDown()
}
];
utils.runTests(PouchDB, 'basics', testCases, opts, callback);
};