Skip to content

Commit

Permalink
Model mocking works!
Browse files Browse the repository at this point in the history
  • Loading branch information
dcrockwell committed Sep 20, 2015
1 parent d1d5e12 commit 4b637d6
Show file tree
Hide file tree
Showing 8 changed files with 405 additions and 80 deletions.
149 changes: 116 additions & 33 deletions es5/lib/modelFinder.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ exports["default"] = ModelFinder;
var addChain = Symbol(),
validateDependencies = Symbol(),
argumentString = Symbol(),
callDatabase = Symbol();
callDatabase = Symbol(),
argumentsEqual = Symbol();

var ModelQuery = (function () {
function ModelQuery(ModelConstructor, options) {
Expand All @@ -82,7 +83,7 @@ var ModelQuery = (function () {
_.database = options.database;
_.chain = {};

ModelConstructor.mocks = ModelConstructor.mocks || {};
_.ModelConstructor.mocks = _.ModelConstructor.mocks || {};
}

_createClass(ModelQuery, [{
Expand All @@ -94,7 +95,7 @@ var ModelQuery = (function () {

var chainString = _.ModelConstructor.name;

[".find", ".count", ".all", ".one", ".where", ".andWhere", ".orWhere", ".limit", ".groupBy", ".orderBy"].forEach(function (chainName) {
[".find", ".count", ".all", ".one", ".where", ".andWhere", ".orWhere", ".groupBy", ".orderBy", ".limit"].forEach(function (chainName) {
if (_.chain.hasOwnProperty(chainName)) {
chainString = chainString + chainName;
var options = _.chain[chainName];
Expand All @@ -112,38 +113,47 @@ var ModelQuery = (function () {
value: function mockResults(mockValue) {
var _ = (0, _incognito2["default"])(this);

var mockString = this.toString();

_.ModelConstructor.mocks[mockString] = mockValue;
_.ModelConstructor.mocks[this.toString()] = {
query: this,
value: mockValue
};

return this;
}
}, {
key: validateDependencies,
value: function value() {
if (!(0, _incognito2["default"])(this).database) {
throw new Error("Cannot find models without a database set.");
}
}
}, {
key: addChain,
value: function value(chainName, options) {
(0, _incognito2["default"])(this).chain[chainName] = options;
}
}, {
key: argumentString,
value: function value(options) {
var newOptions = [];
options.forEach(function (option) {
var newOption = undefined;
if (typeof option === "string") {
newOption = "\"" + option + "\"";
} else {
newOption = option.toString();
key: "equalTo",
value: function equalTo(query) {
var ourChain = this.chain;
var theirChain = query.chain;

var ourChainNames = Object.keys(ourChain);
var theirChainNames = Object.keys(theirChain);

var ourChainLength = ourChainNames.length;
var theirChainLength = theirChainNames.length;

var isEqual = true;

if (ourChainLength === theirChainLength) {
for (var chainName in ourChain) {
if (theirChain.hasOwnProperty(chainName)) {
var ourArguments = ourChain[chainName];
var theirArguments = theirChain[chainName];

if (!this[argumentsEqual](ourArguments, theirArguments)) {
isEqual = false;
break;
}
} else {
isEqual = false;
break;
}
}
newOptions.push(newOption);
});
return newOptions.join(", ");
} else {
isEqual = false;
}

return isEqual;
}
}, {
key: "find",
Expand Down Expand Up @@ -285,15 +295,51 @@ var ModelQuery = (function () {
value: function results(callback) {
var _ = (0, _incognito2["default"])(this);

var mockString = this.toString();
var mockValue = _.ModelConstructor.mocks[mockString];
var useMock = false;
var mockValue = undefined;

for (var chainString in _.ModelConstructor.mocks) {
var mock = _.ModelConstructor.mocks[chainString];
if (this.equalTo(mock.query)) {
useMock = true;
mockValue = mock.value;
break;
}
}

if (mockValue) {
if (useMock) {
callback(null, mockValue);
} else {
this[callDatabase](callback);
}
}
}, {
key: validateDependencies,
value: function value() {
if (!(0, _incognito2["default"])(this).database) {
throw new Error("Cannot find models without a database set.");
}
}
}, {
key: addChain,
value: function value(chainName, options) {
(0, _incognito2["default"])(this).chain[chainName] = options;
}
}, {
key: argumentString,
value: function value(options) {
var newOptions = [];
options.forEach(function (option) {
var newOption = undefined;
if (typeof option === "string") {
newOption = "\"" + option + "\"";
} else {
newOption = option.toString();
}
newOptions.push(newOption);
});
return newOptions.join(", ");
}
}, {
key: callDatabase,
value: function value(callback) {
Expand Down Expand Up @@ -346,6 +392,43 @@ var ModelQuery = (function () {
}
});
}
}, {
key: argumentsEqual,
value: function value(argumentsA, argumentsB) {
if (argumentsA === argumentsB) {
return true;
} else {
if (argumentsA.length === argumentsB.length) {
var index = argumentsA.length;
while (index--) {
var argumentA = argumentsA[index];
var argumentB = argumentsB[index];

if (argumentA !== argumentB) {
if (argumentA instanceof RegExp) {
if (argumentB.toString().match(argumentA) === null) {
return false;
}
} else if (argumentB instanceof RegExp) {
if (argumentA.toString().match(argumentB) === null) {
return false;
}
} else {
return false;
}
}
}
return true;
} else {
return false;
}
}
}
}, {
key: "chain",
get: function get() {
return (0, _incognito2["default"])(this).chain;
}
}, {
key: "one",
get: function get() {
Expand Down
40 changes: 40 additions & 0 deletions es5/spec/model/chain.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"use strict";

var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var _ = require("../../../");

var _2 = _interopRequireDefault(_);

describe(".chain", function () {
var User = (function (_Model) {
_inherits(User, _Model);

function User() {
_classCallCheck(this, User);

_get(Object.getPrototypeOf(User.prototype), "constructor", this).apply(this, arguments);
}

return User;
})(_2["default"]);

it("should return the full chain of a simple query", function () {
User.find.chain.should.eql({
".find": undefined
});
});

it("should return the full chain of query with arguments", function () {
User.find.where("id", 1).chain.should.eql({
".find": undefined,
".where": ["id", 1]
});
});
});
62 changes: 62 additions & 0 deletions es5/spec/model/equalTo.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
"use strict";

var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var _ = require("../../../");

var _2 = _interopRequireDefault(_);

describe(".equalTo()", function () {
var User = (function (_Model) {
_inherits(User, _Model);

function User() {
_classCallCheck(this, User);

_get(Object.getPrototypeOf(User.prototype), "constructor", this).apply(this, arguments);
}

return User;
})(_2["default"]);

it("should return true on simple comparisons", function () {
var queryA = User.find;
var queryB = User.find;

queryA.equalTo(queryB).should.be["true"];
});

it("should return false on simple comparisons", function () {
var queryA = User.find;
var queryB = User.count;

queryA.equalTo(queryB).should.be["false"];
});

it("should return true on comparisons with arguments", function () {
var queryA = User.find.where("id", 1);
var queryB = User.find.where("id", 1);

queryA.equalTo(queryB).should.be["true"];
});

it("should return false on comparisons with arguments", function () {
var queryA = User.find.where("id", 1);
var queryB = User.find.where("id", 2);

queryA.equalTo(queryB).should.be["false"];
});

it("should return true on comparisons with regex arguments", function () {
var queryA = User.find.where("createdAt", /.*/);
var queryB = User.find.where("createdAt", "2014-10-08 10:16:34");

queryA.equalTo(queryB).should.be["true"];
});
});
20 changes: 10 additions & 10 deletions es5/spec/model/mockResults.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ describe(".mockResults(callback)", function () {
});
});

// it("should return the mocked value when using regex values", done => {
// User.find.one.where("createdAt", /.*/).mockResults(mockedValue);
//
// User.find.one.where("createdAt", "2014-10-08 10:16:34").results((error, data) => {
// data.should.eql(mockedValue);
// done();
// });
// });
it("should return the mocked value when using regex values", function (done) {
User.find.one.where("createdAt", /.*/).mockResults(mockedValue);

User.find.one.where("createdAt", "2014-10-08 10:16:34").results(function (error, data) {
data.should.eql(mockedValue);
done();
});
});

it("should not matter which order the chain is called in", function () {
User.find.where("id", 1).one.results(function (error, data) {
Expand All @@ -62,13 +62,13 @@ describe(".mockResults(callback)", function () {

it("should not affect calls with different parameters", function () {
(function () {
User.find.one.where("id", 2).results();
User.find.one.where("id", 2).results(function () {});
}).should["throw"]("Cannot find models without a database set.");
});

it("should not affect calls with a different chain", function () {
(function () {
User.find.all.where("id", 1).results();
User.find.all.where("id", 1).results(function () {});
}).should["throw"]("Cannot find models without a database set.");
});
});
Loading

0 comments on commit 4b637d6

Please sign in to comment.