blob: 1e5205a9da94d381c0dc518096b44d9b4fdd8c01 [file] [log] [blame]
const request = require('request');
const async = require('async');
const animals = require('../test/animal-db.json');
module.exports = createAnimalDb;
function createAnimalDb (url, cb) {
deleteDatabase('animaldb', () => {
createAnimalDb();
});
function deleteDatabase (db, cb) {
request({
uri: `${url}/${db}`,
method: 'DELETE',
json: true,
body: {}
}, (err, res, body) => {
if (err) {
throw err;
}
cb();
});
}
function createAnimalDb () {
request({
uri: `${url}/animaldb/`,
method: 'PUT',
json: true,
body: {}
}, (err, res, body) => {
if (err) {
throw err;
}
bulkLoadDocs();
});
}
function bulkLoadDocs () {
request({
uri: `${url}/animaldb/_bulk_docs`,
method: 'POST',
json: true,
body: {
docs: animals
}
}, (err, res, body) => {
if (err) {
throw err;
}
async.waterfall([
(cb) => {
replicate(`${url}/animaldb`, `${url}/animaldb-copy`, true, cb);
},
(cb) => {
replicate(`${url}/animaldb`, `${url}/animaldb-copy-2`, true, cb);
},
(cb) => {
alterZebraDocs(cb);
},
(cb) => {
alterAnimalDesignDoc(cb)
},
(cb) => {
replicate(`${url}/animaldb-copy`, `${url}/animaldb`, false, cb);
},
(cb) => {
replicate(`${url}/animaldb-copy-2`, `${url}/animaldb`, false, cb);
},
(cb) => {
deleteDatabase('animaldb-copy', cb);
},
(cb) => {
deleteDatabase('animaldb-copy-2', cb);
},
(cb) => {
request({
uri: `${url}/animaldb/${encodeURIComponent('_design/conflicts')}`,
method: 'PUT',
json: true,
body: {
_id: "_design/conflicts",
language: "javascript",
"views":{"new-view":{"map":"function (doc) {\n emit(doc._id, 1);\n}"}}
}
}, (err, res, body) => {
if (err) {
throw err;
}
cb();
});
}
], (err, result) => {
cb();
});
});
}
function replicate (source, target, createTarget, cb) {
request({
uri: `${url}/_replicate`,
method: 'POST',
json: true,
body: {
source: source,
target: target,
create_target: createTarget
}
}, (err, res, body) => {
if (err) {
throw err;
}
cb(null);
});
}
function getRev (db, id, cb) {
request({
uri: `${url}/${db}/${id}`,
json: true
}, (err, res, body) => {
cb(null, body._rev);
});
}
function updateDoc (db, id, data, cb) {
getRev(db, id, (err, rev) => {
alterDoc(db,id, data, rev, cb);
});
}
function alterDoc (db, id, data, rev, cb) {
data._rev = rev;
request({
uri: `${url}/${db}/${id}`,
json: true,
method: 'PUT',
body: data
}, (err, res, body) => {
cb(null);
});
}
function alterZebraDocs (cb) {
updateDoc('animaldb','zebra', {
color: 'black & white'
}, () => {
updateDoc('animaldb-copy', 'zebra', {
color: 'white'
}, () => {
updateDoc('animaldb-copy-2', 'zebra', {
color: 'green'
}, cb);
});
});
}
function alterAnimalDesignDoc (cb) {
updateDoc('animaldb','_design/animals', {
color: 'black & white'
}, () => {
updateDoc('animaldb-copy', '_design/animals', {
color: 'white'
}, () => {
updateDoc('animaldb-copy-2', '_design/animals', {
color: 'green'
}, cb);
});
});
}
}