All files / addon-test-support/properties text.js

100% Statements 10/10
100% Branches 5/5
100% Functions 4/4
100% Lines 10/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123        6x                                                                                                                                                                                                   343x       544x 544x   544x 544x 519x   519x 531x     519x          
import { assign, map, normalizeText } from '../-private/helpers';
import { getExecutionContext } from '../-private/execution_context';
 
function identity(v) {
  return v;
}
 
/**
 * @public
 *
 * Returns text of the element or Array of texts of all matched elements by selector.
 *
 * @example
 *
 * // Hello <span>world!</span>
 *
 * import { create, text } from 'ember-cli-page-object';
 *
 * const page = create({
 *   text: text('span')
 * });
 *
 * assert.equal(page.text, 'world!');
 *
 * @example
 *
 * // <span>lorem</span>
 * // <span> ipsum </span>
 * // <span>dolor</span>
 *
 * import { create, text } from 'ember-cli-page-object';
 *
 * const page = create({
 *   texts: text('span', { multiple: true })
 * });
 *
 * assert.deepEqual(page.texts, ['lorem', 'ipsum', 'dolor']);
 *
 * @example
 *
 * // <div><span>lorem</span></div>
 * // <div class="scope"><span>ipsum</span></div>
 * // <div><span>dolor</span></div>
 *
 * import { create, text } from 'ember-cli-page-object';
 *
 * const page = create({
 *   text: text('span', { scope: '.scope' })
 * });
 *
 * assert.equal(page.text, 'ipsum');
 *
 * @example
 *
 * // <div><span>lorem</span></div>
 * // <div class="scope"><span>ipsum</span></div>
 * // <div><span>dolor</span></div>
 *
 * import { create, text } from 'ember-cli-page-object';
 *
 * const page = create({
 *   scope: '.scope',
 *   text: text('span')
 * });
 *
 * // returns 'ipsum'
 * assert.equal(page.text, 'ipsum');
 *
 * @example
 *
 * // <div><span>lorem</span></div>
 * // <div class="scope">
 * //  ipsum
 * // </div>
 * // <div><span>dolor</span></div>
 *
 * import { create, text } from 'ember-cli-page-object';
 *
 * const page = create({
 *   scope: '.scope',
 *   text: text('span', { normalize: false })
 * });
 *
 * // returns 'ipsum'
 * assert.equal(page.text, '\n ipsum\n');
 *
 * @public
 *
 * @param {string} selector - CSS selector of the element to check
 * @param {Object} options - Additional options
 * @param {string} options.scope - Nests provided scope within parent's scope
 * @param {number} options.at - Reduce the set of matched elements to the one at the specified index
 * @param {boolean} options.resetScope - Override parent's scope
 * @param {boolean} options.multiple - Return an array of values
 * @param {boolean} options.normalize - Set to `false` to avoid text normalization
 * @param {string} options.testContainer - Context where to search elements in the DOM
 * @return {Descriptor}
 *
 * @throws Will throw an error if no element matches selector
 * @throws Will throw an error if multiple elements are matched by selector and multiple option is not set
 */
export function text(selector, userOptions = {}) {
  return {
    isDescriptor: true,
 
    get(key) {
      let executionContext = getExecutionContext(this);
      let options = assign({ pageObjectKey: key }, userOptions);
 
      return executionContext.run((context) => {
        let elements = context.findWithAssert(selector, options);
        let f = options.normalize === false ? identity : normalizeText;
 
        let result = map(elements, function(element) {
          return f(element.text());
        });
 
        return options.multiple ? result : result[0];
      });
    }
  };
}