react-testing-library
Version:
Simple and complete React DOM testing utilities that encourage good testing practices.
92 lines (75 loc) • 3.31 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.cleanup = exports.render = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _domTestingLibrary = require('dom-testing-library');
Object.keys(_domTestingLibrary).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _domTestingLibrary[key];
}
});
});
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _testUtils = require('react-dom/test-utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var mountedContainers = new Set();
function render(ui) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
container = _ref.container,
_ref$baseElement = _ref.baseElement,
baseElement = _ref$baseElement === undefined ? container : _ref$baseElement;
if (!container) {
baseElement = document.documentElement;
container = document.body.appendChild(document.createElement('div'));
}
// we'll add it to the mounted containers regardless of whether it's actually
// added to document.body so the cleanup method works regardless of whether
// they're passing us a custom container or not.
mountedContainers.add(container);
_reactDom2.default.render(ui, container);
return _extends({
container,
baseElement,
// eslint-disable-next-line no-console
debug: function debug() {
var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : baseElement;
return console.log((0, _domTestingLibrary.prettyDOM)(el));
},
unmount: function unmount() {
return _reactDom2.default.unmountComponentAtNode(container);
},
rerender: function rerender(rerenderUi) {
render(rerenderUi, { container, baseElement });
// Intentionally do not return anything to avoid unnecessarily complicating the API.
// folks can use all the same utilities we return in the first place that are bound to the container
}
}, (0, _domTestingLibrary.getQueriesForElement)(baseElement));
}
function cleanup() {
mountedContainers.forEach(cleanupAtContainer);
}
// maybe one day we'll expose this (perhaps even as a utility returned by render).
// but let's wait until someone asks for it.
function cleanupAtContainer(container) {
if (container.parentNode === document.body) {
document.body.removeChild(container);
}
_reactDom2.default.unmountComponentAtNode(container);
mountedContainers.delete(container);
}
// fallback to synthetic events for React events that the DOM doesn't support
var syntheticEvents = ['change', 'select', 'mouseEnter', 'mouseLeave'];
syntheticEvents.forEach(function (eventName) {
document.addEventListener(eventName.toLowerCase(), function (e) {
_testUtils.Simulate[eventName](e.target, e);
});
});
// just re-export everything from dom-testing-library
exports.render = render;
exports.cleanup = cleanup;
;