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  }