UNPKG

reshow-unit

Version:
162 lines (153 loc) 4.57 kB
import _objectSpread from "reshow-runtime/es/helpers/objectSpread2"; import _asyncToGenerator from "reshow-runtime/es/helpers/asyncToGenerator"; //@ts-check import * as React from "react"; import { jsdom, cleanIt as domCleanIt, hideConsoleError, getSinon, sleep } from "reshow-unit-dom"; import { doc } from "win-doc"; import { getTimestamp } from "get-random-id"; import { getDefault } from "get-object-value"; import { waitFor, waitForElementToBeRemoved } from "@testing-library/dom"; import { render as rtlRender, cleanup, getQueriesForElement, queries } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { env } from "process"; import build from "reshow-build"; import { StrictMode, act as rtlAct } from "react"; var envStrictMode = /** @type string*/env.STRICT_MODE; var STRICT_MODE = -1 !== "|true|false|null|0|".indexOf(envStrictMode) ? JSON.parse(envStrictMode) : envStrictMode; if (STRICT_MODE) { console.log("STRICT_MODE: on"); } /** * Fix!! * `The current testing environment is not configured to support act(…)` * * @see https://github.com/testing-library/react-testing-library/issues/1025 * @see https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html */ globalThis.IS_REACT_ACT_ENVIRONMENT = true; // https://testing-library.com/docs/queries/about/#screen var screen = function screen() { var _doc; return getQueriesForElement((_doc = doc()) === null || _doc === void 0 ? void 0 : _doc.body, queries); }; /** * @param {string} role * @returns {string} */ var getRoleHtml = function getRoleHtml(role) { return screen().getByRole(role).outerHTML; }; /** * @param {Object} [props] */ var cleanIt = function cleanIt(props) { var { withoutJsdom } = props || {}; if (!withoutJsdom) { domCleanIt(props); } cleanup(); }; /** * @param {function} cb */ var act = /*#__PURE__*/function () { var _ref = _asyncToGenerator(function* (cb, milliseconds, debug) { if (cb === void 0) { cb = function cb() {}; } if (milliseconds === void 0) { milliseconds = 1; } if (debug === void 0) { debug = false; } var start = getTimestamp(); var timer; yield rtlAct(function () { return new Promise(function (resolve) { cb(); /** * @param {function} resolve */ var _wait = function wait(resolve) { var now = getTimestamp(); debug && console.log({ during: now - start, debug, start, now }); if (milliseconds + start > now) { clearTimeout(timer); timer = setTimeout(function () { return _wait(resolve); }, 1); } else { resolve(); } }; _wait(resolve); }); }); }); return function act(_x, _x2, _x3) { return _ref.apply(this, arguments); }; }(); /** * @typedef {Object} RenderResult * @property {function} html * @property {function} instance */ /** * rtl-render: https://github.com/testing-library/react-testing-library/blob/main/src/pure.js * * @param {React.ReactElement} OrigDom * @param {object} options * @returns {import("@testing-library/react").RenderResult & RenderResult} */ var render = function render(OrigDom, options) { var _options; if (options === void 0) { options = {}; } var instance = (_options = options) === null || _options === void 0 ? void 0 : _options.instance; var Dom = OrigDom; var uInstance; if (instance) { if (true === instance) { /** * @param {React.ReactElement} el */ instance = function instance(el) { return uInstance = el; }; } Dom = /** @type React.ReactElement*/build(OrigDom)({ ref: instance }); } if (STRICT_MODE) { Dom = /** @type React.ReactElement*/build(StrictMode)(undefined, Dom); } var result = _objectSpread(_objectSpread({}, rtlRender(Dom, options)), {}, { html: function html() { return result.container.innerHTML; }, instance: function instance() { return uInstance; } }); return result; }; // https://testing-library.com/docs/user-event/intro /** * @param {ConstructorParameters<any>} p */ var simulateEvent = function simulateEvent() { var _getDefault; return (_getDefault = getDefault(userEvent)).setup.apply(_getDefault, arguments); }; export { waitFor, waitForElementToBeRemoved, act, render, screen, simulateEvent, sleep, getRoleHtml, getSinon, cleanIt, jsdom, hideConsoleError };