Skip to content

Commit

Permalink
added custom build function registration
Browse files Browse the repository at this point in the history
  • Loading branch information
daviddenton committed May 25, 2014
1 parent 76a47c8 commit 2a566e0
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 11 deletions.
23 changes: 14 additions & 9 deletions lib/autobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,13 @@ var _ = require('lodash');
var fcb = require('./fallbackConverterBuilder');
var defaultConverter = require('./converter');

module.exports = (function() {
module.exports = (function () {
var registeredConverters = new fcb.FallbackConverterBuilder();

function make(example, overrides, ignoreStrict) {
var finalConverter = registeredConverters.buildWithDefault(defaultConverter);
var generated = df.generate(finalConverter(example));

function override(generator, overrides, ignoreStrict) {
var generated = generator();
if (!ignoreStrict) {
var illegalKeys = _.difference(_.keys(overrides), _.keys(example));
var illegalKeys = _.difference(_.keys(overrides), _.keys(generated));
if (_.size(illegalKeys) > 0) {
throw new Error('Attempted to override non-existent properties in strict mode: [' + illegalKeys + ']');
}
Expand All @@ -22,12 +20,19 @@ module.exports = (function() {
return _.extend({}, generated, overrides);
}

function generateFrom(example) {
return _.constant(df.generate(registeredConverters.buildWithDefault(defaultConverter)(example)));
}

var autobot = {
make: make,
make: function(example, overrides, ignoreStrict) {
return override(generateFrom(example), overrides, ignoreStrict)
},
register: function (examples) {
_.each(examples, function (example, name) {
autobot[name] = function (overrides, ignoreStrict) {
return make(example, overrides, ignoreStrict);
var bF = _.isFunction(example) ? example : generateFrom(example)
autobot[name] = function (overrides, ignoreStrict) {
return override(bF, overrides, ignoreStrict);
};
});
return autobot;
Expand Down
46 changes: 44 additions & 2 deletions test/autobotTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,18 @@ describe('Autobot', function () {

var example = {
aNumber: 1234,
aString: 'string'
aString: 'stringValue'
};

it('can generate a random instance from a full example', function () {
var generated = autobot.make(example);

assert.equal(typeof generated, 'object');
assert.equal(typeof generated.aNumber, 'number');
assert.notEqual(generated.aNumber, 1234);

assert.equal(typeof generated.aString, 'string');
assert.notEqual(generated.aString, 'stringValue');
assert.equal(_.size(generated), 2);
});

Expand All @@ -27,7 +30,9 @@ describe('Autobot', function () {

assert.equal(typeof generated, 'object');
assert.equal(generated.aNumber, 666);

assert.equal(typeof generated.aString, 'string');
assert.notEqual(generated.aString, 'stringValue');
assert.equal(_.size(generated), 2);
});

Expand Down Expand Up @@ -67,6 +72,7 @@ describe('Autobot', function () {
assert.equal(typeof generated, 'object');
assert.equal(typeof generated.aNumber, 'number');
assert.equal(typeof generated.aString, 'string');
assert.notEqual(generated.aString, 'stringValue');
assert.equal(_.size(generated), 2);
});

Expand All @@ -80,12 +86,48 @@ describe('Autobot', function () {
assert.equal(typeof generated, 'object');
assert.equal(generated.aNumber, 999);
assert.equal(typeof generated.aString, 'string');
assert.notEqual(generated.aString, 'stringValue');
assert.equal(_.size(generated), 2);
});

it('can register a custom builder function and build by name', function () {
autobot.register({
AnObject: function() {
return {
aString: 'randomString'
};
}
});

var generated = autobot.AnObject();

assert.equal(typeof generated, 'object');
assert.equal(generated.aString, 'randomString');
assert.equal(_.size(generated), 1);
});

it('can register a custom builder function and build and override by name', function () {
autobot.register({
AnObject: function() {
return {
aNumber: 888,
aString: 'randomString'
};
}
});

var generated = autobot.AnObject({
aNumber: 999
});

assert.equal(typeof generated, 'object');
assert.equal(generated.aString, 'randomString');
assert.equal(generated.aNumber, 999);
assert.equal(_.size(generated), 2);
});
});

// ALSO: dates and time formats
// ALSO: REGISTER CUSTOM CONVERTERS

// ALSO: CACHE AND REPLACE KNOWN FUNCTIONS (SUB OBJECTS batch -> job ETC...)
//
Expand Down

0 comments on commit 2a566e0

Please sign in to comment.