UNPKG

e2ed

Version:

E2E testing framework over Playwright

85 lines (84 loc) 4.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createExpectMethod = void 0; const internal_1 = require("../../constants/internal"); const config_1 = require("../config"); const error_1 = require("../error"); const getDurationWithUnits_1 = require("../getDurationWithUnits"); const log_1 = require("../log"); const object_1 = require("../object"); const promise_1 = require("../promise"); const selectors_1 = require("../selectors"); const typeGuards_1 = require("../typeGuards"); const valueToString_1 = require("../valueToString"); const additionalMatchers_1 = require("./additionalMatchers"); const applyAdditionalMatcher_1 = require("./applyAdditionalMatcher"); const test_1 = require("@playwright/test"); const additionalAssertionTimeoutInMs = 1_000; /** * Creates method of `Expect` class. * @internal */ const createExpectMethod = (key, getAssertionMessage) => // eslint-disable-next-line no-restricted-syntax function method(...args) { const { assertionTimeout } = (0, config_1.getFullPackConfig)(); const timeout = assertionTimeout + additionalAssertionTimeoutInMs; const message = getAssertionMessage === undefined ? key : getAssertionMessage(...args); const selectorPropertyRetryData = this.actualValue?.[internal_1.RETRY_KEY]; const timeoutWithUnits = (0, getDurationWithUnits_1.getDurationWithUnits)(timeout); const timeoutError = new error_1.E2edError(`"${key}" assertion promise rejected after ${timeoutWithUnits} timeout`); const runAssertion = (value) => { const additionalMatcher = additionalMatchers_1.additionalMatchers[key]; const ctx = { actualValue: value, description: this.description }; if (additionalMatcher !== undefined) { return (0, promise_1.addTimeoutToPromise)((0, applyAdditionalMatcher_1.applyAdditionalMatcher)(additionalMatcher, ctx, args, selectorPropertyRetryData), timeout, timeoutError).catch((assertError) => { (0, object_1.setReadonlyProperty)(ctx, 'error', assertError); return ctx; }); } const assertion = (0, test_1.expect)(value, ctx.description); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return (0, promise_1.addTimeoutToPromise)(assertion[key](...args), timeout, timeoutError).then(() => ctx, (assertError) => { (0, object_1.setReadonlyProperty)(ctx, 'error', assertError); return ctx; }); }; const assertionPromise = internal_1.RESOLVED_PROMISE.then(() => { if ((0, typeGuards_1.isThenable)(this.actualValue)) { return (0, promise_1.addTimeoutToPromise)(this.actualValue, timeout, timeoutError).then(runAssertion); } return runAssertion(this.actualValue); }); return assertionPromise.then(({ actualValue, additionalLogFields, error }) => { const logMessage = `Assert: ${this.description}`; const logPayload = { assertionArguments: args, ...additionalLogFields, error: error?.message === undefined ? undefined : (0, valueToString_1.removeStyleFromString)(error.message), logEventStatus: error ? "failed" /* LogEventStatus.Failed */ : "passed" /* LogEventStatus.Passed */, selector: selectorPropertyRetryData?.selector.description ?? (this.actualValue instanceof selectors_1.Selector ? this.actualValue.description : undefined), ...(selectorPropertyRetryData ? { selectorProperty: selectorPropertyRetryData.property, selectorPropertyArgs: selectorPropertyRetryData.args, } : undefined), }; return (0, promise_1.addTimeoutToPromise)(Promise.resolve(actualValue), timeout, timeoutError) .then((value) => (0, log_1.log)(logMessage, { actualValue: value, assertion: (0, valueToString_1.wrapStringForLogs)(`value ${(0, valueToString_1.valueToString)(value)} ${message}`), ...logPayload, }, 6 /* LogEventType.InternalAssert */), (actualValueResolveError) => { (0, log_1.log)(logMessage, { actualValueResolveError, ...logPayload }, 6 /* LogEventType.InternalAssert */); }) .then(() => { if (error) { throw error; } }); }); }; exports.createExpectMethod = createExpectMethod;