testcafe
Version:
Automated browser testing for the modern web development stack.
80 lines • 10.7 kB
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 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);
}
_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());
}
}
};
}
async run() {
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0aW9ucy9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFzQztBQUN0QywyREFBbUM7QUFDbkMsa0RBQWlEO0FBQ2pELGlEQUFtRztBQUNuRywyRkFBaUU7QUFDakUsc0RBQTZCO0FBSTdCLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUU1QixNQUFxQixpQkFBa0IsU0FBUSxxQkFBWTtJQVN2RCxZQUFvQixPQUF5QixFQUFFLE9BQWUsRUFBRSxRQUF3QjtRQUNwRixLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxPQUFPLEdBQUksT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUksT0FBTyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQU0sS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUssS0FBSyxDQUFDO1FBRXZCLE1BQU0sRUFBRSxHQUFjLElBQUEsZ0JBQUssRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFMUMsSUFBSSxhQUFhLFlBQVksK0JBQW1CO1lBQzVDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDbEYsTUFBTSxJQUFJLHlDQUE4QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7WUFFeEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVPLFVBQVUsQ0FBRSxHQUFZO1FBQzVCLE9BQU8sSUFBQSx1QkFBVyxFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxZQUFZO1FBQ2hCLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUksSUFBSSxDQUFDLFNBQW9CLENBQUMsQ0FBQyx5REFBeUQ7UUFFbEksT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU87WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sYUFBYSxDQUFFLEVBQVk7UUFDL0IsT0FBTyxLQUFLLElBQUksRUFBRTtZQUNkLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBNkIsQ0FBQztZQUVqRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBRXZELElBQUk7b0JBQ0EsRUFBRSxFQUFFLENBQUM7b0JBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQ25CLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2lCQUMvQjtnQkFFRCxPQUFPLEdBQUcsRUFBRTtvQkFDUixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUU7d0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUM1QixNQUFNLEdBQUcsQ0FBQztxQkFDYjtvQkFFRCxNQUFNLElBQUEsZUFBSyxFQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUU3QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjtRQUNMLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRztRQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0QyxJQUFJO1lBQ0EsTUFBTSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDbkI7UUFFRCxPQUFPLEdBQVEsRUFBRTtZQUNiLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxnQkFBZ0I7Z0JBQzFFLE1BQU0sSUFBSSx3Q0FBNkIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWhFLElBQUksR0FBRyxDQUFDLGVBQWU7Z0JBQ25CLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUVqQyxNQUFNLEdBQUcsQ0FBQztTQUNiO0lBQ0wsQ0FBQztDQUNKO0FBM0ZELG9DQTJGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgZGVsYXkgZnJvbSAnLi4vdXRpbHMvZGVsYXknO1xuaW1wb3J0IHsgaXNUaGVubmFibGUgfSBmcm9tICcuLi91dGlscy90aGVubmFibGUnO1xuaW1wb3J0IHsgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IsIEFzc2VydGlvblVuYXdhaXRlZFByb21pc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bic7XG5pbXBvcnQgUmVFeGVjdXRhYmxlUHJvbWlzZSBmcm9tICcuLi91dGlscy9yZS1leGVjdXRhYmxlLXByb21pc2UnO1xuaW1wb3J0IGdldEZuIGZyb20gJy4vZ2V0LWZuJztcbmltcG9ydCB7IEFzc2VydGlvbkNvbW1hbmQgfSBmcm9tICcuLi90ZXN0LXJ1bi9jb21tYW5kcy9hc3NlcnRpb24nO1xuaW1wb3J0IHsgQ2FsbHNpdGVSZWNvcmQgfSBmcm9tICdAZGV2ZXhwcmVzcy9jYWxsc2l0ZS1yZWNvcmQnO1xuXG5jb25zdCBBU1NFUlRJT05fREVMQVkgPSAyMDA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzc2VydGlvbkV4ZWN1dG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogQXNzZXJ0aW9uQ29tbWFuZDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZDtcbiAgICBwcml2YXRlIHN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbDtcbiAgICBwcml2YXRlIHBhc3NlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGluUmV0cnk6IGJvb2xlYW47XG4gICAgcHVibGljIGZuOiBGdW5jdGlvbjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoY29tbWFuZDogQXNzZXJ0aW9uQ29tbWFuZCwgdGltZW91dDogbnVtYmVyLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmNvbW1hbmQgID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy50aW1lb3V0ICA9IHRpbWVvdXQ7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcblxuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGFzc2VkICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5SZXRyeSAgID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZm4gICAgICAgICAgICA9IGdldEZuKHRoaXMuY29tbWFuZCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbENvbW1hbmQgPSB0aGlzLmNvbW1hbmQuYWN0dWFsO1xuXG4gICAgICAgIGlmIChhY3R1YWxDb21tYW5kIGluc3RhbmNlb2YgUmVFeGVjdXRhYmxlUHJvbWlzZSlcbiAgICAgICAgICAgIHRoaXMuZm4gPSB0aGlzLl93cmFwRnVuY3Rpb24oZm4pO1xuICAgICAgICBlbHNlIGlmICghdGhpcy5jb21tYW5kLm9wdGlvbnMuYWxsb3dVbmF3YWl0ZWRQcm9taXNlICYmIHRoaXMuX2lzUHJvbWlzZShhY3R1YWxDb21tYW5kKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25VbmF3YWl0ZWRQcm9taXNlRXJyb3IodGhpcy5jYWxsc2l0ZSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZm4gPSBmbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc1Byb21pc2UgKHZhbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNUaGVubmFibGUodmFsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUaW1lTGVmdCAoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gKHRoaXMuc3RhcnRUaW1lIGFzIG51bWJlcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhLXBhcmVuc1xuXG4gICAgICAgIHJldHVybiB0aGlzLnRpbWVvdXQgLSBleGVjdXRpb25UaW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uRXhlY3V0aW9uRmluaXNoZWQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pblJldHJ5KVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdlbmQtYXNzZXJ0aW9uLXJldHJpZXMnLCB0aGlzLnBhc3NlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JhcEZ1bmN0aW9uIChmbjogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRQcm9taXNlID0gdGhpcy5jb21tYW5kLmFjdHVhbCBhcyBSZUV4ZWN1dGFibGVQcm9taXNlO1xuXG4gICAgICAgICAgICB3aGlsZSAoIXRoaXMucGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tYW5kLmFjdHVhbCA9IGF3YWl0IHJlc3VsdFByb21pc2UuX3JlRXhlY3V0ZSgpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkV4ZWN1dGlvbkZpbmlzaGVkKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ2V0VGltZUxlZnQoKSA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkV4ZWN1dGlvbkZpbmlzaGVkKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShBU1NFUlRJT05fREVMQVkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5SZXRyeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhcnQtYXNzZXJ0aW9uLXJldHJpZXMnLCB0aGlzLl9nZXRUaW1lTGVmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1biAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQXNzZXJ0aW9uRXJyb3InIHx8IGVyci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXNzZXJ0aW9uRXJyb3InKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcihlcnIsIHRoaXMuY2FsbHNpdGUpO1xuXG4gICAgICAgICAgICBpZiAoZXJyLmlzVGVzdENhZmVFcnJvcilcbiAgICAgICAgICAgICAgICBlcnIuY2FsbHNpdGUgPSB0aGlzLmNhbGxzaXRlO1xuXG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=