/**
* @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;