@ngneat/spectator
Version:
A powerful tool to simplify your Angular tests
57 lines • 6.7 kB
JavaScript
import { dispatchFakeEvent } from './dispatch-events';
import { isString, isHTMLOptionElementArray } from './types';
/**
* Focuses a select element, selects the correct options and dispatches
* the `change` event, simulating the user selecting an option
* @param options Options to be selected.
* @param element Element onto which to select the options.
* @param config Object with extra config to dispatch change event when option selected
*
* selectOption('al' | ['al', 'ab'], select, config);
*/
export function selectOption(options, element, config) {
if (!(element instanceof HTMLSelectElement)) {
return;
}
element.focus();
if (isString(options)) {
const option = element.querySelector(`option[value="${options}"]`);
if (!option) {
return;
}
setOptionSelected(option, element, config);
}
else if (options instanceof HTMLOptionElement) {
setOptionSelected(options, element, config);
}
else {
if (!element.multiple) {
return;
}
if (isHTMLOptionElementArray(options)) {
options.forEach((option) => setOptionSelected(option, element, config));
}
else {
element.querySelectorAll('option').forEach((opt) => {
if (options.includes(opt.value)) {
setOptionSelected(opt, element, config);
}
});
}
}
}
/**
* Set the option in the HTMLSelectElement to selected
* @param option HTMLOptionElement to select
* @param select HTMLSelectElement to add the options to
* @param config Object with extra config to dispatch change event when option selected
*
* setOptionSelected(option, element, config);
*/
function setOptionSelected(option, select, config) {
option.selected = true;
if (config.emitEvents) {
dispatchFakeEvent(select, 'change', true);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LW9wdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWN0YXRvci9zcmMvbGliL3NlbGVjdC1vcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBaUIsTUFBTSxTQUFTLENBQUM7QUFFNUU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixPQUFzQixFQUN0QixPQUE0RCxFQUM1RCxNQUErQjtJQUUvQixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQzVDLE9BQU87SUFDVCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRWhCLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFFRCxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7U0FBTSxJQUFJLE9BQU8sWUFBWSxpQkFBaUIsRUFBRSxDQUFDO1FBQ2hELGlCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDakQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUF5QixFQUFFLE1BQXlCLEVBQUUsTUFBK0I7SUFDOUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3BhdGNoRmFrZUV2ZW50IH0gZnJvbSAnLi9kaXNwYXRjaC1ldmVudHMnO1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzSFRNTE9wdGlvbkVsZW1lbnRBcnJheSwgU2VsZWN0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEZvY3VzZXMgYSBzZWxlY3QgZWxlbWVudCwgc2VsZWN0cyB0aGUgY29ycmVjdCBvcHRpb25zIGFuZCBkaXNwYXRjaGVzXG4gKiB0aGUgYGNoYW5nZWAgZXZlbnQsIHNpbXVsYXRpbmcgdGhlIHVzZXIgc2VsZWN0aW5nIGFuIG9wdGlvblxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgb250byB3aGljaCB0byBzZWxlY3QgdGhlIG9wdGlvbnMuXG4gKiBAcGFyYW0gY29uZmlnIE9iamVjdCB3aXRoIGV4dHJhIGNvbmZpZyB0byBkaXNwYXRjaCBjaGFuZ2UgZXZlbnQgd2hlbiBvcHRpb24gc2VsZWN0ZWRcbiAqXG4gKiBzZWxlY3RPcHRpb24oJ2FsJyB8IFsnYWwnLCAnYWInXSwgc2VsZWN0LCBjb25maWcpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0T3B0aW9uKFxuICBvcHRpb25zOiBTZWxlY3RPcHRpb25zLFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50IHwgRG9jdW1lbnQgfCBXaW5kb3csXG4gIGNvbmZpZzogeyBlbWl0RXZlbnRzOiBib29sZWFuIH0sXG4pOiB2b2lkIHtcbiAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuZm9jdXMoKTtcblxuICBpZiAoaXNTdHJpbmcob3B0aW9ucykpIHtcbiAgICBjb25zdCBvcHRpb246IEhUTUxPcHRpb25FbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQucXVlcnlTZWxlY3Rvcihgb3B0aW9uW3ZhbHVlPVwiJHtvcHRpb25zfVwiXWApO1xuICAgIGlmICghb3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0T3B0aW9uU2VsZWN0ZWQob3B0aW9uLCBlbGVtZW50LCBjb25maWcpO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBIVE1MT3B0aW9uRWxlbWVudCkge1xuICAgIHNldE9wdGlvblNlbGVjdGVkKG9wdGlvbnMsIGVsZW1lbnQsIGNvbmZpZyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFlbGVtZW50Lm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTE9wdGlvbkVsZW1lbnRBcnJheShvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHNldE9wdGlvblNlbGVjdGVkKG9wdGlvbiwgZWxlbWVudCwgY29uZmlnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJykuZm9yRWFjaCgob3B0KSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVzKG9wdC52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRPcHRpb25TZWxlY3RlZChvcHQsIGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNldCB0aGUgb3B0aW9uIGluIHRoZSBIVE1MU2VsZWN0RWxlbWVudCB0byBzZWxlY3RlZFxuICogQHBhcmFtIG9wdGlvbiBIVE1MT3B0aW9uRWxlbWVudCB0byBzZWxlY3RcbiAqIEBwYXJhbSBzZWxlY3QgSFRNTFNlbGVjdEVsZW1lbnQgdG8gYWRkIHRoZSBvcHRpb25zIHRvXG4gKiBAcGFyYW0gY29uZmlnIE9iamVjdCB3aXRoIGV4dHJhIGNvbmZpZyB0byBkaXNwYXRjaCBjaGFuZ2UgZXZlbnQgd2hlbiBvcHRpb24gc2VsZWN0ZWRcbiAqXG4gKiBzZXRPcHRpb25TZWxlY3RlZChvcHRpb24sIGVsZW1lbnQsIGNvbmZpZyk7XG4gKi9cbmZ1bmN0aW9uIHNldE9wdGlvblNlbGVjdGVkKG9wdGlvbjogSFRNTE9wdGlvbkVsZW1lbnQsIHNlbGVjdDogSFRNTFNlbGVjdEVsZW1lbnQsIGNvbmZpZzogeyBlbWl0RXZlbnRzOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgaWYgKGNvbmZpZy5lbWl0RXZlbnRzKSB7XG4gICAgZGlzcGF0Y2hGYWtlRXZlbnQoc2VsZWN0LCAnY2hhbmdlJywgdHJ1ZSk7XG4gIH1cbn1cbiJdfQ==