apigeek-affirm
Version:
A BDD/Gherkin micro-framework for REST APIs
117 lines (87 loc) • 4.02 kB
JavaScript
var assert = require('assert');
var request = require('request');
var _ = require('lodash');
var fs = require('fs');
var path = require('path');
var http = require('../helpers/http');
module.exports = function(learn, config) {
var find = this.find = function(self, name) {
var value = self.feature.vars[name]?self.feature.vars[name]:self;
if (!value) throw new Error(name+" not a variable");
return http.findInPath(value, name);
}
// ***** GIVEN *****
learn.given(["I am testing a $thing","I am testing an $thing"], function(thing, done) {
// No Op - Placeholder
// TODO: dynamic loading of vocabulary
done && done();
});
learn.given("I set $name to $value", function(name, value, done) {
this.feature.vars[name]=value;
done && done();
});
learn.given(["I set $name to CSV:\n$CSV", "some CSV as $name:\n$CSV"], function(name, csv, done) {
this.feature.vars[name] = csv;
done && done();
});
learn.given(["I set $name to JSON:\n$JSON", "some JSON as $name:\n$JSON"], function(name, json, done) {
this.feature.vars[name] = json;
done && done();
});
learn.given("I return $js as $var", function(js, name, done) {
var fn = new Function("return "+js);
var result = fn.apply(this, arguments);
this.feature.vars[name] = result;
done && done();
});
// ***** WHEN *****
learn.when(["I wait for $seconds seconds","I sleep for $seconds seconds","I wait for $seconds second","I sleep for $seconds second"], function(seconds, done) {
// TODO: sleep for XXXX seconds
setTimeout(done, 1000*seconds)
});
// ***** THEN *****
learn.then("I assert $js", function(js, done) {
var fn = new Function("return "+js);
var result = fn.apply(this, arguments);
assert(result, "Custom Assert failed: "+js+" --> "+result);
done && done();
});
learn.then("variable $name should exist", function(name, done) {
var value = find(this,name);
assert(value, "Variable "+name+" does not exist");
assert(value!=undefined, "Variable "+name+" does not exist");
done && done();
});
learn.then(["variable $name should be $value", "$name should be $value"], function(name, value, done) {
if (value=="true") value = true;
else if (value=="false") value = false;
assert(this.feature.vars[name] != undefined, "Variable "+name+" does not exist -> "+this.feature.vars[name]);
assert(this.feature.vars[name]==value, "Variable "+name+" does not equal "+value);
done && done();
});
learn.then("variable $name should contain $value", function(name, value, done) {
assert(this.feature.vars[name], "Variable "+name+" does not exist");
assert(this.feature.vars[name].indexOf(value)>0, "Variable "+name+" does not contain "+value);
done && done();
});
learn.then("variable $name should match $regex", function(name, regex, done) {
assert(this.feature.vars[name], "Variable "+name+" does not exist");
var re = new RegExp(regex);
assert(re.test(this.feature.vars[name]), "Variable "+name+" does not match "+regex);
done && done();
});
learn.then("$path in $name should match $regex", function(path, name, regex, done) {
assert(this.feature.vars[name], "Variable "+name+" does not exist");
var value = this.feature.vars[name];
var found = http.findInPath(value, path);
assert(found, "Path "+path+" not found in "+JSON.stringify(value));
var re = new RegExp(regex);
assert(re.test(found), "Variable "+name+" == "+found+" does not match "+regex);
done && done();
});
learn.then("dump $name", function(name, done) {
var found = find(this, name);
console.log("DUMP: %s ==> %j", name, found?found:this.feature.vars[name] );
done && done();
});
}