e2ed
Version:
E2E testing framework over Playwright
83 lines (82 loc) • 4.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createExpectMethod = void 0;
const internal_1 = require("../../constants/internal");
const asserts_1 = require("../asserts");
const config_1 = require("../config");
const error_1 = require("../error");
const generalLog_1 = require("../generalLog");
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 getAssertionPromise_1 = require("./getAssertionPromise");
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 assertionMessage = getAssertionMessage === undefined ? key : getAssertionMessage(...args);
const message = `Assert: ${this.description}`;
const selectorPropertyRetryData = this.actualValue?.[internal_1.RETRY_KEY];
const printedValue = (0, typeGuards_1.isThenable)(this.actualValue) ? '<Thenable>' : this.actualValue;
const logEvent = (0, log_1.logAndGetLogEvent)(message, {
actualValue: printedValue,
assertion: (0, valueToString_1.wrapStringForLogs)(`value ${(0, valueToString_1.valueToString)(printedValue)} ${assertionMessage}`),
assertionArguments: args,
selector: selectorPropertyRetryData?.selector.description ??
(this.actualValue instanceof selectors_1.Selector ? this.actualValue.description : undefined),
...(selectorPropertyRetryData
? {
selectorProperty: selectorPropertyRetryData.property,
selectorPropertyArgs: selectorPropertyRetryData.args,
}
: undefined),
}, 6 /* LogEventType.InternalAssert */);
(0, asserts_1.assertValueIsDefined)(logEvent, 'logEvent is defined', { args, message, ...this });
const { payload } = logEvent;
(0, asserts_1.assertValueIsDefined)(payload, 'payload is defined', { args, message, ...this });
const timeoutError = new error_1.E2edError(`"${key}" assertion promise rejected after ${(0, getDurationWithUnits_1.getDurationWithUnits)(timeout)} timeout`);
const assertionPromise = (0, getAssertionPromise_1.getAssertionPromise)({
args,
context: this,
key: key,
selectorPropertyRetryData,
timeout,
timeoutError,
});
return assertionPromise.then(({ actualValue, additionalLogFields, error }) => {
const additionalPayload = {
...additionalLogFields,
error: error?.message === undefined ? undefined : (0, valueToString_1.removeStyleFromString)(error.message),
logEventStatus: error ? "failed" /* LogEventStatus.Failed */ : "passed" /* LogEventStatus.Passed */,
};
Object.assign(payload, additionalPayload);
return (0, promise_1.addTimeoutToPromise)(Promise.resolve(actualValue), timeout, timeoutError)
.then((value) => {
Object.assign(payload, Object.assign(additionalPayload, {
actualValue: value,
assertion: (0, valueToString_1.wrapStringForLogs)(`value ${(0, valueToString_1.valueToString)(value)} ${assertionMessage}`),
}));
(0, object_1.setReadonlyProperty)(logEvent, 'endTime', Date.now());
}, (actualValueResolveError) => {
Object.assign(payload, Object.assign(additionalPayload, { actualValueResolveError }));
(0, object_1.setReadonlyProperty)(logEvent, 'endTime', Date.now());
})
.then(() => {
(0, generalLog_1.generalLog)(`Assert "${this.description}" completed`, additionalPayload);
if (error) {
throw error;
}
});
});
};
exports.createExpectMethod = createExpectMethod;