Skip to content

Commit

Permalink
Merge pull request #465 from mydea/fix-type-in
Browse files Browse the repository at this point in the history
Ensure typeIn has correct key option
  • Loading branch information
rwjblue committed Dec 14, 2018
2 parents 2dea837 + 977268e commit 04180b2
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 18 deletions.
29 changes: 11 additions & 18 deletions addon-test-support/@ember/test-helpers/dom/type-in.ts
Expand Up @@ -7,6 +7,7 @@ import isFocusable from './-is-focusable';
import { Promise } from 'rsvp';
import fireEvent from './fire-event';
import Target from './-target';
import triggerKeyEvent from './trigger-key-event';

export interface Options {
delay?: number;
Expand Down Expand Up @@ -69,26 +70,18 @@ function fillOut(element: FormControl, text: string, delay: number) {

// eslint-disable-next-line require-jsdoc
function keyEntry(element: FormControl, character: string): () => void {
const charCode = character.charCodeAt(0);

const eventOptions = {
bubbles: true,
cancellable: true,
charCode,
};

const keyEvents = {
down: new KeyboardEvent('keydown', eventOptions),
press: new KeyboardEvent('keypress', eventOptions),
up: new KeyboardEvent('keyup', eventOptions),
};
let shiftKey = character === character.toUpperCase() && character !== character.toLowerCase();
let options = { shiftKey };
let characterKey = character.toUpperCase();

return function() {
element.dispatchEvent(keyEvents.down);
element.dispatchEvent(keyEvents.press);
element.value = element.value + character;
fireEvent(element, 'input');
element.dispatchEvent(keyEvents.up);
return triggerKeyEvent(element, 'keydown', characterKey, options)
.then(() => triggerKeyEvent(element, 'keypress', characterKey, options))
.then(() => {
element.value = element.value + character;
fireEvent(element, 'input');
})
.then(() => triggerKeyEvent(element, 'keyup', characterKey, options));
};
}

Expand Down
21 changes: 21 additions & 0 deletions tests/unit/dom/type-in-test.js
Expand Up @@ -77,6 +77,27 @@ module('DOM Helper: typeIn', function(hooks) {
assert.equal(element.value, 'foo');
});

test('it triggers key events with correct arguments', async function(assert) {
element = buildInstrumentedElement('input', ['key', 'shiftKey']);
await typeIn(element, 'F o');

let chars = ['F', ' ', 'o'];
let shiftKeys = [true, false, false];
let expectedEventsWithArguments = expectedEvents.map(eventName => {
// Only key events get the key arguments
if (!['keydown', 'keypress', 'keyup'].includes(eventName)) {
return `${eventName} undefined undefined`;
}
// After each keyup, the next character comes up
let char = eventName === 'keyup' ? chars.shift() : chars[0];
let shiftKey = eventName === 'keyup' ? shiftKeys.shift() : shiftKeys[0];

return `${eventName} ${char.toUpperCase()} ${shiftKey}`;
});

assert.verifySteps(expectedEventsWithArguments);
});

test('filling in an input with a delay', async function(assert) {
element = buildInstrumentedElement('input');
await typeIn(element, 'foo', { delay: 150 });
Expand Down

0 comments on commit 04180b2

Please sign in to comment.