What testing frameworks are available to test views and it's map
and reduce
functions, filters, lists, shows etc. of my CouchDB?
Ideally the framework allows to unit test each function, as well as provide support to test a given set of views, filters etc. against a dataset on a CouchDB instance.
I have found a blog post on writing a test suite for the CouchDB API but it's from 2010 and I was wondering what has happened since.
I would use the Expresso TDD framework for Node.js. The overhead of writing a Node.js application will not be a wasted effort.
Install Node.js from the download page: nodejs.org/download
Make sure you also get the npm (node.js package manager).
With the expresso framework you can easily test any of the RESTful functions in CouchDB.
Here is a sample node.js test that communicates with CouchDB:
var http = require('http');
var url = require('url');
var log_level = 5;
var base_url = 'http://localhost:5984/';
var delete_db_at_end = false;
/**
* This test fetches all the data from a database and verifies that the data is
* returned as it should.
*/
exports.testCouchDBCartoonsAllDocs = function(beforeExit, assert) {
curl('GET', base_url + 'cartoons/_all_docs', null, function(response) {
assert.equal(7, response.total_rows);
assert.equal('Donald Duck', response.rows[1].id);
});
}
/**
* This test creates a database for this test only and deletes it at the end if the
* global parameter delete_db_at_end is set to true, otherwise it is left as is for
* human inspection.
*
*/
exports.testCreateDatabaseTestAddAndDestroy = function(beforeExit, assert) {
var dbname = 'test_db_cartoon';
deleteExistingDatabase(dbname, assert, function(response) {
/* Create the database */
curl('PUT', base_url + dbname, null, function(response) {
assert.equal(true, response.ok);
curl('PUT', base_url + dbname + '/Donald+Duck', '{"publisher":"Walt Disney"}', function(response){
assert.equal(true, response.ok);
assert.equal('Donald Duck', response.id);
curl('GET', base_url + dbname + '/Donald+Duck', null, function(response) {
assert.equal('Donald Duck', response._id);
assert.equal('Walt Disney', response.publisher);
/* Finally we delete the database from CouchDB */
if (delete_db_at_end) {
deleteExistingDatabase(dbname, assert, function(response) {
assert.equal(true, response.ok);
});
}
});
});
});
});
}
/**
* This is a helper function that deletes the database if it exists so
* that the tests can run even if they where interrupted.
*/
function deleteExistingDatabase(dbname, assert, callback) {
curl('GET', base_url + dbname, null, function(response) {
if (response.db_name === dbname) {
log(1, 'About to delete the database ' + dbname);
curl('DELETE', base_url + '/' + dbname, null, function(response) {
callback(response);
});
} else {
callback(response);
}
});
}
/**
* This is a helper method to manage the RESTful sending to the database
*/
function curl(method, urlString, payload, callback) {
log(1, method + ' ' + urlString);
var auth = 'Basic ' + new Buffer('username:password').toString('base64');
log(7, auth);
var options = url.parse(urlString);
options.method = method;
options.headers = {
'Content-Encoding': 'UTF8',
'Content-Type': 'application/json',
'Authorization' : auth
};
log(7, options);
var req = http.request(options, function (res) {
var data = "";
res.setEncoding('UTF8');
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function (chunk) {
var response = JSON.parse(data);
log(5, response);
callback(response);
});
});
if (payload) {
req.write(payload);
}
req.end();
}
/**
* This simple logger logs message depending on the log_level set at
* the top of this file.
*/
function log(level, message) {
if (level<=log_level) {
console.log(message);
}
}
In the same folder as you have this file stored execute this command:
npm install expresso
Run the test by issuing this command:
node_modules/expresso/bin/expresso test.js
This is the console output from the command above:
GET http://localhost:5984/cartoons/_all_docs
GET http://localhost:5984/test_db_cartoon
{ error: 'not_found', reason: 'no_db_file' }
PUT http://localhost:5984/test_db_cartoon
{ total_rows: 7,
offset: 0,
rows:
[ { id: 'Batman', key: 'Batman', value: [Object] },
{ id: 'Donald Duck', key: 'Donald Duck', value: [Object] },
{ id: 'Iron Man', key: 'Iron Man', value: [Object] },
{ id: 'Mickey Mouse', key: 'Mickey Mouse', value: [Object] },
{ id: 'Spider-Man', key: 'Spider-Man', value: [Object] },
{ id: 'Superman', key: 'Superman', value: [Object] },
{ id: '_design/select', key: '_design/select', value: [Object] } ] }
{ ok: true }
PUT http://localhost:5984/test_db_cartoon/Donald+Duck
{ ok: true,
id: 'Donald Duck',
rev: '1-1c431dfb2c46991ec999743830a5363b' }
GET http://localhost:5984/test_db_cartoon/Donald+Duck
{ _id: 'Donald Duck',
_rev: '1-1c431dfb2c46991ec999743830a5363b',
publisher: 'Walt Disney' }
100% 2 tests
You can easily expand the test with additional
exports.testname = function(beforeExit, assert) {
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With