From 2f82f650f495f2924d67327540ffdab03812ca84 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Wed, 7 Nov 2018 15:54:03 +0100 Subject: [PATCH 1/2] Ensure typeIn has correct key option --- .../@ember/test-helpers/dom/type-in.ts | 1 + tests/unit/dom/type-in-test.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/addon-test-support/@ember/test-helpers/dom/type-in.ts b/addon-test-support/@ember/test-helpers/dom/type-in.ts index 6b437fe50..df168e779 100644 --- a/addon-test-support/@ember/test-helpers/dom/type-in.ts +++ b/addon-test-support/@ember/test-helpers/dom/type-in.ts @@ -75,6 +75,7 @@ function keyEntry(element: FormControl, character: string): () => void { bubbles: true, cancellable: true, charCode, + key: character, }; const keyEvents = { diff --git a/tests/unit/dom/type-in-test.js b/tests/unit/dom/type-in-test.js index 807c87196..831b9127f 100644 --- a/tests/unit/dom/type-in-test.js +++ b/tests/unit/dom/type-in-test.js @@ -77,6 +77,25 @@ 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', 'charCode']); + await typeIn(element, 'foo'); + + let chars = ['f', 'o', 'o']; + 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]; + + return `${eventName} ${char} ${char.charCodeAt()}`; + }); + + assert.verifySteps(expectedEventsWithArguments); + }); + test('filling in an input with a delay', async function(assert) { element = buildInstrumentedElement('input'); await typeIn(element, 'foo', { delay: 150 }); From 977268e3a4a987e45184d21922fc3cad274be1e2 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 11 Dec 2018 09:40:05 +0100 Subject: [PATCH 2/2] Make typeIn use triggerKeyEvent --- .../@ember/test-helpers/dom/type-in.ts | 30 +++++++------------ tests/unit/dom/type-in-test.js | 10 ++++--- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/addon-test-support/@ember/test-helpers/dom/type-in.ts b/addon-test-support/@ember/test-helpers/dom/type-in.ts index df168e779..e8d3743a9 100644 --- a/addon-test-support/@ember/test-helpers/dom/type-in.ts +++ b/addon-test-support/@ember/test-helpers/dom/type-in.ts @@ -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; @@ -69,27 +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, - key: character, - }; - - 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)); }; } diff --git a/tests/unit/dom/type-in-test.js b/tests/unit/dom/type-in-test.js index 831b9127f..de725c1fe 100644 --- a/tests/unit/dom/type-in-test.js +++ b/tests/unit/dom/type-in-test.js @@ -78,10 +78,11 @@ module('DOM Helper: typeIn', function(hooks) { }); test('it triggers key events with correct arguments', async function(assert) { - element = buildInstrumentedElement('input', ['key', 'charCode']); - await typeIn(element, 'foo'); + element = buildInstrumentedElement('input', ['key', 'shiftKey']); + await typeIn(element, 'F o'); - let chars = ['f', 'o', '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)) { @@ -89,8 +90,9 @@ module('DOM Helper: typeIn', function(hooks) { } // 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} ${char.charCodeAt()}`; + return `${eventName} ${char.toUpperCase()} ${shiftKey}`; }); assert.verifySteps(expectedEventsWithArguments);