| 'use strict'; |
| |
| var adapters = ['http', 'local']; |
| |
| adapters.forEach(function (adapter) { |
| |
| describe('test.basics.js-' + adapter, function () { |
| |
| var dbs = {}; |
| |
| beforeEach(function () { |
| dbs.name = testUtils.adapterUrl(adapter, 'testdb'); |
| }); |
| |
| afterEach(function (done) { |
| testUtils.cleanup([dbs.name], done); |
| }); |
| |
| it('Create a pouch without new keyword', function () { |
| /* jshint newcap:false */ |
| var db = PouchDB(dbs.name); |
| db.should.be.an.instanceof(PouchDB); |
| }); |
| |
| it('Name is accessible via instance', function () { |
| var db = new PouchDB(dbs.name); |
| db.name.should.equal(dbs.name); |
| }); |
| |
| it('4314 Create a pouch with + in name', function () { |
| var db = new PouchDB(dbs.name + '+suffix'); |
| return db.info().then(function () { |
| return db.destroy(); |
| }); |
| }); |
| |
| it('Creating Pouch without name will throw', function (done) { |
| try { |
| new PouchDB(); |
| done('Should have thrown'); |
| } catch (err) { |
| should.equal(err instanceof Error, true, 'should be an error'); |
| done(); |
| } |
| }); |
| |
| it('4314 Create a pouch with urlencoded name', function () { |
| var db = new PouchDB(dbs.name + 'some%2Ftest'); |
| return db.info().then(function () { |
| return db.destroy(); |
| }); |
| }); |
| |
| it('4219 destroy a pouch', function () { |
| return new PouchDB(dbs.name).destroy({}); |
| }); |
| |
| it('4339 throw useful error if method called on stale instance', function () { |
| var db = new PouchDB(dbs.name); |
| |
| return db.put({ |
| _id: 'cleanTest' |
| }).then(function () { |
| return db.destroy(); |
| }).then(function () { |
| return db.get('cleanTest'); |
| }).then(function () { |
| throw new Error('.get should return an error'); |
| }, function (err) { |
| should.equal(err instanceof Error, true, 'should be an error'); |
| }); |
| }); |
| |
| it('[4595] should reject xhr errors', function (done) { |
| var invalidUrl = 'http:///'; |
| new PouchDB(dbs.name).replicate.to(invalidUrl, {}).catch(function () { |
| done(); |
| }); |
| |
| }); |
| |
| it('[4595] should emit error event on xhr error', function (done) { |
| var invalidUrl = 'http:///'; |
| new PouchDB(dbs.name).replicate.to(invalidUrl,{}) |
| .on('error', function () { done(); }); |
| }); |
| |
| it('Add a doc', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'somestuff'}, function (err) { |
| should.not.exist(err); |
| done(); |
| }); |
| }); |
| |
| it('Get invalid id', function () { |
| var db = new PouchDB(dbs.name); |
| return db.get(1234).then(function () { |
| throw new Error('should not be here'); |
| }).catch(function (err) { |
| should.exist(err); |
| }); |
| }); |
| |
| it('Missing doc should contain ID in error object', function () { |
| var db = new PouchDB(dbs.name); |
| return db.get('abc-123').then(function () { |
| throw new Error('should not be here'); |
| }).catch(function (err) { |
| should.exist(err); |
| err.docId.should.equal('abc-123'); |
| }); |
| }); |
| |
| it('PUTed Conflicted doc should contain ID in error object', function () { |
| var db = new PouchDB(dbs.name); |
| var savedDocId; |
| return db.post({}).then(function (info) { |
| savedDocId = info.id; |
| return db.put({ |
| _id: savedDocId, |
| }); |
| }).then(function () { |
| throw new Error('should not be here'); |
| }).catch(function (err) { |
| err.should.have.property('status', 409); |
| err.docId.should.equal(savedDocId); |
| }); |
| }); |
| |
| it('POSTed Conflicted doc should contain ID in error object', function () { |
| var db = new PouchDB(dbs.name); |
| var savedDocId; |
| return db.post({}).then(function (info) { |
| savedDocId = info.id; |
| return db.post({ |
| _id: savedDocId, |
| }); |
| }).then(function () { |
| throw new Error('should not be here'); |
| }).catch(function (err) { |
| err.should.have.property('status', 409); |
| err.docId.should.equal(savedDocId); |
| }); |
| }); |
| |
| it('Add a doc with a promise', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'somestuff'}).then(function () { |
| done(); |
| }, done); |
| }); |
| |
| it('Add a doc with opts object', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'somestuff'}, {}, function (err) { |
| should.not.exist(err); |
| done(); |
| }); |
| }); |
| |
| it('Modify a doc', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'somestuff'}, function (err, info) { |
| db.put({ |
| _id: info.id, |
| _rev: info.rev, |
| another: 'test' |
| }, function (err, info2) { |
| should.not.exist(err); |
| info.rev.should.not.equal(info2.rev); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Modify a doc with a promise', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'promisestuff'}).then(function (info) { |
| return db.put({ |
| _id: info.id, |
| _rev: info.rev, |
| another: 'test' |
| }).then(function (info2) { |
| info.rev.should.not.equal(info2.rev); |
| }); |
| }).catch(done).then(function () { |
| done(); |
| }); |
| }); |
| |
| it('Read db id', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.id(function (err, id) { |
| id.should.be.a('string'); |
| done(err); |
| }); |
| }); |
| |
| it('Read db id with promise', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.id().then(function (id) { |
| id.should.be.a('string'); |
| done(); |
| }); |
| }); |
| |
| it('Close db', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.info().then(function () { |
| db.close(done); |
| }); |
| }); |
| |
| it('Close db with a promise', function () { |
| var db = new PouchDB(dbs.name); |
| return db.close(); |
| }); |
| |
| it('Read db id after closing Close', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.close(function () { |
| db = new PouchDB(dbs.name); |
| db.id(function (err, id) { |
| id.should.be.a('string'); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Modify a doc with incorrect rev', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({ test: 'somestuff' }, function (err, info) { |
| var nDoc = { |
| _id: info.id, |
| _rev: info.rev + 'broken', |
| another: 'test' |
| }; |
| db.put(nDoc, function (err) { |
| should.exist(err); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Remove doc', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({ test: 'somestuff' }, function (err, info) { |
| db.remove({ |
| test: 'somestuff', |
| _id: info.id, |
| _rev: info.rev |
| }, function () { |
| db.get(info.id, function (err) { |
| should.exist(err.error); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Remove doc with a promise', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'someotherstuff'}).then(function (info) { |
| return db.remove({ |
| test: 'someotherstuff', |
| _id: info.id, |
| _rev: info.rev |
| }).then(function () { |
| return db.get(info.id).then(function () { |
| done(true); |
| }, function (err) { |
| should.exist(err.error); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Remove doc with new syntax', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({ test: 'somestuff' }, function (err, info) { |
| db.remove(info.id, info.rev, function (err) { |
| should.not.exist(err); |
| db.get(info.id, function (err) { |
| should.exist(err); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Remove doc with new syntax and a promise', function (done) { |
| var db = new PouchDB(dbs.name); |
| var id; |
| db.post({test: 'someotherstuff'}).then(function (info) { |
| id = info.id; |
| return db.remove(info.id, info.rev); |
| }).then(function () { |
| return db.get(id); |
| }).then(function () { |
| done(true); |
| }, function (err) { |
| should.exist(err.error); |
| done(); |
| }); |
| }); |
| |
| it('Doc removal leaves only stub', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.put({_id: 'foo', value: 'test'}, function () { |
| db.get('foo', function (err, doc) { |
| db.remove(doc, function (err, res) { |
| db.get('foo', { rev: res.rev }, function (err, doc) { |
| doc.should.deep.equal({ |
| _id: res.id, |
| _rev: res.rev, |
| _deleted: true |
| }); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Remove doc twice with specified id', function () { |
| if (testUtils.isIE()) { |
| return Promise.resolve(); |
| } |
| var db = new PouchDB(dbs.name); |
| return db.put({_id: 'specifiedId', test: 'somestuff'}).then(function () { |
| return db.get('specifiedId'); |
| }).then(function (doc) { |
| return db.remove(doc); |
| }).then(function () { |
| return db.put({ |
| _id: 'specifiedId', |
| test: 'somestuff2' |
| }); |
| }).then(function () { |
| return db.get('specifiedId'); |
| }).then(function (doc) { |
| return db.remove(doc); |
| }); |
| }); |
| |
| it('Remove doc, no callback', function (done) { |
| var db = new PouchDB(dbs.name); |
| var changes = db.changes({ |
| live: true, |
| include_docs: true |
| }).on('change', function (change) { |
| if (change.doc._deleted) { |
| changes.cancel(); |
| } |
| }).on('complete', function (result) { |
| result.status.should.equal('cancelled'); |
| done(); |
| }).on('error', done); |
| db.post({ _id: 'somestuff' }, function (err, res) { |
| db.remove({ |
| _id: res.id, |
| _rev: res.rev |
| }); |
| }); |
| }); |
| |
| it('Delete document without id', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.remove({test: 'ing'}, function (err) { |
| should.exist(err); |
| done(); |
| }); |
| }); |
| |
| it('Delete document with many args', function () { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| return db.put(doc).then(function (info) { |
| return db.remove(doc._id, info.rev, {}); |
| }); |
| }); |
| |
| it('Delete document with many args, callback style', function (done) { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| db.put(doc, function (err, info) { |
| should.not.exist(err); |
| db.remove(doc._id, info.rev, {}, function (err) { |
| should.not.exist(err); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Delete doc with id + rev + no opts', function () { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| return db.put(doc).then(function (info) { |
| return db.remove(doc._id, info.rev); |
| }); |
| }); |
| |
| it('Delete doc with id + rev + no opts, callback style', function (done) { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| db.put(doc, function (err, info) { |
| should.not.exist(err); |
| db.remove(doc._id, info.rev, function (err) { |
| should.not.exist(err); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Delete doc with doc + opts', function () { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| return db.put(doc).then(function (info) { |
| doc._rev = info.rev; |
| return db.remove(doc, {}); |
| }); |
| }); |
| |
| it('Delete doc with doc + opts, callback style', function (done) { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| db.put(doc, function (err, info) { |
| should.not.exist(err); |
| doc._rev = info.rev; |
| db.remove(doc, {}, function (err) { |
| should.not.exist(err); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Delete doc with rev in opts', function () { |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'foo'}; |
| return db.put(doc).then(function (info) { |
| return db.remove(doc, {rev: info.rev}); |
| }); |
| }); |
| |
| it('Bulk docs', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.bulkDocs({ |
| docs: [ |
| { test: 'somestuff' }, |
| { test: 'another' } |
| ] |
| }, function (err, infos) { |
| infos.length.should.equal(2); |
| infos[0].ok.should.equal(true); |
| infos[1].ok.should.equal(true); |
| done(); |
| }); |
| }); |
| |
| it('Bulk docs with a promise', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.bulkDocs({ |
| docs: [ |
| { test: 'somestuff' }, |
| { test: 'another' } |
| ] |
| }).then(function (infos) { |
| infos.length.should.equal(2); |
| infos[0].ok.should.equal(true); |
| infos[1].ok.should.equal(true); |
| done(); |
| }).catch(done); |
| }); |
| |
| it('Basic checks', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.info(function (err, info) { |
| var updateSeq = info.update_seq; |
| var doc = {_id: '0', a: 1, b: 1}; |
| info.doc_count.should.equal(0); |
| db.put(doc, function (err, res) { |
| res.ok.should.equal(true); |
| res.should.have.property('id'); |
| res.should.have.property('rev'); |
| db.info(function (err, info) { |
| info.doc_count.should.equal(1); |
| info.update_seq.should.not.equal(updateSeq); |
| db.get(doc._id, function (err, doc) { |
| doc._id.should.equal(res.id); |
| doc._rev.should.equal(res.rev); |
| db.get(doc._id, { revs_info: true }, function (err, doc) { |
| doc._revs_info[0].status.should.equal('available'); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| }); |
| }); |
| |
| it('update with invalid rev', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({test: 'somestuff'}, function (err, info) { |
| should.not.exist(err); |
| db.put({ |
| _id: info.id, |
| _rev: 'undefined', |
| another: 'test' |
| }, function (err) { |
| should.exist(err); |
| err.name.should.equal('bad_request'); |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Doc validation', function (done) { |
| var bad_docs = [ |
| {'_zing': 4}, |
| {'_zoom': 'hello'}, |
| {'zane': 'goldfish', |
| '_fan': 'something smells delicious'}, |
| {'_bing': {'wha?': 'soda can'}} |
| ]; |
| var db = new PouchDB(dbs.name); |
| db.bulkDocs({ docs: bad_docs }, function (err) { |
| err.name.should.equal('doc_validation'); |
| err.message.should.equal(testUtils.errors.DOC_VALIDATION.message + |
| ': _zing', |
| 'correct error message returned'); |
| done(); |
| }); |
| }); |
| |
| it('Replication fields (#2442)', function (done) { |
| var doc = { |
| '_replication_id': 'test', |
| '_replication_state': 'triggered', |
| '_replication_state_time': 1, |
| '_replication_stats': {} |
| }; |
| var db = new PouchDB(dbs.name); |
| db.post(doc, function (err, resp) { |
| should.not.exist(err); |
| |
| db.get(resp.id, function (err, doc2) { |
| should.not.exist(err); |
| |
| doc2._replication_id.should.equal('test'); |
| doc2._replication_state.should.equal('triggered'); |
| doc2._replication_state_time.should.equal(1); |
| doc2._replication_stats.should.eql({}); |
| |
| done(); |
| }); |
| }); |
| }); |
| |
| it('Testing issue #48', function (done) { |
| var docs = [ |
| {'_id': '0'}, {'_id': '1'}, {'_id': '2'}, |
| {'_id': '3'}, {'_id': '4'}, {'_id': '5'} |
| ]; |
| var TO_SEND = 5; |
| var sent = 0; |
| var complete = 0; |
| var timer; |
| |
| var db = new PouchDB(dbs.name); |
| |
| var bulkCallback = function (err) { |
| should.not.exist(err); |
| if (++complete === TO_SEND) { |
| done(); |
| } |
| }; |
| |
| var save = function () { |
| if (++sent === TO_SEND) { |
| clearInterval(timer); |
| } |
| db.bulkDocs({docs: docs}, bulkCallback); |
| }; |
| |
| timer = setInterval(save, 10); |
| }); |
| |
| it('Testing valid id', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.post({ |
| '_id': 123, |
| test: 'somestuff' |
| }, function (err) { |
| should.exist(err); |
| err.name.should.be.oneOf(['bad_request', 'illegal_docid']) ; |
| done(); |
| }); |
| }); |
| |
| it('Put doc without _id should fail', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.put({test: 'somestuff' }, function (err) { |
| should.exist(err); |
| err.message.should.equal(testUtils.errors.MISSING_ID.message, |
| 'correct error message returned'); |
| done(); |
| }); |
| }); |
| |
| it('Put doc with bad reserved id should fail', function (done) { |
| var db = new PouchDB(dbs.name); |
| db.put({ |
| _id: '_i_test', |
| test: 'somestuff' |
| }, function (err) { |
| should.exist(err); |
| err.status.should.equal(testUtils.errors.RESERVED_ID.status); |
| err.message.should.equal(testUtils.errors.RESERVED_ID.message, |
| 'correct error message returned'); |
| done(); |
| }); |
| }); |
| |
| it('update_seq persists', function () { |
| var db = new PouchDB(dbs.name); |
| return db.post({ test: 'somestuff' }).then(function () { |
| return db.close(); |
| }).then(function () { |
| db = new PouchDB(dbs.name); |
| return db.info(); |
| }).then(function (info) { |
| info.update_seq.should.not.equal(0); |
| info.doc_count.should.equal(1); |
| }); |
| }); |
| |
| it('deletions persists', function (done) { |
| |
| var db = new PouchDB(dbs.name); |
| var doc = {_id: 'staticId', contents: 'stuff'}; |
| |
| function writeAndDelete(cb) { |
| db.put(doc, function (err, info) { |
| db.remove({ |
| _id: info.id, |
| _rev: info.rev |
| }, function () { |
| cb(); |
| }); |
| }); |
| } |
| |
| writeAndDelete(function () { |
| writeAndDelete(function () { |
| db.put(doc, function () { |
| db.get(doc._id, { conflicts: true }, function (err, details) { |
| details.should.not.have.property('_conflicts'); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| }); |
| |
| it('#4126 should not store raw Dates', function () { |
| var date = new Date(); |
| var date2 = new Date(); |
| var date3 = new Date(); |
| var origDocs = [ |
| { _id: '1', mydate: date }, |
| { _id: '2', array: [date2] }, |
| { _id: '3', deep: { deeper: { deeperstill: date3 } } |
| } |
| ]; |
| var db = new PouchDB(dbs.name); |
| return db.bulkDocs(origDocs).then(function () { |
| return db.allDocs({include_docs: true}); |
| }).then(function (res) { |
| var docs = res.rows.map(function (row) { |
| delete row.doc._rev; |
| return row.doc; |
| }); |
| docs.should.deep.equal([ |
| { _id: '1', mydate: date.toJSON() }, |
| { _id: '2', array: [date2.toJSON()] }, |
| { _id: '3', deep: { deeper: { deeperstill: date3.toJSON() } } |
| } |
| ]); |
| origDocs[0].mydate.should.be.instanceof(Date, 'date not modified'); |
| origDocs[1].array[0].should.be.instanceof(Date, 'date not modified'); |
| origDocs[2].deep.deeper.deeperstill |
| .should.be.instanceof(Date, 'date not modified'); |
| }); |
| }); |
| |
| it('Create a db with a reserved name', function () { |
| var db = new PouchDB('__proto__'); |
| return db.info().then(function () { |
| return db.destroy(); |
| }); |
| }); |
| |
| it('Error when document is not an object', function (done) { |
| var db = new PouchDB(dbs.name); |
| var doc1 = [{ _id: 'foo' }, { _id: 'bar' }]; |
| var doc2 = 'this is not an object'; |
| var count = 5; |
| var callback = function (err) { |
| should.exist(err); |
| count--; |
| if (count === 0) { |
| done(); |
| } |
| }; |
| db.post(doc1, callback); |
| db.post(doc2, callback); |
| db.put(doc1, callback); |
| db.put(doc2, callback); |
| db.bulkDocs({docs: [doc1, doc2]}, callback); |
| }); |
| |
| it('Test instance update_seq updates correctly', function (done) { |
| var db1 = new PouchDB(dbs.name); |
| var db2 = new PouchDB(dbs.name); |
| db1.post({ a: 'doc' }, function () { |
| db1.info(function (err, db1Info) { |
| db2.info(function (err, db2Info) { |
| db1Info.update_seq.should.not.equal(0); |
| db2Info.update_seq.should.not.equal(0); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Fail to fetch a doc after db was deleted', function (done) { |
| var db = new PouchDB(dbs.name); |
| var db2 = new PouchDB(dbs.name); |
| var doc = { _id: 'foodoc' }; |
| var doc2 = { _id: 'foodoc2' }; |
| db.put(doc, function () { |
| db2.put(doc2, function () { |
| db.allDocs(function (err, docs) { |
| docs.total_rows.should.equal(2); |
| db.destroy(function (err) { |
| should.not.exist(err); |
| db2 = new PouchDB(dbs.name); |
| db2.get(doc._id, function (err) { |
| err.name.should.equal('not_found'); |
| err.status.should.equal(404); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Fail to fetch a doc after db was deleted', function (done) { |
| var db = new PouchDB(dbs.name); |
| var db2 = new PouchDB(dbs.name); |
| var doc = { _id: 'foodoc' }; |
| var doc2 = { _id: 'foodoc2' }; |
| db.put(doc, function () { |
| db2.put(doc2, function () { |
| db.allDocs(function (err, docs) { |
| docs.total_rows.should.equal(2); |
| db.destroy().then(function () { |
| db2 = new PouchDB(dbs.name); |
| db2.get(doc._id, function (err, doc) { |
| should.not.exist(doc); |
| err.status.should.equal(404); |
| done(); |
| }); |
| }); |
| }); |
| }); |
| }); |
| }); |
| |
| it('Cant add docs with empty ids', function (done) { |
| var docs = [ |
| {}, |
| { _id: null }, |
| { _id: undefined }, |
| { _id: '' }, |
| { _id: {} }, |
| { _id: '_underscored_id' } |
| ]; |
| var num = docs.length; |
| var db = new PouchDB(dbs.name); |
| docs.forEach(function (doc) { |
| db.put(doc, function (err) { |
| should.exist(err); |
| if (!--num) { |
| done(); |
| } |
| }); |
| }); |
| }); |
| |
| it('Test doc with percent in ID', function () { |
| var db = new PouchDB(dbs.name); |
| var doc = { |
| foo: 'bar', |
| _id: 'foo%bar' |
| }; |
| return db.put(doc).then(function (res) { |
| res.id.should.equal('foo%bar'); |
| doc.foo.should.equal('bar'); |
| return db.get('foo%bar'); |
| }).then(function (doc) { |
| doc._id.should.equal('foo%bar'); |
| return db.allDocs({include_docs: true}); |
| }).then(function (res) { |
| var x = res.rows[0]; |
| x.id.should.equal('foo%bar'); |
| x.doc._id.should.equal('foo%bar'); |
| x.key.should.equal('foo%bar'); |
| should.exist(x.doc._rev); |
| }); |
| }); |
| |
| it('db.info should give auto_compaction = false (#2744)', function () { |
| var db = new PouchDB(dbs.name, { auto_compaction: false}); |
| return db.info().then(function (info) { |
| info.auto_compaction.should.equal(false); |
| }); |
| }); |
| |
| it('db.info should give auto_compaction = true (#2744)', function () { |
| var db = new PouchDB(dbs.name, { auto_compaction: true}); |
| return db.info().then(function (info) { |
| // http doesn't support auto compaction |
| info.auto_compaction.should.equal(adapter !== 'http'); |
| }); |
| }); |
| |
| it('db.info should give adapter name (#3567)', function () { |
| var db = new PouchDB(dbs.name); |
| return db.info().then(function (info) { |
| info.adapter.should.equal(db.adapter); |
| }); |
| }); |
| |
| it('db.info should give correct doc_count', function () { |
| var db = new PouchDB(dbs.name); |
| return db.info().then(function (info) { |
| info.doc_count.should.equal(0); |
| return db.bulkDocs({docs : [{_id : '1'}, {_id : '2'}, {_id : '3'}]}); |
| }).then(function () { |
| return db.info(); |
| }).then(function (info) { |
| info.doc_count.should.equal(3); |
| return db.get('1'); |
| }).then(function (doc) { |
| return db.remove(doc); |
| }).then(function () { |
| return db.info(); |
| }).then(function (info) { |
| info.doc_count.should.equal(2); |
| }); |
| }); |
| |
| it('putting returns {ok: true}', function () { |
| // in couch, it's {ok: true} and in cloudant it's {}, |
| // but the http adapter smooths this out |
| var db = new PouchDB(dbs.name); |
| return db.put({_id: '_local/foo'}).then(function (info) { |
| true.should.equal(info.ok, 'putting local returns ok=true'); |
| return db.put({_id: 'quux'}); |
| }).then(function (info) { |
| true.should.equal(info.ok, 'putting returns ok=true'); |
| return db.bulkDocs([ {_id: '_local/bar'}, {_id: 'baz'} ]); |
| }).then(function (info) { |
| info.should.have.length(2, 'correct num bulk docs'); |
| true.should.equal(info[0].ok, 'bulk docs says ok=true #1'); |
| true.should.equal(info[1].ok, 'bulk docs says ok=true #2'); |
| return db.post({}); |
| }).then(function (info) { |
| true.should.equal(info.ok, 'posting returns ok=true'); |
| }); |
| }); |
| |
| it('putting is override-able', function () { |
| var db = new PouchDB(dbs.name); |
| var called = 0; |
| var plugin = { |
| initPull: function () { |
| this.oldPut = this.put; |
| this.put = function () { |
| if (typeof arguments[arguments.length - 1] === 'function') { |
| called++; |
| } |
| return this.oldPut.apply(this, arguments); |
| }; |
| }, |
| cleanupPut: function () { |
| this.put = this.oldPut; |
| } |
| }; |
| PouchDB.plugin(plugin); |
| db.initPull(); |
| return db.put({_id: 'anid', foo: 'bar'}).then(function () { |
| called.should.be.above(0, 'put was called'); |
| return db.get('anid'); |
| }).then(function (doc) { |
| doc.foo.should.equal('bar', 'correct doc'); |
| }); |
| }); |
| |
| it('issue 2779, deleted docs, old revs COUCHDB-292', function (done) { |
| var db = new PouchDB(dbs.name); |
| var rev; |
| |
| db.put({_id: 'foo'}).then(function (resp) { |
| rev = resp.rev; |
| return db.remove('foo', rev); |
| }).then(function () { |
| return db.get('foo'); |
| }).catch(function () { |
| return db.put({_id: 'foo', _rev: rev}); |
| }).then(function () { |
| done(new Error('should never have got here')); |
| }, function (err) { |
| should.exist(err); |
| done(); |
| }); |
| }); |
| |
| it('issue 2888, successive deletes and writes', function () { |
| var db = new PouchDB(dbs.name); |
| var rev; |
| |
| function checkNumRevisions(num) { |
| return db.get('foo', { |
| open_revs: 'all', |
| revs: true |
| }).then(function (fullDocs) { |
| fullDocs[0].ok._revisions.ids.should.have.length(num); |
| }); |
| } |
| return db.put({ _id: 'foo' }).then(function (resp) { |
| rev = resp.rev; |
| return checkNumRevisions(1); |
| }).then(function () { |
| return db.remove('foo', rev); |
| }).then(function () { |
| return checkNumRevisions(2); |
| }).then(function () { |
| return db.put({ _id: 'foo' }); |
| }).then(function (res) { |
| rev = res.rev; |
| return checkNumRevisions(3); |
| }).then(function () { |
| return db.remove('foo', rev); |
| }).then(function () { |
| return checkNumRevisions(4); |
| }); |
| }); |
| |
| it('2 invalid puts', function (done) { |
| var db = new PouchDB(dbs.name); |
| var called = 0; |
| var cb = function () { |
| if (++called === 2) { |
| done(); |
| } |
| }; |
| db.put({_id: 'foo', _zing: 'zing'}, cb); |
| db.put({_id: 'bar', _zing: 'zing'}, cb); |
| }); |
| |
| it('Docs save "null" value', function () { |
| var db = new PouchDB(dbs.name); |
| return db.put({_id: 'doc', foo: null}).then(function () { |
| return db.get('doc'); |
| }).then(function (doc) { |
| (typeof doc.foo).should.equal('object'); |
| should.not.exist(doc.foo); |
| Object.keys(doc).sort().should.deep.equal(['_id', '_rev', 'foo']); |
| }); |
| }); |
| |
| it('replace PouchDB.destroy() (express-pouchdb#203)', function (done) { |
| var old = PouchDB.destroy; |
| PouchDB.destroy = function (name, callback) { |
| var db = new PouchDB(name); |
| return db.destroy(callback); |
| }; |
| // delete a non-existing db, should be fine. |
| PouchDB.destroy(dbs.name, function (err, resp) { |
| PouchDB.destroy = old; |
| |
| done(err, resp); |
| }); |
| }); |
| |
| it('3968, keeps all object fields', function () { |
| var db = new PouchDB(dbs.name); |
| /* jshint -W001 */ |
| var doc = { |
| _id: "x", |
| type: "testdoc", |
| watch: 1, |
| unwatch: 1, |
| constructor: 1, |
| toString: 1, |
| toSource: 1, |
| toLocaleString: 1, |
| propertyIsEnumerable: 1, |
| isPrototypeOf: 1, |
| hasOwnProperty: 1 |
| }; |
| return db.put(doc).then(function () { |
| return db.get(doc._id); |
| }).then(function (savedDoc) { |
| // We shouldnt need to delete from doc here (#4273) |
| should.not.exist(doc._rev); |
| should.not.exist(doc._rev_tree); |
| |
| delete savedDoc._rev; |
| savedDoc.should.deep.equal(doc); |
| }); |
| }); |
| |
| it('4712 invalid rev for new doc generates conflict', function () { |
| // CouchDB 1.X has a bug which allows this insertion via bulk_docs |
| // (which PouchDB uses for all document insertions) |
| if (adapter === 'http' && !testUtils.isCouchMaster()) { |
| return; |
| } |
| |
| var db = new PouchDB(dbs.name); |
| var newdoc = { |
| '_id': 'foobar', |
| '_rev': '1-123' |
| }; |
| |
| return db.put(newdoc).then(function () { |
| throw new Error('expected an error'); |
| }, function (err) { |
| err.should.have.property('name', 'conflict'); |
| err.should.have.property('status', 409); |
| }); |
| }); |
| |
| it('test info() after db close', function () { |
| var db = new PouchDB(dbs.name); |
| return db.close().then(function () { |
| return db.info().catch(function (err) { |
| err.message.should.equal('database is closed'); |
| }); |
| }); |
| }); |
| |
| it('test get() after db close', function () { |
| var db = new PouchDB(dbs.name); |
| return db.close().then(function () { |
| return db.get('foo').catch(function (err) { |
| err.message.should.equal('database is closed'); |
| }); |
| }); |
| }); |
| |
| it('test close() after db close', function () { |
| var db = new PouchDB(dbs.name); |
| return db.close().then(function () { |
| return db.close().catch(function (err) { |
| err.message.should.equal('database is closed'); |
| }); |
| }); |
| }); |
| |
| it('7259 should have "this" keyword properly scoped', function () { |
| var doc = { _id: 'foo' }; |
| var db = new PouchDB(dbs.name); |
| return db.put(doc).then(function () { |
| return doc._id; |
| }).then(db.get); |
| }); |
| |
| if (adapter === 'local') { |
| // TODO: this test fails in the http adapter in Chrome |
| it('should allow unicode doc ids', function (done) { |
| var db = new PouchDB(dbs.name); |
| var ids = [ |
| // "PouchDB is awesome" in Japanese, contains 1-3 byte chars |
| '\u30d1\u30a6\u30c1\u30e5DB\u306f\u6700\u9ad8\u3060', |
| '\u03B2', // 2-byte utf-8 char: 3b2 |
| '\uD843\uDF2D', // exotic 4-byte utf-8 char: 20f2d |
| '\u0000foo\u0000bar\u0001baz\u0002quux', // like mapreduce |
| '\u0000', |
| '\u30d1' |
| ]; |
| var numDone = 0; |
| ids.forEach(function (id) { |
| var doc = {_id : id, foo : 'bar'}; |
| db.put(doc).then(function (info) { |
| doc._rev = info.rev; |
| return db.put(doc); |
| }).then(function () { |
| return db.get(id); |
| }).then(function (resp) { |
| resp._id.should.equal(id); |
| if (++numDone === ids.length) { |
| done(); |
| } |
| }, done); |
| }); |
| }); |
| |
| // this test only really makes sense for IDB |
| it('should have same blob support for 2 dbs', function () { |
| var db1 = new PouchDB(dbs.name); |
| return db1.info().then(function () { |
| var db2 = new PouchDB(dbs.name); |
| return db2.info().then(function () { |
| if (typeof db1._blobSupport !== 'undefined') { |
| db1._blobSupport.should.equal(db2._blobSupport, |
| 'same blob support'); |
| } else { |
| true.should.equal(true); |
| } |
| }); |
| }); |
| }); |
| |
| it('6053, PouchDB.plugin() resets defaults', function () { |
| var PouchDB1 = PouchDB.defaults({foo: 'bar'}); |
| var PouchDB2 = PouchDB1.plugin({foo: function () {}}); |
| should.exist(PouchDB2.__defaults); |
| PouchDB1.__defaults.should.deep.equal(PouchDB2.__defaults); |
| }); |
| } |
| |
| if (typeof process !== 'undefined' && !process.browser) { |
| it('#5471 PouchDB.plugin() should throw error if passed wrong type or empty object', function () { |
| (function () { |
| PouchDB.plugin('pouchdb-adapter-memory'); |
| }).should.throw(Error, 'Invalid plugin: got "pouchdb-adapter-memory", expected an object or a function'); |
| }); |
| } |
| }); |
| }); |