"use strict"; /** * Contains classes and functions to save executed tests data. * * @module */ var expect = require("chai").expect; /** * Test case data structure. * * Contains full information and history about test case. * * @class * @arg {string} name - Test name. * @prop {string} name - Test name. * @prop {string} [status=NOT_STARTED] - Test status. * @prop {?string} [skipChunk=null] - Name of currently skipped chunk. * @prop {string[]} [screenshots=[]] - List of test screenshot paths. * @prop {string[]} [videos=[]] - List of test video paths. * @prop {string[]} [errors=[]] - List of test errors. * @prop {string[]} [rawInfo=[]] - List of additional test details. * @prop {object} [testParams={}] - Dict of test parameters. */ var TestCase = module.exports.TestCase = function (name, id) { this.duration = 0; this.name = name; this.id = id; this.status = TestCase.NOT_STARTED; this.skipChunk = null; this.chunks = []; this.passedChunkIds = []; this.reset(); }; /** * Starts test case. * * @method */ TestCase.prototype.start = function () { expect(this.status, `test case '${this.name}' is started already`) .to.not.be.equal(TestCase.IN_PROGRESS); this._startTime = new Date(); this.status = TestCase.IN_PROGRESS; }; /** * Ends test case. * * @method * @arg {string} status - Test case status. */ TestCase.prototype.end = function (status) { expect(this.status, `test case '${this.name}' isn't started yet`) .to.be.equal(TestCase.IN_PROGRESS); this.duration += new Date() - this._startTime; this.status = status; }; /** * Resets test case info. * * @method */ TestCase.prototype.reset = function () { this.screenshots = []; this.videos = []; this.errors = []; this.rawInfo = []; this.testParams = {}; }; /** * Adds passed chunk id. * * @method * @arg {string} chunkId - Chunk id. */ TestCase.prototype.addPassedChunkId = function (chunkId) { if (!chunkId || this.passedChunkIds.includes(chunkId)) return; this.passedChunkIds.push(chunkId); }; /** * Adds passed chunk ids. * * @method * @arg {array<string>} chunkIds - Chunk ids. */ TestCase.prototype.addPassedChunkIds = function (chunkIds) { for (const chunkId of chunkIds) this.addPassedChunkId(chunkId); }; /** * Adds error to test case. * * @method * @arg {Error} err - Test error. */ TestCase.prototype.addError = function (err) { this.errors.push(err); }; /** * Adds screenshot. * * @method * @arg {string} imagePath - Path to saved screenshot. */ TestCase.prototype.addScreenshot = function (imagePath) { this.screenshots.push(imagePath); }; /** * Adds video. * * @method * @arg {string} videoPath - Path to saved video. */ TestCase.prototype.addVideo = function (videoPath) { this.videos.push(videoPath); }; /** * Adds additional information. * * @method * @arg {string} info - Additional information. */ TestCase.prototype.addDetails = function (info) { this.rawInfo.push(info); }; /** * Adds chunk. * * @method * @arg {string} chunkName - Name of chunk. */ TestCase.prototype.addChunk = function (chunkName) { this.chunks.push(chunkName); }; TestCase.NOT_STARTED = "not started"; TestCase.IN_PROGRESS = "in progress"; TestCase.FAILED = "failed"; TestCase.PASSED = "passed"; TestCase.SKIPPED = "skipped"; /** * Class defining mochajs scope name and type. */ class ScopeType extends String { /** * Set mochajs scope type. * @arg {string} type - Supported values are `scope`, `suite`, `test`. */ setType (type) { this.type = type; return this; } }; module.exports.ScopeType = ScopeType;