89 lines
12 KiB
JavaScript
89 lines
12 KiB
JavaScript
|
"use strict";
|
||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
|
};
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const events_1 = require("events");
|
||
|
const delay_1 = __importDefault(require("../utils/delay"));
|
||
|
const thennable_1 = require("../utils/thennable");
|
||
|
const test_run_1 = require("../errors/test-run");
|
||
|
const re_executable_promise_1 = __importDefault(require("../utils/re-executable-promise"));
|
||
|
const get_fn_1 = __importDefault(require("./get-fn"));
|
||
|
const marker_1 = require("../services/serialization/replicator/transforms/function-marker-transform/marker");
|
||
|
const marker_2 = require("../services/serialization/replicator/transforms/promise-marker-transform/marker");
|
||
|
const ASSERTION_DELAY = 200;
|
||
|
class AssertionExecutor extends events_1.EventEmitter {
|
||
|
constructor(command, timeout, callsite) {
|
||
|
super();
|
||
|
this.command = command;
|
||
|
this.timeout = timeout;
|
||
|
this.callsite = callsite;
|
||
|
this.startTime = null;
|
||
|
this.passed = false;
|
||
|
this.inRetry = false;
|
||
|
const fn = (0, get_fn_1.default)(this.command);
|
||
|
const actualCommand = this.command.actual;
|
||
|
if (actualCommand instanceof re_executable_promise_1.default)
|
||
|
this.fn = this._wrapFunction(fn);
|
||
|
else if (!this.command.options.allowUnawaitedPromise && this._isPromise(actualCommand))
|
||
|
throw new test_run_1.AssertionUnawaitedPromiseError(this.callsite);
|
||
|
else
|
||
|
this.fn = fn;
|
||
|
}
|
||
|
_isPromise(val) {
|
||
|
return (0, thennable_1.isThennable)(val) ||
|
||
|
val === Symbol.for(marker_2.PROMISE_MARKER_DESCRIPTION);
|
||
|
}
|
||
|
_getTimeLeft() {
|
||
|
const executionTime = new Date().getTime() - this.startTime; // eslint-disable-line @typescript-eslint/no-extra-parens
|
||
|
return this.timeout - executionTime;
|
||
|
}
|
||
|
_onExecutionFinished() {
|
||
|
if (this.inRetry)
|
||
|
this.emit('end-assertion-retries', this.passed);
|
||
|
}
|
||
|
_wrapFunction(fn) {
|
||
|
return async () => {
|
||
|
const resultPromise = this.command.actual;
|
||
|
while (!this.passed) {
|
||
|
this.command.actual = await resultPromise._reExecute();
|
||
|
try {
|
||
|
fn();
|
||
|
this.passed = true;
|
||
|
this._onExecutionFinished();
|
||
|
}
|
||
|
catch (err) {
|
||
|
if (this._getTimeLeft() <= 0) {
|
||
|
this._onExecutionFinished();
|
||
|
throw err;
|
||
|
}
|
||
|
await (0, delay_1.default)(ASSERTION_DELAY);
|
||
|
this.inRetry = true;
|
||
|
this.emit('start-assertion-retries', this._getTimeLeft());
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
_onBeforeRun() {
|
||
|
if (this.command.actual !== Symbol.for(marker_1.FUNCTION_MARKER_DESCRIPTION))
|
||
|
return;
|
||
|
this.emit('non-serializable-actual-value', this);
|
||
|
}
|
||
|
async run() {
|
||
|
this._onBeforeRun();
|
||
|
this.startTime = new Date().getTime();
|
||
|
try {
|
||
|
await this.fn();
|
||
|
}
|
||
|
catch (err) {
|
||
|
if (err.name === 'AssertionError' || err.constructor.name === 'AssertionError')
|
||
|
throw new test_run_1.ExternalAssertionLibraryError(err, this.callsite);
|
||
|
if (err.isTestCafeError)
|
||
|
err.callsite = this.callsite;
|
||
|
throw err;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exports.default = AssertionExecutor;
|
||
|
module.exports = exports.default;
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0aW9ucy9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFzQztBQUN0QywyREFBbUM7QUFDbkMsa0RBQWlEO0FBQ2pELGlEQUFtRztBQUNuRywyRkFBaUU7QUFDakUsc0RBQTZCO0FBRzdCLDZHQUErSDtBQUMvSCw0R0FBNkg7QUFFN0gsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRTVCLE1BQXFCLGlCQUFrQixTQUFRLHFCQUFZO0lBU3ZELFlBQW9CLE9BQXlCLEVBQUUsT0FBZSxFQUFFLFFBQXdCO1FBQ3BGLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLE9BQU8sR0FBSSxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBSSxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBTSxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBSyxLQUFLLENBQUM7UUFFdkIsTUFBTSxFQUFFLEdBQWMsSUFBQSxnQkFBSyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUUxQyxJQUFJLGFBQWEsWUFBWSwrQkFBbUI7WUFDNUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUNsRixNQUFNLElBQUkseUNBQThCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUV4RCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sVUFBVSxDQUFFLEdBQVk7UUFDNUIsT0FBTyxJQUFBLHVCQUFXLEVBQUMsR0FBRyxDQUFDO1lBQ25CLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLG1DQUEwQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLFlBQVk7UUFDaEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBSSxJQUFJLENBQUMsU0FBb0IsQ0FBQyxDQUFDLHlEQUF5RDtRQUVsSSxPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxhQUFhLENBQUUsRUFBWTtRQUMvQixPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ2QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUE2QixDQUFDO1lBRWpFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFdkQsSUFBSTtvQkFDQSxFQUFFLEVBQUUsQ0FBQztvQkFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztvQkFDbkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7aUJBQy9CO2dCQUVELE9BQU8sR0FBRyxFQUFFO29CQUNSLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRTt3QkFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7d0JBQzVCLE1BQU0sR0FBRyxDQUFDO3FCQUNiO29CQUVELE1BQU0sSUFBQSxlQUFLLEVBQUMsZUFBZSxDQUFDLENBQUM7b0JBRTdCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2lCQUM3RDthQUNKO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLFlBQVk7UUFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUEyQixDQUFDO1lBQy9ELE9BQU87UUFFWCxJQUFJLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRztRQUNaLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFdEMsSUFBSTtZQUNBLE1BQU0sSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxHQUFRLEVBQUU7WUFDYixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCO2dCQUMxRSxNQUFNLElBQUksd0NBQTZCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVoRSxJQUFJLEdBQUcsQ0FBQyxlQUFlO2dCQUNuQixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFFakMsTUFBTSxHQUFHLENBQUM7U0FDYjtJQUNMLENBQUM7Q0FDSjtBQXJHRCxvQ0FxR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IGRlbGF5IGZyb20gJy4uL3V0aWxzL2RlbGF5JztcbmltcG9ydCB7IGlzVGhlbm5hYmxlIH0gZnJvbSAnLi4vdXRpbHMvdGhlbm5hYmxlJztcbmltcG9ydCB7IEV4dGVybmFsQXNzZXJ0aW9uTGlicmFyeUVycm9yLCBBc3NlcnRpb25VbmF3YWl0ZWRQcm9taXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4nO1xuaW1wb3J0IFJlRXhlY3V0YWJsZVByb21pc2UgZnJvbSAnLi4vdXRpbHMvcmUtZXhlY3V0YWJsZS1wcm9taXNlJztcbmltcG9ydCBnZXRGbiBmcm9tICcuL2dldC1mbic7XG5pbXBvcnQgeyBBc3NlcnRpb25Db21tYW5kIH0gZnJvbSAnLi4vdGVzdC1ydW4vY29tbWFuZHMvYXNzZXJ0aW9uJztcbmltcG9ydCB7IENhbGxzaXRlUmVjb3JkIH0gZnJvbSAnY2FsbHNpdGUtcmVjb3JkJ
|