kennethklee/node-mongoose-fixtures

View on GitHub
lib/index.js

Summary

Maintainability
A
1 hr
Test Coverage
var async = require('async'),
    mongoose = require('mongoose'),
    savedFixtures = {};

// Create documents
var fixtures = module.exports = function(dataset, db, callback) {
    if (typeof db === 'function') {
        callback = db;
        db = mongoose;
    }

    // Load fixture
    if (typeof dataset === 'string') {
        dataset = savedFixtures[dataset];
    }

    // Error handling
    if (typeof dataset !== 'object') {
        if (callback) {
            return callback.call(fixtures, new Error('Dataset not a valid object or does not exist as a named fixture.'));
        }
    }

    async.map(Object.keys(dataset), function(tableName, done) {
        var model = db.model(tableName);

        if (model) {
            model.insertMany(dataset[tableName], function(err) {
                done(err, Array.prototype.slice.call(arguments, 1));
            });
        } else {
            done(new Error(tableName + ' does not exist'));
        }
    }, function(err, documentSet) {        
        if (callback) {
            callback.call(fixtures, err, Array.prototype.concat.apply([], documentSet));
        }
    });
};

// Save named fixture (for later)
fixtures.save = function(name, data, callback) {
    var oldFixture = savedFixtures[name];

    savedFixtures[name] = data;

    if (callback) {
        callback.call(null, null, oldFixture);
    }
};

// Get a particular fixture
fixtures.get = function(name, callback) {
    if (callback) {
        return callback.call(null, null, savedFixtures[name]);
    } else {
        return savedFixtures[name];
    }
};

// Clear named fixture
fixtures.clear = function(name, callback) {
    if (typeof name === 'function') {
        callback = name;
        name = null;
    }

    if (name) {
        delete savedFixtures[name];
    } else {
        savedFixtures = {};
    }

    if (callback) {
        callback.call(null);
    }
};

// Reset collection
fixtures.reset = function(modelName, db, callback) {
    if (modelName instanceof mongoose.Mongoose) {
        callback = db;
        db = modelName;
        modelName = null;
    }
    if (typeof modelName === 'function') {
        callback = modelName;
        modelName = null;
        db = mongoose;
    }
    if (typeof db === 'function') {
        callback = db, db = mongoose;
    }
    if (typeof modelName === 'undefined') {
        db = mongoose;
        callback = function() {};   // No operation
    }

    var deleteModel = function(modelName, done) {
        db.model(modelName).remove(done);
    };

    if (modelName) {
        deleteModel(modelName, callback);
    } else {
        async.map(db.modelNames(), deleteModel, callback);
    }
};