UNPKG

@ngneat/spectator

Version:

A powerful tool to simplify your Angular tests

39 lines 10.2 kB
import { queries as DOMQueries, getDefaultNormalizer, } from '@testing-library/dom'; export class DOMSelector { // Wrap selector functions in a class to make reflection easier in getChild constructor(execute) { this.execute = execute; } } export const byLabel = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByLabelText(el, matcher, options)); export const byPlaceholder = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByPlaceholderText(el, matcher, options)); export const byText = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByText(el, matcher, options)); export const byTextContent = (matcher, options) => { let textContentMatcher; const normalizer = options?.normalizer || getDefaultNormalizer(options); const getTextContent = (elem) => normalizer(elem?.textContent ?? ''); if (typeof matcher === 'string' || typeof matcher === 'number') { textContentMatcher = (_, elem) => { if (options?.exact === false) { return getTextContent(elem).toLowerCase().indexOf(matcher.toString().toLowerCase()) >= 0; } return getTextContent(elem) === matcher.toString(); }; } else if (matcher instanceof RegExp) { textContentMatcher = (_, elem) => matcher.test(getTextContent(elem)); } else if (typeof matcher === 'function') { textContentMatcher = (_, elem) => matcher(getTextContent(elem), elem); } else { throw new Error(`Matcher type not supported: ${typeof matcher}`); } return new DOMSelector((el) => DOMQueries.queryAllByText(el, textContentMatcher, options)); }; export const byAltText = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByAltText(el, matcher, options)); export const byTitle = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByTitle(el, matcher, options)); export const byTestId = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByTestId(el, matcher, options)); export const byValue = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByDisplayValue(el, matcher, options)); export const byRole = (matcher, options) => new DOMSelector((el) => DOMQueries.queryAllByRole(el, matcher, options)); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLXNlbGVjdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWN0YXRvci9zcmMvbGliL2RvbS1zZWxlY3RvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQU1MLE9BQU8sSUFBSSxVQUFVLEVBQ3JCLG9CQUFvQixHQUVyQixNQUFNLHNCQUFzQixDQUFDO0FBTzlCLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLDJFQUEyRTtJQUMzRSxZQUE0QixPQUEyQztRQUEzQyxZQUFPLEdBQVAsT0FBTyxDQUFvQztJQUFHLENBQUM7Q0FDNUU7QUFJRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQXVCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQzlELElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBdUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FDcEUsSUFBSSxXQUFXLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdEYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUErQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUNyRixJQUFJLFdBQVcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZ0IsRUFBRSxPQUF5QyxFQUFlLEVBQUU7SUFDeEcsSUFBSSxrQkFBMkIsQ0FB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LENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTWF0Y2hlcixcbiAgTWF0Y2hlckZ1bmN0aW9uLFxuICBNYXRjaGVyT3B0aW9ucyxcbiAgTm9ybWFsaXplckZuLFxuICBTZWxlY3Rvck1hdGNoZXJPcHRpb25zLFxuICBxdWVyaWVzIGFzIERPTVF1ZXJpZXMsXG4gIGdldERlZmF1bHROb3JtYWxpemVyLFxuICBCeVJvbGVPcHRpb25zLFxufSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L2RvbSc7XG5pbXBvcnQgeyBBUklBUm9sZSB9IGZyb20gJ2FyaWEtcXVlcnknO1xuXG5pbnRlcmZhY2UgTWFuZGF0b3J5U2VsZWN0b3JNYXRjaGluZ09wdGlvbnMgZXh0ZW5kcyBNYXRjaGVyT3B0aW9ucyB7XG4gIHNlbGVjdG9yOiBTZWxlY3Rvck1hdGNoZXJPcHRpb25zWydzZWxlY3RvciddO1xufVxuXG5leHBvcnQgY2xhc3MgRE9NU2VsZWN0b3Ige1xuICAvLyBXcmFwIHNlbGVjdG9yIGZ1bmN0aW9ucyBpbiBhIGNsYXNzIHRvIG1ha2UgcmVmbGVjdGlvbiBlYXNpZXIgaW4gZ2V0Q2hpbGRcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGV4ZWN1dGU6IChlbDogSFRNTEVsZW1lbnQpID0+IEhUTUxFbGVtZW50W10pIHt9XG59XG5cbmV4cG9ydCB0eXBlIERPTVNlbGVjdG9yRmFjdG9yeTxUT3B0aW9ucyBleHRlbmRzIE1hdGNoZXJPcHRpb25zID0gTWF0Y2hlck9wdGlvbnM+ID0gKG1hdGNoZXI6IE1hdGNoZXIsIG9wdGlvbnM/OiBUT3B0aW9ucykgPT4gRE9NU2VsZWN0b3I7XG5cbmV4cG9ydCBjb25zdCBieUxhYmVsOiBET01TZWxlY3RvckZhY3RvcnkgPSAobWF0Y2hlciwgb3B0aW9ucykgPT5cbiAgbmV3IERPTVNlbGVjdG9yKChlbCkgPT4gRE9NUXVlcmllcy5xdWVyeUFsbEJ5TGFiZWxUZXh0KGVsLCBtYXRjaGVyLCBvcHRpb25zKSk7XG5cbmV4cG9ydCBjb25zdCBieVBsYWNlaG9sZGVyOiBET01TZWxlY3RvckZhY3RvcnkgPSAobWF0Y2hlciwgb3B0aW9ucykgPT5cbiAgbmV3IERPTVNlbGVjdG9yKChlbCkgPT4gRE9NUXVlcmllcy5xdWVyeUFsbEJ5UGxhY2Vob2xkZXJUZXh0KGVsLCBtYXRjaGVyLCBvcHRpb25zKSk7XG5cbmV4cG9ydCBjb25zdCBieVRleHQ6IERPTVNlbGVjdG9yRmFjdG9yeTxTZWxlY3Rvck1hdGNoZXJPcHRpb25zPiA9IChtYXRjaGVyLCBvcHRpb25zKSA9PlxuICBuZXcgRE9NU2VsZWN0b3IoKGVsKSA9PiBET01RdWVyaWVzLnF1ZXJ5QWxsQnlUZXh0KGVsLCBtYXRjaGVyLCBvcHRpb25zKSk7XG5cbmV4cG9ydCBjb25zdCBieVRleHRDb250ZW50ID0gKG1hdGNoZXI6IE1hdGNoZXIsIG9wdGlvbnM6IE1hbmRhdG9yeVNlbGVjdG9yTWF0Y2hpbmdPcHRpb25zKTogRE9NU2VsZWN0b3IgPT4ge1xuICBsZXQgdGV4dENvbnRlbnRNYXRjaGVyOiBNYXRjaGVyO1xuICBjb25zdCBub3JtYWxpemVyOiBOb3JtYWxpemVyRm4gPSBvcHRpb25zPy5ub3JtYWxpemVyIHx8IGdldERlZmF1bHROb3JtYWxpemVyKG9wdGlvbnMpO1xuICBjb25zdCBnZXRUZXh0Q29udGVudCA9IChlbGVtOiBFbGVtZW50IHwgbnVsbCk6IHN0cmluZyA9PiBub3JtYWxpemVyKGVsZW0/LnRleHRDb250ZW50ID8/ICcnKTtcblxuICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXRjaGVyID09PSAnbnVtYmVyJykge1xuICAgIHRleHRDb250ZW50TWF0Y2hlciA9IChfLCBlbGVtKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucz8uZXhhY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBnZXRUZXh0Q29udGVudChlbGVtKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobWF0Y2hlci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpID49IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRUZXh0Q29udGVudChlbGVtKSA9PT0gbWF0Y2hlci50b1N0cmluZygpO1xuICAgIH07XG4gIH0gZWxzZSBpZiAobWF0Y2hlciBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHRleHRDb250ZW50TWF0Y2hlciA9IChfLCBlbGVtKSA9PiBtYXRjaGVyLnRlc3QoZ2V0VGV4dENvbnRlbnQoZWxlbSkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGV4dENvbnRlbnRNYXRjaGVyID0gKF8sIGVsZW0pID0+IG1hdGNoZXIoZ2V0VGV4dENvbnRlbnQoZWxlbSksIGVsZW0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWF0Y2hlciB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICR7dHlwZW9mIG1hdGNoZXJ9YCk7XG4gIH1cblxuICByZXR1cm4gbmV3IERPTVNlbGVjdG9yKChlbCkgPT4gRE9NUXVlcmllcy5xdWVyeUFsbEJ5VGV4dChlbCwgdGV4dENvbnRlbnRNYXRjaGVyLCBvcHRpb25zKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYnlBbHRUZXh0OiBET01TZWxlY3RvckZhY3RvcnkgPSAobWF0Y2hlciwgb3B0aW9ucykgPT5cbiAgbmV3IERPTVNlbGVjdG9yKChlbCkgPT4gRE9NUXVlcmllcy5xdWVyeUFsbEJ5QWx0VGV4dChlbCwgbWF0Y2hlciwgb3B0aW9ucykpO1xuXG5leHBvcnQgY29uc3QgYnlUaXRsZTogRE9NU2VsZWN0b3JGYWN0b3J5ID0gKG1hdGNoZXIsIG9wdGlvbnMpID0+IG5ldyBET01TZWxlY3RvcigoZWwpID0+IERPTVF1ZXJpZXMucXVlcnlBbGxCeVRpdGxlKGVsLCBtYXRjaGVyLCBvcHRpb25zKSk7XG5cbmV4cG9ydCBjb25zdCBieVRlc3RJZDogRE9NU2VsZWN0b3JGYWN0b3J5ID0gKG1hdGNoZXIsIG9wdGlvbnMpID0+XG4gIG5ldyBET01TZWxlY3RvcigoZWwpID0+IERPTVF1ZXJpZXMucXVlcnlBbGxCeVRlc3RJZChlbCwgbWF0Y2hlciwgb3B0aW9ucykpO1xuXG5leHBvcnQgY29uc3QgYnlWYWx1ZTogRE9NU2VsZWN0b3JGYWN0b3J5ID0gKG1hdGNoZXIsIG9wdGlvbnMpID0+XG4gIG5ldyBET01TZWxlY3RvcigoZWwpID0+IERPTVF1ZXJpZXMucXVlcnlBbGxCeURpc3BsYXlWYWx1ZShlbCwgbWF0Y2hlciwgb3B0aW9ucykpO1xuXG5leHBvcnQgY29uc3QgYnlSb2xlID0gKG1hdGNoZXI6IEFSSUFSb2xlIHwgTWF0Y2hlckZ1bmN0aW9uIHwgT21pdDxzdHJpbmcsIEFSSUFSb2xlPiwgb3B0aW9ucz86IEJ5Um9sZU9wdGlvbnMpOiBET01TZWxlY3RvciA9PlxuICBuZXcgRE9NU2VsZWN0b3IoKGVsKSA9PiBET01RdWVyaWVzLnF1ZXJ5QWxsQnlSb2xlKGVsLCBtYXRjaGVyLCBvcHRpb25zKSk7XG4iXX0=