@testing-library/vue
Version:
Simple and complete Vue DOM testing utilities that encourage good testing practices.
87 lines (85 loc) • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fireEvent = fireEvent;
var _dom = require("@testing-library/dom");
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } /* eslint-disable testing-library/no-wait-for-empty-callback */
// Vue Testing Lib's version of fireEvent will call DOM Testing Lib's
// version of fireEvent. The reason is because we need to wait another
// event loop tick to allow Vue to flush and update the DOM
// More info: https://vuejs.org/v2/guide/reactivity.html#Async-Update-Queue
function fireEvent() {
return _fireEvent.apply(this, arguments);
}
function _fireEvent() {
_fireEvent = _asyncToGenerator(function* () {
(0, _dom.fireEvent)(...arguments);
yield (0, _dom.waitFor)(() => {});
});
return _fireEvent.apply(this, arguments);
}
Object.keys(_dom.fireEvent).forEach(key => {
fireEvent[key] = /*#__PURE__*/_asyncToGenerator(function* () {
warnOnChangeOrInputEventCalledDirectly(arguments.length <= 1 ? undefined : arguments[1], key);
_dom.fireEvent[key](...arguments);
yield (0, _dom.waitFor)(() => {});
});
});
fireEvent.touch = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator(function* (elem) {
yield fireEvent.focus(elem);
yield fireEvent.blur(elem);
});
return function (_x) {
return _ref2.apply(this, arguments);
};
}();
// fireEvent.update is a small utility to provide a better experience when
// working with v-model.
// Related upstream issue: https://github.com/vuejs/vue-test-utils/issues/345#issuecomment-380588199
// See some examples in __tests__/form.js
fireEvent.update = (elem, value) => {
var tagName = elem.tagName;
var type = elem.type;
switch (tagName) {
case 'OPTION':
{
elem.selected = true;
var parentSelectElement = elem.parentElement.tagName === 'OPTGROUP' ? elem.parentElement.parentElement : elem.parentElement;
return fireEvent.change(parentSelectElement);
}
case 'INPUT':
{
if (['checkbox', 'radio'].includes(type)) {
elem.checked = true;
return fireEvent.change(elem);
} else if (type === 'file') {
return fireEvent.change(elem);
} else {
elem.value = value;
return fireEvent.input(elem);
}
}
case 'TEXTAREA':
{
elem.value = value;
return fireEvent.input(elem);
}
case 'SELECT':
{
elem.value = value;
return fireEvent.change(elem);
}
default:
// do nothing
}
return null;
};
function warnOnChangeOrInputEventCalledDirectly(eventValue, eventKey) {
if (process.env.VTL_SKIP_WARN_EVENT_UPDATE) return;
if (eventValue && (eventKey === 'change' || eventKey === 'input')) {
console.warn("Using \"fireEvent.".concat(eventKey, "\" may lead to unexpected results. Please use fireEvent.update() instead."));
}
}