All files / addon-test-support/-private/execution_context native-events-context.js

97.87% Statements 46/47
100% Branches 20/20
100% Functions 2/2
97.87% Lines 46/47

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 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170                                                1x     894x 894x     1x   579x               298x       80x 80x       85x   85x 86x           84x 84x         1098x 98x       1000x       1000x         22x         22x 6x 6x     22x 6x   16x         44x   42x           34x       44x   42x           34x       199x   199x   199x 12x                   245x   245x   245x   245x   239x       467x   467x   467x   467x 28x               439x   423x        
import $ from '-jquery';
 
import {
  click,
  triggerEvent,
  keyEvent,
  focus,
  blur
} from 'ember-native-dom-helpers';
 
import {
  guardMultiple,
  buildSelector,
  findClosestValue
} from '../helpers';
import {
  fillElement,
  assertFocusable
} from './helpers';
import {
  ELEMENT_NOT_FOUND,
  throwBetterError
} from '../better-errors';
 
const KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];
 
export default function ExecutionContext(pageObjectNode, testContext) {
  this.pageObjectNode = pageObjectNode;
  this.testContext = testContext;
}
 
ExecutionContext.prototype = {
  run(cb) {
    return cb(this);
  },
 
  runAsync() {
    throw new Error('not implemented');
  },
 
  chainable() {
    return this.pageObjectNode;
  },
 
  click(selector, container) {
    const el = this.$(selector, container)[0];
    click(el);
  },
 
  fillIn(selector, container, options, content) {
    let elements = this.$(selector, container).toArray();
 
    elements.forEach((el) => {
      fillElement(el, content, {
        selector,
        pageObjectNode: this.pageObjectNode,
        pageObjectKey: options.pageObjectKey
      });
 
      triggerEvent(el, 'input');
      triggerEvent(el, 'change');
    });
  },
 
  $(selector, container) {
    if (container) {
      return $(selector, container);
    } else {
      // @todo: we should fixed usage of private `_element`
      // after https://github.com/emberjs/ember-test-helpers/issues/184 is resolved
      let testsContainer = this.testContext ?
        this.testContext._element :
        '#ember-testing';
 
      return $(selector, testsContainer);
    }
  },
 
  triggerEvent(selector, container, options, eventName, eventOptions) {
    const element = this.$(selector, container)[0];
 
    // `keyCode` is a deprecated property.
    // @see: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
    // Due to this deprecation `ember-native-dom-helpers` doesn't accept `keyCode` as a `KeyboardEvent` option.
    if (typeof eventOptions.key === 'undefined' && typeof eventOptions.keyCode !== 'undefined') {
      eventOptions.key = eventOptions.keyCode.toString();
      delete eventOptions.keyCode;
    }
 
    if (KEYBOARD_EVENT_TYPES.indexOf(eventName) > -1) {
      keyEvent(element, eventName, eventOptions.key, eventOptions);
    } else {
      triggerEvent(element, eventName, eventOptions);
    }
  },
 
  focus(selector, options) {
    const element = this.findWithAssert(selector, options)[0];
 
    assertFocusable(element, {
      selector,
      pageObjectNode: this.pageObjectNode,
      pageObjectKey: options.pageObjectKey
    });
 
    focus(element);
  },
 
  blur(selector, options) {
    const element = this.findWithAssert(selector, options)[0];
 
    assertFocusable(element, {
      selector,
      pageObjectNode: this.pageObjectNode,
      pageObjectKey: options.pageObjectKey
    });
 
    blur(element);
  },
 
  assertElementExists(selector, options) {
    let container = options.testContainer || findClosestValue(this.pageObjectNode, 'testContainer');
 
    let result = this.$(selector, container);
 
    if (result.length === 0) {
      throwBetterError(
        this.pageObjectNode,
        options.pageObjectKey,
        ELEMENT_NOT_FOUND,
        { selector }
      );
    }
  },
 
  find(selector, options) {
    let container = options.testContainer || findClosestValue(this.pageObjectNode, 'testContainer');
 
    selector = buildSelector(this.pageObjectNode, selector, options);
 
    let result = this.$(selector, container);
 
    guardMultiple(result, selector, options.multiple);
 
    return result;
  },
 
  findWithAssert(selector, options) {
    let container = options.testContainer || findClosestValue(this.pageObjectNode, 'testContainer');
 
    selector = buildSelector(this.pageObjectNode, selector, options);
 
    let result = this.$(selector, container);
 
    if (result.length === 0) {
      throwBetterError(
        this.pageObjectNode,
        options.pageObjectKey,
        ELEMENT_NOT_FOUND,
        { selector }
      );
    }
 
    guardMultiple(result, selector, options.multiple);
 
    return result;
  }
};