github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/ui/tests/utils/ember-power-select-extensions.js (about) 1 import { click, settled } from '@ember/test-helpers'; 2 // TODO: Contribute these helpers back upstream once we are on the latest version of 3 // ember-power-select (4.x) 4 // 5 // selectOpen and selectOpenChoose splits the existing selectChoose helper into two pieces 6 // - selectOpen: open the select (await settled) 7 // - selectOpenChoose: choose an option (await settled) 8 // Since the composite helper has two `await setted`s in it, the log changing tests can't use 9 // them. These tests require a run.later(run, run.cancelTimers, ms) to be inserted between 10 // these two moments. Doing it before opening means hanging on open not on select. Doing it 11 // after means hanging after the select has occurred (too late). 12 async function openIfClosedAndGetContentId(trigger) { 13 let contentId = trigger.attributes['aria-owns'] && `${trigger.attributes['aria-owns'].value}`; 14 let content = contentId ? document.querySelector(`#${contentId}`) : undefined; 15 // If the dropdown is closed, open it 16 if (!content || content.classList.contains('ember-basic-dropdown-content-placeholder')) { 17 await click(trigger); 18 await settled(); 19 contentId = `${trigger.attributes['aria-owns'].value}`; 20 } 21 return contentId; 22 } 23 24 export async function selectOpen(cssPathOrTrigger) { 25 let trigger; 26 if (cssPathOrTrigger instanceof HTMLElement) { 27 if (cssPathOrTrigger.classList.contains('ember-power-select-trigger')) { 28 trigger = cssPathOrTrigger; 29 } else { 30 trigger = cssPathOrTrigger.querySelector('.ember-power-select-trigger'); 31 } 32 } else { 33 trigger = document.querySelector(`${cssPathOrTrigger} .ember-power-select-trigger`); 34 35 if (!trigger) { 36 trigger = document.querySelector(cssPathOrTrigger); 37 } 38 39 if (!trigger) { 40 throw new Error( 41 `You called "selectOpen('${cssPathOrTrigger}')" but no select was found using selector "${cssPathOrTrigger}"` 42 ); 43 } 44 } 45 46 if (trigger.scrollIntoView) { 47 trigger.scrollIntoView(); 48 } 49 50 return await openIfClosedAndGetContentId(trigger); 51 } 52 53 export async function selectOpenChoose(contentId, valueOrSelector, optionIndex) { 54 let target; 55 // Select the option with the given text 56 let options = document.querySelectorAll(`#${contentId} .ember-power-select-option`); 57 let potentialTargets = [].slice 58 .apply(options) 59 .filter(opt => opt.textContent.indexOf(valueOrSelector) > -1); 60 if (potentialTargets.length === 0) { 61 potentialTargets = document.querySelectorAll(`#${contentId} ${valueOrSelector}`); 62 } 63 if (potentialTargets.length > 1) { 64 let filteredTargets = [].slice 65 .apply(potentialTargets) 66 .filter(t => t.textContent.trim() === valueOrSelector); 67 if (optionIndex === undefined) { 68 target = filteredTargets[0] || potentialTargets[0]; 69 } else { 70 target = filteredTargets[optionIndex] || potentialTargets[optionIndex]; 71 } 72 } else { 73 target = potentialTargets[0]; 74 } 75 if (!target) { 76 throw new Error( 77 `You called "selectOpenChoose('${valueOrSelector}')" but "${valueOrSelector}" didn't match any option` 78 ); 79 } 80 await click(target); 81 return settled(); 82 }