'use strict'; const path = require('path'); const sinon = require('sinon'); // Set up chai as promised to allow for // better testing of promises, // set up sinon-chai for better integration // of sinon for spies, stubs and mocks const chai = require('chai'); const chaiAsPromised = require('chai-as-promised'); const sinonChai = require('sinon-chai'); chai.use(chaiAsPromised); chai.use(sinonChai); /** * Base Object for unit test utilities */ const testBase = { /** * Chai expect assertion library */ expect: chai.expect, /** * Sinon library for spies, stubs, and mocks */ sinon: sinon, /** * Determine the appropriate path to a module relative to the root folder * * @param {String} modulePath - the raw path to the module * @return {String} - the normalized path to the module */ _normalizeIncludePath(modulePath) { const basePath = path.resolve(path.join(__dirname, '../')); let includePath = modulePath; // Allow referencing local modules without using a ./ // eg. util/route-loader instead of ./util/route-loader if (modulePath.includes('/') && ! modulePath.startsWith('./')) { includePath = path.join(basePath, modulePath); } return includePath; }, /** * Load a module relative to the root folder * * @param {String} modulePath - path to the module, relative to the tests/ folder * @return {mixed} - whatever the module returns */ require(modulePath) { const includePath = testBase._normalizeIncludePath(modulePath); return require(includePath); }, /** * Load a module relative to the root folder, but first delete * the module from the require cache * * @param {String} modulePath - path to the module, relative to the tests/ folder * @return {mixed} - whatever the module returns */ requireNoCache(modulePath) { const includePath = testBase._normalizeIncludePath(modulePath); delete require.cache[includePath]; return require(includePath); }, }; module.exports = testBase;