"use strict"; /** * Contains global framework functions and helpers. * * @module */ var util = require("util"); var chai = require("chai"); var sinon = require("sinon"); chai.use(require("chai-as-promised")); chai.use(require("chai-datetime")); chai.use(require("chai-fs")); chai.use(require("chai-string")); chai.use(require("sinon-chai")); require("../matcher"); var CONF = require("../config"); var plugins = require("../plugins"); var Steps = require("../steps"); var ScopeType = require("../testing").ScopeType; if (CONF.report.deepErrors) { chai.config.truncateThreshold = 0; } /** * `chaijs` `expect` function. * * @global * @function * @arg {*} actualValue - Some actual value which should be checked. * @see {@link http://chaijs.com/|chaijs} to get more details about * `expect` usage. * @example expect(1).to.be.equal(1); expect(2).to.be.gte(0); */ global.expect = chai.expect; /** * `SinonJS` is pretty nice lib for mocking. * * @global */ global.sinon = sinon; var stubObject = (obj, returns, processed) => { processed = processed || []; processed.push(obj); for (var prop in obj) { if (prop.startsWith("__") || ["prototype", "constructor"].includes(prop)) { continue; } if (util.isFunction(obj[prop])) { obj[prop] = sinon.stub(); if (returns) { if (util.isObject(returns)) { if (prop in returns) obj[prop].returns(returns[prop]); } else { obj[prop].returns(returns); } } } if (util.isObject(obj[prop]) && !processed.includes(obj[prop])) { obj[prop] = stubObject(obj[prop], returns, processed); } } return obj; }; /** * Stubs object with its properties recursively. * * @global * @arg {object} obj - Object to stub. * @arg {object|number|string} returns - Returned values. * @return {object} Object with stubbed functions. */ global.stubObject = stubObject; require("rehire").global(); /** * `GlaceJS` config. * * @global * @see {@link module:config|config} to get more details about its options. */ global.CONF = CONF; /** * Allure helper. * * @global */ global.allure = require("../allure"); /** * Steps collection. * * @global * @type {Steps} * @see {@link module:steps/index|steps} to get more details about its methods. */ global.$ = Steps.getInstance(); global.scope = require("./scope"); /** * Creates tests suite. * * @global * @function * @arg {string} name - Suite name. * @arg {function[]} [fixtures] - List of fixtures. * @arg {object} [opts] - Suite options. * @arg {number} [opts.chunkRetry] - Number of chunk retries on failure. * @arg {number} [opts.chunkTimeout] - Time to execute chunk or hook, sec. * @arg {function} func - Callback function with test cases. * @example suite("Some test suite", () => { test("Some test name", () => { before(() => { someFunc(); }); chunk("chunk #1", () => { someFunc(); }); chunk("chunk #2", () => { someFunc(); }); }); }); */ global.suite = (name, fixtures, opts, func) => { scope(new ScopeType(name).setType("suite"), fixtures, opts, func); }; global.session = require("./session"); global.test = require("./test"); global.jaki = global.jaki_chunk = global.chunk = require("./chunk"); global.forEachLanguage = require("./forEachLanguage"); /** * Global function, existing in `glace` tests, which create `before` hook. * * `before` hook executes before all chunks in test or all tests in <a href="#scope">scope</a> / * <a href="#suite">suite</a> / <a href="#session">session</a>. * * @global * @function before * @arg {function} func - Hook function. Can be `async` too. * * @example <caption><b>before chunks</b></caption> * * test("my test", () => { * * before(() => { * doSomeThing(); * }); * * chunk("first chunk", () => { * doSomeThingAgain(); * }); * * chunk("second chunk", () => { * andDoSomeThingAgain(); * }); * }); * * @example <caption><b>before tests</b></caption> * * suite("my suite", () => { * * before(async () => { * await db.connect(); * }); * * test("first", () => { * chunk(async () => { * await db.query("select * from users"); * }); * }); * * test("second", () => { * chunk(async () => { * await db.query("select * from products"); * }); * }); * }); */ /** * Global function, existing in `glace` tests, which create `after` hook. * * `after` hook executes after all chunks in test or all tests in <a href="#scope">scope</a> / * <a href="#suite">suite</a> / <a href="#session">session</a>. * * @global * @function after * @arg {function} func - Hook function. Can be `async` too. * * @example <caption><b>after chunks</b></caption> * * test("my test", () => { * * after(() => { * doSomeThing(); * }); * * chunk("first chunk", () => { * doSomeThingAgain(); * }); * * chunk("second chunk", () => { * andDoSomeThingAgain(); * }); * }); * * @example <caption><b>after tests</b></caption> * * suite("my suite", () => { * * after(async () => { * await db.connect(); * }); * * test("first", () => { * chunk(async () => { * await db.query("select * from users"); * }); * }); * * test("second", () => { * chunk(async () => { * await db.query("select * from products"); * }); * }); * }); */ /** * Global function, existing in `glace` tests, which creates `beforeChunk` hook. * * `beforeChunk` hook executes before each chunk in test. * * @global * @function * @arg {function} func - Hook function. * * @example * * test("Some test", () => { * * beforeChunk(() => { * someFunc(); * }); * * chunk("Chunk #1", () => { * someFunc(); * }); * * chunk("Chunk #2", () => { * someFunc(); * }); * }); */ global.beforeChunk = beforeEach; /** * Global function, existing in `glace` tests, which creates `afterChunk` hook. * * `afterChunk` hook executes after each chunk in test. * * @global * @function * @arg {function} func - Hook function. * * @example * * test("Some test", () => { * * afterChunk(() => { * someFunc(); * }); * * chunk("Chunk #1", () => { * someFunc(); * }); * * chunk("Chunk #2", () => { * someFunc(); * }); * }); */ global.afterChunk = afterEach; /* Load globals from plugins */ plugins.getModules("globals");