// Taken from https://stackoverflow.com/a/56859650/1015027 function findTextWithMarkup(contentNode: null | Element, textMatch: string | RegExp) { const hasText = (node: Element): boolean => { if (node.textContent === null) { return false; } if (typeof textMatch === 'string') { return node.textContent.includes(textMatch); } return textMatch.test(node.textContent); }; const nodeHasText = hasText(contentNode as Element); const childrenDontHaveText = Array.from(contentNode?.children || []).every( child => !hasText(child) ); return nodeHasText && childrenDontHaveText; } /** * May be used with a *ByText RTL matcher to match text within multiple nodes * * e.g.:
Hello world
*/ export function textWithMarkupMatcher(textMatch: string | RegExp) { return function (_: string, element: Element | null) { return findTextWithMarkup(element, textMatch); }; } /** * @deprecated (This function is a workaround for test files that still use * enzyme.) * * Triggers onPress events on components that use react-aria (e.g. the * dropdown menu). These components require more complex events than what * enzyme can simulate with `.simulate('click')`. Preferably, we should use * the 'user-event' library from react testing library. Read more: * https://react-spectrum.adobe.com/react-spectrum/testing.html#triggering-events */ export function triggerPress(element) { element.prop('onClick')({ button: 0, detail: 0, nativeEvent: {detail: 0}, currentTarget: element.getDOMNode(), target: element.getDOMNode(), stopPropagation: () => {}, preventDefault: () => {}, }); }