@oskarer/enzyme-wait
Version:
Wait for an async element to appear when performing integration tests with enzyme.
55 lines (42 loc) • 1.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createWaitForElement = undefined;
var _assertionError = require("assertion-error");
var _assertionError2 = _interopRequireDefault(_assertionError);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const DISPLAY_NAME = "waitForElement";
const createWaitForElement = exports.createWaitForElement = function (selector) {
let enzymeFunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "find";
let maxTime = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2000;
let interval = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
return rootComponent => {
// Check correct usage
if (!selector) {
return Promise.reject(new _assertionError2.default(`No selector specified in ${DISPLAY_NAME}.`));
}
if (!rootComponent) {
return Promise.reject(new _assertionError2.default(`No root component specified in ${DISPLAY_NAME}.`));
}
if (!rootComponent.length) {
return Promise.reject(new _assertionError2.default(`Specified root component in ${DISPLAY_NAME} not found.`));
}
// Race component search against maxTime
return new Promise((resolve, reject) => {
let remainingTime = maxTime;
const intervalId = setInterval(() => {
if (remainingTime < 0) {
clearInterval(intervalId);
return reject(new _assertionError2.default(`Expected to find ${selector} within ${maxTime}ms, but it was never found.`));
}
const targetComponent = rootComponent.update()[enzymeFunction](selector);
if (targetComponent.length) {
clearInterval(intervalId);
return resolve(targetComponent);
}
remainingTime = remainingTime - interval;
}, interval);
});
};
};