blob: e1fa5b4de3222ebe9adad0fa7eb580890c930007 [file] [log] [blame]
'use strict';
describe('test.http.js', function () {
var dbs = {};
beforeEach(function () {
dbs.name = testUtils.adapterUrl('http', 'test_http');
});
afterEach(function (done) {
testUtils.cleanup([dbs.name], done);
});
it('Create a pouch without DB setup (skip_setup)', function (done) {
var instantDB;
testUtils.isCouchDB(function (isCouchDB) {
if (!isCouchDB) {
return done();
}
var db = new PouchDB(dbs.name);
db.destroy(function () {
instantDB = new PouchDB(dbs.name, { skip_setup: true });
instantDB.post({ test: 'abc' }, function (err) {
should.exist(err);
err.name.should.equal('not_found', 'Skipped setup of database');
done();
});
});
});
});
it('Issue 1269 redundant _changes requests', function (done) {
var docs = [];
var num = 100;
var callCount = 0;
for (var i = 0; i < num; i++) {
docs.push({
_id: 'doc_' + i,
foo: 'bar_' + i
});
}
var db = new PouchDB(dbs.name, {
fetch: function (url, opts) {
if (/_changes/.test(url)) {
callCount++;
}
return PouchDB.fetch(url, opts);
}
});
db.bulkDocs({ docs: docs }, function () {
db.info(function (err, info) {
var update_seq = info.update_seq;
db.changes({
since: update_seq
}).on('change', function () {
}).on('complete', function () {
callCount.should.equal(1, 'One _changes call to complete changes');
done();
}).on('error', done);
});
});
});
it('handle ddocs with slashes', function (done) {
var ddoc = {
_id: '_design/foo/bar'
};
var db = new PouchDB(dbs.name);
db.bulkDocs({ docs: [ddoc] }, function () {
db.get(ddoc._id, function (err, doc) {
should.not.exist(err);
doc._id.should.equal(ddoc._id, 'Correct doc returned');
done();
});
});
});
it('Properly escape url params #4008', function () {
var db = new PouchDB(dbs.name, {
fetch: function (url, opts) {
url.should.not.contain('[');
return PouchDB.fetch(url, opts);
}
});
return db.changes({doc_ids: ['1']});
});
it('test url too long error for allDocs()', function () {
var docs = [];
var numDocs = 75;
for (var i = 0; i < numDocs; i++) {
docs.push({
_id: 'fairly_long_doc_name_' + i
});
}
var db = new PouchDB(dbs.name);
return db.bulkDocs(docs).then(function () {
return db.allDocs({
keys: docs.map(function (x) { return x._id; })
});
}).then(function (res) {
res.rows.should.have.length(numDocs);
});
});
it('4358 db.info rejects when server is down', function () {
var db = new PouchDB('http://example.com/foo');
return db.info().then(function () {
throw new Error('expected an error');
}).catch(function (err) {
should.exist(err);
});
});
it('4358 db.destroy rejects when server is down', function () {
var db = new PouchDB('http://example.com/foo');
return db.destroy().then(function () {
throw new Error('expected an error');
}).catch(function (err) {
should.exist(err);
});
});
it('5574 Create a pouch with / in name and prefix url', function () {
// CouchDB Master disallows these characters
if (testUtils.isCouchMaster()) {
return true;
}
var db = new PouchDB('test/suffix', {
prefix: testUtils.adapterUrl('http', '')
});
return db.info().then(function () {
return db.destroy();
});
});
it('changes respects seq_interval', function (done) {
var docs = [
{_id: '0', integer: 0, string: '0'},
{_id: '1', integer: 1, string: '1'},
{_id: '2', integer: 2, string: '2'}
];
var db = new PouchDB(dbs.name);
var seqCount = 0;
var changesCount = 0;
db.bulkDocs(docs).then(function () {
db.changes({ seq_interval: 4 })
.on('change', function (change) {
if (change.seq !== null) {
seqCount++;
}
changesCount++;
}).on('error', function (err) {
done(err);
}).on('complete', function (info) {
try {
changesCount.should.equal(3);
// we can't know in advance which
// order the changes arrive in so sort them
// so that nulls appear last
info.results.sort(function (a, b) {
if (a.seq !== null && b.seq === null) {
return -1;
}
if (a.seq === null && b.seq !== null) {
return 1;
}
return 0;
});
// first change always contains a seq
should.not.equal(info.results[0].seq, null);
should.not.equal(info.last_seq, null);
// CouchDB 1.x should just ignore seq_interval
// (added in CouchDB 2.0), but not fail with an error
if (testUtils.isCouchMaster()) {
// one change (the "first") always contains a seq
seqCount.should.equal(1);
should.equal(info.results[1].seq, null);
should.equal(info.results[2].seq, null);
}
else {
seqCount.should.equal(3);
}
done();
}
catch (e) {
done(e);
}
});
});
});
});