e2ed
Version:
E2E testing framework over Playwright
85 lines (84 loc) • 4.46 kB
JavaScript
;
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;