diff --git a/lib/index.js b/lib/index.js index fb3e574..a522159 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,70 +1,51 @@ "use strict"; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } - function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } - const mongoose = require('mongoose'); - if (!/^5/.test(mongoose.version)) { mongoose.Promise = Promise; } - mongoose.connect = jest.fn().mockImplementation(() => Promise.resolve()); mongoose.createConnection = jest.fn().mockReturnValue({ catch() { /* no op */ }, - model: mongoose.model.bind(mongoose), on: jest.fn(), once: jest.fn(), - then(resolve) { return Promise.resolve(resolve(this)); } - }); const ops = ['find', 'findOne', 'count', 'countDocuments', 'estimatedDocumentCount', 'distinct', 'findOneAndUpdate', 'findOneAndDelete', 'findOneAndRemove', 'findOneAndReplace', 'remove', 'update', 'updateOne', 'updateMany', 'deleteOne', 'deleteMany', 'save', 'aggregate']; - const mockedReturn = /*#__PURE__*/function () { var _ref = _asyncToGenerator(function* (cb) { const op = this.op, - modelName = this.model.modelName, - _this$_mongooseOption = this._mongooseOptions, - _mongooseOptions = _this$_mongooseOption === void 0 ? {} : _this$_mongooseOption; - + modelName = this._model.modelName, + _this$_mongooseOption = this._mongooseOptions, + _mongooseOptions = _this$_mongooseOption === void 0 ? {} : _this$_mongooseOption; const Model = mongoose.model(modelName); let mock = mockingoose.__mocks[modelName] && mockingoose.__mocks[modelName][op]; let err = null; - if (mock instanceof Error) { err = mock; } - if (typeof mock === 'function') { mock = yield mock(this); } - if (!mock && op === 'save') { mock = this; } - if (mock && !(mock instanceof Model) && !['remove', 'deleteOne', 'deleteMany', 'update', 'updateOne', 'updateMany', 'count', 'countDocuments', 'estimatedDocumentCount', 'distinct'].includes(op)) { mock = Array.isArray(mock) ? mock.map(item => new Model(item)) : new Model(mock); - if (op === 'insertMany') { if (!Array.isArray(mock)) mock = [mock]; - var _iterator = _createForOfIteratorHelper(mock), - _step; - + _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { const doc = _step.value; @@ -77,28 +58,22 @@ const mockedReturn = /*#__PURE__*/function () { _iterator.f(); } } - if (_mongooseOptions.lean || _mongooseOptions.rawResult) { mock = Array.isArray(mock) ? mock.map(item => item.toObject()) : mock.toObject(); } } - if (cb) { return cb(err, mock); } - if (err) { throw err; } - return mock; }); - return function mockedReturn(_x) { return _ref.apply(this, arguments); }; }(); - ops.forEach(op => { mongoose.Query.prototype[op] = jest.fn().mockImplementation(function (criteria, doc, options, callback) { if (['find', 'findOne', 'count', 'countDocuments', 'remove', 'deleteOne', 'deleteMany', 'update', 'updateOne', 'updateMany', 'findOneAndUpdate', 'findOneAndRemove', 'findOneAndDelete', 'findOneAndReplace'].includes(op) && typeof criteria !== 'function') { @@ -106,16 +81,13 @@ ops.forEach(op => { // ensure they make it into the Query conditions this.merge(criteria); } - if (['distinct'].includes(op) && typeof doc !== 'function') { // distinct has the conditions as the second parameter this.merge(doc); } - if (/update/i.test(op) && typeof doc !== 'function' && doc) { this.setUpdate(doc); } - switch (arguments.length) { case 4: case 3: @@ -123,19 +95,15 @@ ops.forEach(op => { callback = options; options = {}; } - break; - case 2: if (typeof doc === 'function') { callback = doc; doc = criteria; criteria = undefined; } - options = undefined; break; - case 1: if (typeof criteria === 'function') { callback = criteria; @@ -144,19 +112,17 @@ ops.forEach(op => { doc = criteria; criteria = options = undefined; } - } - this.op = op; - if (!callback) { return this; } - return this.exec.call(this, callback); }); }); mongoose.Query.prototype.exec = jest.fn().mockImplementation(function (cb) { + this._model = this.model; + delete this.model; return mockedReturn.call(this, cb); }); mongoose.Aggregate.prototype.exec = jest.fn().mockImplementation( /*#__PURE__*/function () { @@ -164,44 +130,38 @@ mongoose.Aggregate.prototype.exec = jest.fn().mockImplementation( /*#__PURE__*/f const modelName = this._model.modelName; let mock = mockingoose.__mocks[modelName] && mockingoose.__mocks[modelName].aggregate; let err = null; - if (mock instanceof Error) { err = mock; } - if (typeof mock === 'function') { mock = yield mock(this); } - if (cb) { return cb(err, mock); } - if (err) { throw err; } - return mock; }); - return function (_x2) { return _ref2.apply(this, arguments); }; }()); mongoose.Model.insertMany = jest.fn().mockImplementation(function (arr, options, cb) { const op = 'insertMany'; + this._model = this.model; + delete this.model; const modelName = this.modelName; - if (typeof options === 'function') { cb = options; options = null; } else { this._mongooseOptions = options; } - Object.assign(this, { op, - model: { + _model: { modelName } }); @@ -211,15 +171,15 @@ const instance = ['remove', 'save']; instance.forEach(methodName => { mongoose.Model.prototype[methodName] = jest.fn().mockImplementation(function (options, cb) { const op = methodName; + this._model = this.model; + delete this.model; const modelName = this.constructor.modelName; - if (typeof options === 'function') { cb = options; } - Object.assign(this, { op, - model: { + _model: { modelName } }); @@ -230,16 +190,13 @@ instance.forEach(methodName => { reject(err); return; } - const ret = mockedReturn.call(this, cb); - if (cb) { hooks.execPost(op, this, [ret], err2 => { if (err2) { reject(err2); return; } - resolve(ret); }); } else { @@ -249,7 +206,6 @@ instance.forEach(methodName => { reject(err3); return; } - resolve(ret2); }); }).catch(reject); @@ -258,21 +214,18 @@ instance.forEach(methodName => { }); }); }); -jest.doMock('mongoose', () => mongoose); // extend a plain function, we will override it with the Proxy later +jest.doMock('mongoose', () => mongoose); +// extend a plain function, we will override it with the Proxy later const proxyTarget = Object.assign(() => void 0, { __mocks: {}, - resetAll() { this.__mocks = {}; }, - toJSON() { return this.__mocks; } - }); - const getMockController = prop => { return { toReturn(o, op = 'find') { @@ -281,49 +234,40 @@ const getMockController = prop => { }; return this; }, - reset(op) { if (op) { delete proxyTarget.__mocks[prop][op]; } else { delete proxyTarget.__mocks[prop]; } - return this; }, - toJSON() { return proxyTarget.__mocks[prop] || {}; } - }; }; - const proxyTraps = { get(target, prop) { if (target.hasOwnProperty(prop)) { return Reflect.get(target, prop); } - return getMockController(prop); }, - apply: (target, thisArg, [prop]) => mockModel(prop) }; const mockingoose = new Proxy(proxyTarget, proxyTraps); + /** * Returns a helper with which you can set up mocks for a particular Model */ - const mockModel = model => { const modelName = typeof model === 'function' ? model.modelName : model; - if (typeof modelName === 'string') { return getMockController(modelName); } else { throw new Error('model must be a string or mongoose.Model'); } }; - module.exports = mockingoose; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map index 333e8a6..8448631 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.js"],"names":["mongoose","require","test","version","Promise","connect","jest","fn","mockImplementation","resolve","createConnection","mockReturnValue","catch","model","bind","on","once","then","ops","mockedReturn","cb","op","modelName","_mongooseOptions","Model","mock","mockingoose","__mocks","err","Error","includes","Array","isArray","map","item","doc","e","validateSync","lean","rawResult","toObject","forEach","Query","prototype","criteria","options","callback","merge","setUpdate","arguments","length","undefined","exec","call","Aggregate","_model","aggregate","insertMany","arr","Object","assign","instance","methodName","constructor","hooks","reject","execPre","ret","execPost","err2","ret2","err3","doMock","proxyTarget","resetAll","toJSON","getMockController","prop","toReturn","o","hasOwnProperty","reset","proxyTraps","get","target","Reflect","apply","thisArg","mockModel","Proxy","module","exports"],"mappings":"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","sourcesContent":["const mongoose = require('mongoose');\n\nif (!/^5/.test(mongoose.version)) {\n mongoose.Promise = Promise;\n}\n\nmongoose.connect = jest\n .fn()\n .mockImplementation(() => Promise.resolve());\n\nmongoose.createConnection = jest.fn().mockReturnValue({\n catch() {\n /* no op */\n },\n model: mongoose.model.bind(mongoose),\n on: jest.fn(),\n once: jest.fn(),\n then(resolve) {\n return Promise.resolve(resolve(this));\n },\n});\n\nconst ops = [\n 'find',\n 'findOne',\n 'count',\n 'countDocuments',\n 'estimatedDocumentCount',\n 'distinct',\n 'findOneAndUpdate',\n 'findOneAndDelete',\n 'findOneAndRemove',\n 'findOneAndReplace',\n 'remove',\n 'update',\n 'updateOne',\n 'updateMany',\n 'deleteOne',\n 'deleteMany',\n 'save',\n 'aggregate',\n];\n\nconst mockedReturn = async function(cb) {\n const {\n op,\n model: { modelName },\n _mongooseOptions = {},\n } = this;\n const Model = mongoose.model(modelName);\n\n let mock =\n mockingoose.__mocks[modelName] && mockingoose.__mocks[modelName][op];\n\n let err = null;\n\n if (mock instanceof Error) {\n err = mock;\n }\n\n if (typeof mock === 'function') {\n mock = await mock(this);\n }\n\n if (!mock && op === 'save') {\n mock = this;\n }\n\n if (\n mock &&\n !(mock instanceof Model) &&\n ![\n 'remove',\n 'deleteOne',\n 'deleteMany',\n 'update',\n 'updateOne',\n 'updateMany',\n 'count',\n 'countDocuments',\n 'estimatedDocumentCount',\n 'distinct',\n ].includes(op)\n ) {\n mock = Array.isArray(mock)\n ? mock.map(item => new Model(item))\n : new Model(mock);\n\n if(op === 'insertMany') {\n if(!Array.isArray(mock)) mock = [mock];\n\n for(const doc of mock) {\n const e = doc.validateSync();\n if(e) throw e;\n }\n }\n\n if (_mongooseOptions.lean || _mongooseOptions.rawResult) {\n mock = Array.isArray(mock)\n ? mock.map(item => item.toObject())\n : mock.toObject();\n }\n }\n\n if (cb) {\n return cb(err, mock);\n }\n\n if (err) {\n throw err;\n }\n\n return mock;\n};\n\nops.forEach(op => {\n mongoose.Query.prototype[op] = jest\n .fn()\n .mockImplementation(function(criteria, doc, options, callback) {\n if (\n [\n 'find',\n 'findOne',\n 'count',\n 'countDocuments',\n 'remove',\n 'deleteOne',\n 'deleteMany',\n 'update',\n 'updateOne',\n 'updateMany',\n 'findOneAndUpdate',\n 'findOneAndRemove',\n 'findOneAndDelete',\n 'findOneAndReplace',\n ].includes(op) &&\n typeof criteria !== 'function'\n ) {\n // find and findOne can take conditions as the first paramter\n // ensure they make it into the Query conditions\n this.merge(criteria);\n }\n\n if (['distinct'].includes(op) && typeof doc !== 'function') {\n // distinct has the conditions as the second parameter\n this.merge(doc);\n }\n\n if (/update/i.test(op) && typeof doc !== 'function' && doc) {\n this.setUpdate(doc);\n }\n\n switch (arguments.length) {\n case 4:\n case 3:\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n break;\n case 2:\n if (typeof doc === 'function') {\n callback = doc;\n doc = criteria;\n criteria = undefined;\n }\n options = undefined;\n break;\n case 1:\n if (typeof criteria === 'function') {\n callback = criteria;\n criteria = options = doc = undefined;\n } else {\n doc = criteria;\n criteria = options = undefined;\n }\n }\n\n this.op = op;\n\n if (!callback) {\n return this;\n }\n\n return this.exec.call(this, callback);\n });\n});\n\nmongoose.Query.prototype.exec = jest.fn().mockImplementation(function(cb) {\n return mockedReturn.call(this, cb);\n});\n\nmongoose.Aggregate.prototype.exec = jest\n .fn()\n .mockImplementation(async function(cb) {\n const {\n _model: { modelName },\n } = this;\n\n let mock =\n mockingoose.__mocks[modelName] &&\n mockingoose.__mocks[modelName].aggregate;\n\n let err = null;\n\n if (mock instanceof Error) {\n err = mock;\n }\n\n if (typeof mock === 'function') {\n mock = await mock(this);\n }\n\n if (cb) {\n return cb(err, mock);\n }\n\n if (err) {\n throw err;\n }\n\n return mock;\n });\n\nmongoose.Model.insertMany = jest\n .fn()\n .mockImplementation(function(arr, options, cb) {\n const op = 'insertMany';\n const { modelName } = this;\n\n if (typeof options === 'function') {\n cb = options;\n options = null;\n } else {\n this._mongooseOptions = options;\n }\n\n Object.assign(this, { op, model: { modelName }})\n return mockedReturn.call(this, cb);\n })\n\nconst instance = ['remove', 'save'];\n\ninstance.forEach(methodName => {\n mongoose.Model.prototype[methodName] = jest\n .fn()\n .mockImplementation(function(options, cb) {\n const op = methodName;\n const { modelName } = this.constructor;\n\n if (typeof options === 'function') {\n cb = options;\n }\n\n Object.assign(this, { op, model: { modelName } });\n\n const hooks = this.constructor.hooks;\n\n return new Promise((resolve, reject) => {\n hooks.execPre(op, this, [cb], err => {\n if (err) {\n reject(err);\n return;\n }\n\n const ret = mockedReturn.call(this, cb);\n\n if (cb) {\n hooks.execPost(op, this, [ret], err2 => {\n if (err2) {\n reject(err2);\n return;\n }\n\n resolve(ret);\n });\n } else {\n ret\n .then(ret2 => {\n hooks.execPost(op, this, [ret2], err3 => {\n if (err3) {\n reject(err3);\n return;\n }\n\n resolve(ret2);\n });\n })\n .catch(reject);\n }\n });\n });\n });\n});\n\njest.doMock('mongoose', () => mongoose);\n\n// extend a plain function, we will override it with the Proxy later\nconst proxyTarget = Object.assign(() => void 0, {\n __mocks: {},\n resetAll() {\n this.__mocks = {};\n },\n toJSON() {\n return this.__mocks;\n },\n});\n\nconst getMockController = prop => {\n return {\n toReturn(o, op = 'find') {\n proxyTarget.__mocks.hasOwnProperty(prop)\n ? (proxyTarget.__mocks[prop][op] = o)\n : (proxyTarget.__mocks[prop] = { [op]: o });\n\n return this;\n },\n\n reset(op) {\n if (op) {\n delete proxyTarget.__mocks[prop][op];\n } else {\n delete proxyTarget.__mocks[prop];\n }\n\n return this;\n },\n\n toJSON() {\n return proxyTarget.__mocks[prop] || {};\n },\n };\n};\n\nconst proxyTraps = {\n get(target, prop) {\n if (target.hasOwnProperty(prop)) {\n return Reflect.get(target, prop);\n }\n\n return getMockController(prop);\n },\n apply: (target, thisArg, [prop]) => mockModel(prop),\n};\n\nconst mockingoose = new Proxy(proxyTarget, proxyTraps);\n\n/**\n * Returns a helper with which you can set up mocks for a particular Model\n */\nconst mockModel = (model) => {\n const modelName = typeof model === 'function' ? model.modelName : model;\n if (typeof modelName === 'string') {\n return getMockController(modelName);\n } else {\n throw new Error('model must be a string or mongoose.Model');\n }\n};\n\nmodule.exports = mockingoose;\n"],"file":"index.js"} \ No newline at end of file +{"version":3,"file":"index.js","names":["mongoose","require","test","version","Promise","connect","jest","fn","mockImplementation","resolve","createConnection","mockReturnValue","catch","model","bind","on","once","then","ops","mockedReturn","cb","op","modelName","_model","_mongooseOptions","Model","mock","mockingoose","__mocks","err","Error","includes","Array","isArray","map","item","doc","e","validateSync","lean","rawResult","toObject","forEach","Query","prototype","criteria","options","callback","merge","setUpdate","arguments","length","undefined","exec","call","Aggregate","aggregate","insertMany","arr","Object","assign","instance","methodName","constructor","hooks","reject","execPre","ret","execPost","err2","ret2","err3","doMock","proxyTarget","resetAll","toJSON","getMockController","prop","toReturn","o","hasOwnProperty","reset","proxyTraps","get","target","Reflect","apply","thisArg","mockModel","Proxy","module","exports"],"sources":["../src/index.js"],"sourcesContent":["const mongoose = require('mongoose');\n\nif (!/^5/.test(mongoose.version)) {\n mongoose.Promise = Promise;\n}\n\nmongoose.connect = jest\n .fn()\n .mockImplementation(() => Promise.resolve());\n\nmongoose.createConnection = jest.fn().mockReturnValue({\n catch() {\n /* no op */\n },\n model: mongoose.model.bind(mongoose),\n on: jest.fn(),\n once: jest.fn(),\n then(resolve) {\n return Promise.resolve(resolve(this));\n },\n});\n\nconst ops = [\n 'find',\n 'findOne',\n 'count',\n 'countDocuments',\n 'estimatedDocumentCount',\n 'distinct',\n 'findOneAndUpdate',\n 'findOneAndDelete',\n 'findOneAndRemove',\n 'findOneAndReplace',\n 'remove',\n 'update',\n 'updateOne',\n 'updateMany',\n 'deleteOne',\n 'deleteMany',\n 'save',\n 'aggregate',\n];\n\nconst mockedReturn = async function(cb) {\n const {\n op,\n _model: { modelName },\n _mongooseOptions = {},\n } = this;\n const Model = mongoose.model(modelName);\n\n let mock =\n mockingoose.__mocks[modelName] && mockingoose.__mocks[modelName][op];\n\n let err = null;\n\n if (mock instanceof Error) {\n err = mock;\n }\n\n if (typeof mock === 'function') {\n mock = await mock(this);\n }\n\n if (!mock && op === 'save') {\n mock = this;\n }\n\n if (\n mock &&\n !(mock instanceof Model) &&\n ![\n 'remove',\n 'deleteOne',\n 'deleteMany',\n 'update',\n 'updateOne',\n 'updateMany',\n 'count',\n 'countDocuments',\n 'estimatedDocumentCount',\n 'distinct',\n ].includes(op)\n ) {\n mock = Array.isArray(mock)\n ? mock.map(item => new Model(item))\n : new Model(mock);\n\n if(op === 'insertMany') {\n if(!Array.isArray(mock)) mock = [mock];\n\n for(const doc of mock) {\n const e = doc.validateSync();\n if(e) throw e;\n }\n }\n\n if (_mongooseOptions.lean || _mongooseOptions.rawResult) {\n mock = Array.isArray(mock)\n ? mock.map(item => item.toObject())\n : mock.toObject();\n }\n }\n\n if (cb) {\n return cb(err, mock);\n }\n\n if (err) {\n throw err;\n }\n\n return mock;\n};\n\nops.forEach(op => {\n mongoose.Query.prototype[op] = jest\n .fn()\n .mockImplementation(function(criteria, doc, options, callback) {\n if (\n [\n 'find',\n 'findOne',\n 'count',\n 'countDocuments',\n 'remove',\n 'deleteOne',\n 'deleteMany',\n 'update',\n 'updateOne',\n 'updateMany',\n 'findOneAndUpdate',\n 'findOneAndRemove',\n 'findOneAndDelete',\n 'findOneAndReplace',\n ].includes(op) &&\n typeof criteria !== 'function'\n ) {\n // find and findOne can take conditions as the first paramter\n // ensure they make it into the Query conditions\n this.merge(criteria);\n }\n\n if (['distinct'].includes(op) && typeof doc !== 'function') {\n // distinct has the conditions as the second parameter\n this.merge(doc);\n }\n\n if (/update/i.test(op) && typeof doc !== 'function' && doc) {\n this.setUpdate(doc);\n }\n\n switch (arguments.length) {\n case 4:\n case 3:\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n break;\n case 2:\n if (typeof doc === 'function') {\n callback = doc;\n doc = criteria;\n criteria = undefined;\n }\n options = undefined;\n break;\n case 1:\n if (typeof criteria === 'function') {\n callback = criteria;\n criteria = options = doc = undefined;\n } else {\n doc = criteria;\n criteria = options = undefined;\n }\n }\n\n this.op = op;\n\n if (!callback) {\n return this;\n }\n\n return this.exec.call(this, callback);\n });\n});\n\nmongoose.Query.prototype.exec = jest.fn().mockImplementation(function(cb) {\n this._model = this.model;\n delete this.model;\n return mockedReturn.call(this, cb);\n});\n\nmongoose.Aggregate.prototype.exec = jest\n .fn()\n .mockImplementation(async function(cb) {\n const {\n _model: { modelName },\n } = this;\n\n let mock =\n mockingoose.__mocks[modelName] &&\n mockingoose.__mocks[modelName].aggregate;\n\n let err = null;\n\n if (mock instanceof Error) {\n err = mock;\n }\n\n if (typeof mock === 'function') {\n mock = await mock(this);\n }\n\n if (cb) {\n return cb(err, mock);\n }\n\n if (err) {\n throw err;\n }\n\n return mock;\n });\n\nmongoose.Model.insertMany = jest\n .fn()\n .mockImplementation(function(arr, options, cb) {\n const op = 'insertMany';\n this._model = this.model;\n delete this.model;\n const { modelName } = this;\n\n if (typeof options === 'function') {\n cb = options;\n options = null;\n } else {\n this._mongooseOptions = options;\n }\n\n Object.assign(this, { op, _model: { modelName }});\n return mockedReturn.call(this, cb);\n })\n\nconst instance = ['remove', 'save'];\n\ninstance.forEach(methodName => {\n mongoose.Model.prototype[methodName] = jest\n .fn()\n .mockImplementation(function(options, cb) {\n const op = methodName;\n this._model = this.model;\n delete this.model;\n const { modelName } = this.constructor;\n\n if (typeof options === 'function') {\n cb = options;\n }\n\n Object.assign(this, { op, _model: { modelName } });\n\n const hooks = this.constructor.hooks;\n\n return new Promise((resolve, reject) => {\n hooks.execPre(op, this, [cb], err => {\n if (err) {\n reject(err);\n return;\n }\n const ret = mockedReturn.call(this, cb);\n\n if (cb) {\n hooks.execPost(op, this, [ret], err2 => {\n if (err2) {\n reject(err2);\n return;\n }\n\n resolve(ret);\n });\n } else {\n ret\n .then(ret2 => {\n hooks.execPost(op, this, [ret2], err3 => {\n if (err3) {\n reject(err3);\n return;\n }\n\n resolve(ret2);\n });\n })\n .catch(reject);\n }\n });\n });\n });\n});\n\njest.doMock('mongoose', () => mongoose);\n\n// extend a plain function, we will override it with the Proxy later\nconst proxyTarget = Object.assign(() => void 0, {\n __mocks: {},\n resetAll() {\n this.__mocks = {};\n },\n toJSON() {\n return this.__mocks;\n },\n});\n\nconst getMockController = prop => {\n return {\n toReturn(o, op = 'find') {\n proxyTarget.__mocks.hasOwnProperty(prop)\n ? (proxyTarget.__mocks[prop][op] = o)\n : (proxyTarget.__mocks[prop] = { [op]: o });\n\n return this;\n },\n\n reset(op) {\n if (op) {\n delete proxyTarget.__mocks[prop][op];\n } else {\n delete proxyTarget.__mocks[prop];\n }\n\n return this;\n },\n\n toJSON() {\n return proxyTarget.__mocks[prop] || {};\n },\n };\n};\n\nconst proxyTraps = {\n get(target, prop) {\n if (target.hasOwnProperty(prop)) {\n return Reflect.get(target, prop);\n }\n\n return getMockController(prop);\n },\n apply: (target, thisArg, [prop]) => mockModel(prop),\n};\n\nconst mockingoose = new Proxy(proxyTarget, proxyTraps);\n\n/**\n * Returns a helper with which you can set up mocks for a particular Model\n */\nconst mockModel = (model) => {\n const modelName = typeof model === 'function' ? model.modelName : model;\n if (typeof modelName === 'string') {\n return getMockController(modelName);\n } else {\n throw new Error('model must be a string or mongoose.Model');\n }\n};\n\nmodule.exports = mockingoose;\n"],"mappings":"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"} \ No newline at end of file diff --git a/src/index.js b/src/index.js index 085c826..951d725 100644 --- a/src/index.js +++ b/src/index.js @@ -44,7 +44,7 @@ const ops = [ const mockedReturn = async function(cb) { const { op, - model: { modelName }, + _model: { modelName }, _mongooseOptions = {}, } = this; const Model = mongoose.model(modelName); @@ -187,6 +187,8 @@ ops.forEach(op => { }); mongoose.Query.prototype.exec = jest.fn().mockImplementation(function(cb) { + this._model = this.model; + delete this.model; return mockedReturn.call(this, cb); }); @@ -226,6 +228,8 @@ mongoose.Model.insertMany = jest .fn() .mockImplementation(function(arr, options, cb) { const op = 'insertMany'; + this._model = this.model; + delete this.model; const { modelName } = this; if (typeof options === 'function') { @@ -235,7 +239,7 @@ mongoose.Model.insertMany = jest this._mongooseOptions = options; } - Object.assign(this, { op, model: { modelName }}) + Object.assign(this, { op, _model: { modelName }}); return mockedReturn.call(this, cb); }) @@ -246,13 +250,15 @@ instance.forEach(methodName => { .fn() .mockImplementation(function(options, cb) { const op = methodName; + this._model = this.model; + delete this.model; const { modelName } = this.constructor; if (typeof options === 'function') { cb = options; } - Object.assign(this, { op, model: { modelName } }); + Object.assign(this, { op, _model: { modelName } }); const hooks = this.constructor.hooks; @@ -262,7 +268,6 @@ instance.forEach(methodName => { reject(err); return; } - const ret = mockedReturn.call(this, cb); if (cb) {