Source: test/db/DBObjectCreateEditDeleteScenario.js

/**
 * @version  1.0
 * @author Boris GBAHOUE
 * @file Test the create => edit => delete chain
 * @module amiwo/test/db
*/

// =============================================================
// BASE SETUP
// =============================================================
// call the packages we need
var debug                       = require('debug')('comingup:test');
var u                           = require('../../util');
var util                        = require('util');
var when                        = require('when');

// load our Objects
var Scenario                    = require('../Scenario');
var CreateTemplate              = require('./DBObjectCreateTemplate');
var EditTemplate                = require('./DBObjectEditTemplate');
var DeleteTemplate              = require('./DBObjectDeleteTemplate');

// =============================================================
// CONSTRUCTOR
// =============================================================
/**
 * @class 
 * 
 * @constructor
 * @augments module:amiwo/test~Scenario
 * @param {String} name: valid DBObject name
 * @param {Object} data: {create, edit} JSON
 * @param {Object} uri: {create: {route, method}, edit: {route, method}, delete: {route, method}} JSON
 * @param {Object} [options]
 */
function DBObjectCreateEditDeleteScenario(name, data, uri, options) {
    Scenario.call(this);
    
    this._name = name;
    this._data = data;
    this._uri = uri;
    this._options = options;
}

/**
* Inherit from `Scenario`.
*/
util.inherits(DBObjectCreateEditDeleteScenario, Scenario);

// =============================================================
// PUBLIC METHODS
// =============================================================
/**
 * Run a test an generate a result
 * 
 * @return {Promise} promise wrapping an Object which format must be the same as the input of the check() method
 */
DBObjectCreateEditDeleteScenario.prototype.run = function() {
    var self = this;
    
    var $create = new CreateTemplate(self._name, self._data.create, self._uri.create, self._options.create);
    
    return $create.execute().then(function(object) {
        if (object == null) return when.reject(new Error("::DBOBJECTCREATEEDITDELETESCENARIO::RUN::ERROR Null object received after create"));
        if (u.isEmpty(object._id)) return when.reject(new Error("::DBOBJECTCREATEEDITDELETESCENARIO::RUN::ERROR Object with no ID set received after create"));
        
        // Add created object ID to edit dataset
        var editData = self._data.edit;
        var idProp = editData.ID;
        if (idProp == null) return when.reject(new Error("::DBOBJECTCREATEEDITDELETESCENARIO::RUN::ERROR No 'ID' property found in dataset"));
        delete editData.ID;
        editData[idProp] = object._id;
        
        var $edit = new EditTemplate(self._name, editData, self._uri.edit,self._options.edit);
        
        return $edit.execute();
    }).then(function(object) {
        if (object == null) return when.reject(new Error("::DBOBJECTCREATEEDITDELETESCENARIO::RUN::ERROR Null object received after edit"));
        if (u.isEmpty(object._id)) return when.reject(new Error("::DBOBJECTCREATEEDITDELETESCENARIO::RUN::ERROR Object with no ID set received after edit"));
        
        // Add edited object ID to delete dataset
        var deleteData = self._data.delete;
        var idProp = deleteData.ID;
        //delete deleteData.ID; // done in the Template (we need the ID to load the object to delete first)
        deleteData[idProp] = object._id;
        
        var $delete = new DeleteTemplate(self._name, deleteData, self._uri.delete, self._options.delete);
        return $delete.execute();
        
    }).then(function(done) {
        return when.resolve(true);
    })
}

/**
 * Tests whether the output of a TestScenario is valid or not
 * 
 * @return {Promise} wrapping an Object {valid: {boolean}, result: {any}}
 */
DBObjectCreateEditDeleteScenario.prototype.validate = function(input) {
    return when.resolve({valid: true, result: "Test passed"});
}

// =============================================================
// PROTECTED METHODS
// =============================================================

module.exports = DBObjectCreateEditDeleteScenario;