@oslokommune/punkt-testing-utils 13.2.1 → 13.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -4,11 +4,11 @@ import { PktBackLink, PktCheckbox, PktCombobox, PktDatepicker, PktHelptext, PktI
4
4
  export declare const PKT_CUSTOM_FORMFIELDS: string[];
5
5
  type PTLElementType = PktBackLink | PktCheckbox | PktCombobox | PktDatepicker | PktHelptext | PktIcon | PktInputWrapper | PktLoader | PktProgressbar | PktRadioButton | PktSelect | PktTextarea | HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;
6
6
  export type PktTestingLibraryOptions = Pick<typeof DomTestingLibrary, 'fireEvent' | 'findAllByLabelText' | 'findAllByTestId' | 'findAllByDisplayValue' | 'findAllByText' | 'getAllByLabelText' | 'getAllByTestId' | 'getAllByDisplayValue' | 'getAllByText'>;
7
- export type LabelOrElement<ElementType = PTLElementType> = string | RegExp | ElementType;
7
+ export type LabelOrElement<ElementType = PTLElementType> = string | RegExp | ElementType | HTMLLabelElement;
8
8
  export type PktElementValueType = string | number | Date;
9
9
  export type PktTestingLibrary = {
10
- findPktElementByLabelText: (label: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>;
11
- getPktElementByLabelText: (label: string | RegExp, container?: HTMLElement) => PTLElementType;
10
+ findPktElementByLabelText: (label: string | RegExp | HTMLLabelElement, container?: HTMLElement) => Promise<PTLElementType>;
11
+ getPktElementByLabelText: (label: string | RegExp | HTMLLabelElement, container?: HTMLElement) => PTLElementType;
12
12
  getPktSelectOptions: (labelOrElement: LabelOrElement<PktSelect>, onlySelected?: boolean) => Array<PktOption>;
13
13
  getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[];
14
14
  setPktElementChecked: (labelOrElement: LabelOrElement, checked: boolean) => Promise<boolean>;
@@ -74,7 +74,15 @@ const asyncQueryFunctionResolver = (testingLibrary) => (queryType) => {
74
74
  }
75
75
  };
76
76
  const syncResolveIdentifierOrElement = (testingLibrary) => (elementOrIdentifier, query) => typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? getPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier;
77
- const asyncResolveIdentifierOrElement = (testingLibrary) => async (elementOrIdentifier, query) => typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? await findPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier;
77
+ const getByLabelElement = (possibleLabelElement) => {
78
+ const control = possibleLabelElement instanceof HTMLLabelElement && possibleLabelElement.control;
79
+ if (control) {
80
+ return control;
81
+ } else {
82
+ throw new Error("Fant ikke noe skjema-element for labelen: " + possibleLabelElement.outerHTML);
83
+ }
84
+ };
85
+ const asyncResolveIdentifierOrElement = (testingLibrary) => async (elementOrIdentifier, query) => elementOrIdentifier instanceof HTMLLabelElement && getByLabelElement(elementOrIdentifier) || (typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? await findPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier);
78
86
  const asyncFuncWithStringIdentifierOrElement = (testingLibrary) => (func, query = "label") => {
79
87
  return async (labelOrPktElement, ...restArgs) => {
80
88
  const element = await asyncResolveIdentifierOrElement(testingLibrary)(labelOrPktElement, query);
@@ -168,10 +176,13 @@ const fallbackSearchForPktSelectByLabel = (testingLibrary) => (identifier, query
168
176
  throw getElementError(`Fant ikke noe element med ${query} "${identifier}"`, container);
169
177
  };
170
178
  const doElementSearch = (identifier, query, queryFunc, container = document.body) => {
171
- return typeof identifier === "string" && query === "label" ? queryFunc(container, labelMatcher(identifier.trim())) : queryFunc(container, identifier);
179
+ return identifier instanceof HTMLLabelElement ? getByLabelElement(identifier) : typeof identifier === "string" && query === "label" ? queryFunc(container, labelMatcher(identifier.trim())) : queryFunc(container, identifier);
172
180
  };
173
181
  const findPktElementBy = (testingLibrary) => async (query = "label", identifier, container) => {
174
182
  try {
183
+ if (identifier instanceof HTMLLabelElement) {
184
+ return Promise.resolve(getByLabelElement(identifier));
185
+ }
175
186
  const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query);
176
187
  const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0];
177
188
  return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []));
@@ -179,8 +190,8 @@ const findPktElementBy = (testingLibrary) => async (query = "label", identifier,
179
190
  return fallbackSearchForPktSelectByLabel()(identifier, query, container);
180
191
  }
181
192
  };
182
- const getPktElementByLabel = (testingLibrary) => (label, container) => getPktElementBy(testingLibrary)("label", label, container);
183
- const findPktElementByLabel = (testingLibrary) => async (label, container) => findPktElementBy(testingLibrary)("label", label, container);
193
+ const getPktElementByLabel = (testingLibrary) => (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : getPktElementBy(testingLibrary)("label", label, container);
194
+ const findPktElementByLabel = (testingLibrary) => async (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : findPktElementBy(testingLibrary)("label", label, container);
184
195
  const setPktElementChecked = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element, checked) => {
185
196
  if (!("checked" in element)) {
186
197
  throw new Error('Bare elementer som har en "checked"-attributt støttes');
@@ -1 +1 @@
1
- {"version":3,"file":"punkt-testing-utils.es.js","sources":["../src/index.ts"],"sourcesContent":["import DomTestingLibrary, {\n FindAllByBoundAttribute,\n findAllByDisplayValue,\n findAllByLabelText,\n findAllByTestId,\n findAllByText,\n getAllByDisplayValue,\n getAllByLabelText,\n getAllByTestId,\n getAllByText,\n getElementError,\n} from '@testing-library/dom'\nimport {\n PktBackLink,\n PktCheckbox,\n PktCombobox,\n PktDatepicker,\n PktHelptext,\n PktIcon,\n PktInputWrapper,\n PktLoader,\n PktProgressbar,\n PktRadioButton,\n PktSelect,\n PktTextarea,\n} from '@oslokommune/punkt-elements'\nimport { AllByBoundAttribute } from '@testing-library/dom/types/queries'\n\nexport const PKT_CUSTOM_FORMFIELDS = [\n 'pkt-backlink',\n 'pkt-checkbox',\n 'pkt-combobox',\n 'pkt-datepicker',\n 'pkt-progressbar',\n 'pkt-radiobutton',\n 'pkt-select',\n 'pkt-textarea',\n 'pkt-textinput',\n]\nconst PKT_CUSTOM_ELEMENTS = [\n 'pkt-input-wrapper',\n 'pkt-icon',\n 'pkt-helptext',\n 'pkt-loader',\n 'pkt-backlink',\n ...PKT_CUSTOM_FORMFIELDS,\n]\n\ntype PTLElementType =\n | PktBackLink\n | PktCheckbox\n | PktCombobox\n | PktDatepicker\n | PktHelptext\n | PktIcon\n | PktInputWrapper\n | PktLoader\n | PktProgressbar\n | PktRadioButton\n | PktSelect\n | PktTextarea\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement\n\nexport type PktTestingLibraryOptions = Pick<\n typeof DomTestingLibrary,\n | 'fireEvent'\n | 'findAllByLabelText'\n | 'findAllByTestId'\n | 'findAllByDisplayValue'\n | 'findAllByText'\n | 'getAllByLabelText'\n | 'getAllByTestId'\n | 'getAllByDisplayValue'\n | 'getAllByText'\n>\n\ntype TestingLibraryTools = {\n fireEvent: typeof DomTestingLibrary.fireEvent\n findAllByLabelText: typeof DomTestingLibrary.findAllByLabelText\n findAllByTestId: typeof DomTestingLibrary.findAllByTestId\n findAllByDisplayValue: typeof DomTestingLibrary.findAllByDisplayValue\n findAllByText: typeof DomTestingLibrary.findAllByText\n getAllByLabelText: typeof DomTestingLibrary.getAllByLabelText\n getAllByTestId: typeof DomTestingLibrary.getAllByTestId\n getAllByDisplayValue: typeof DomTestingLibrary.getAllByDisplayValue\n getAllByText: typeof DomTestingLibrary.getAllByText\n}\n\nexport type LabelOrElement<ElementType = PTLElementType> = string | RegExp | ElementType\n\nexport type PktElementValueType = string | number | Date\n\nexport type PktTestingLibrary = {\n findPktElementByLabelText: (label: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>\n getPktElementByLabelText: (label: string | RegExp, container?: HTMLElement) => PTLElementType\n getPktSelectOptions: (labelOrElement: LabelOrElement<PktSelect>, onlySelected?: boolean) => Array<PktOption>\n getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[]\n setPktElementChecked: (labelOrElement: LabelOrElement, checked: boolean) => Promise<boolean>\n isPktElementChecked: (labelOrElement: LabelOrElement) => boolean\n setPktElementValue: (\n labelOrElement: LabelOrElement,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent?:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n },\n ) => Promise<boolean>\n pktClickButton: (labelOrElement: LabelOrElement<HTMLInputElement | HTMLButtonElement>) => Promise<boolean>\n waitForPktElementsToBeDefined: () => Promise<any>\n setPktSelectedOptionsByLabel: (\n labelOrElement: LabelOrElement<PktSelect>,\n ...desiredOptionLabels: Array<string>\n ) => Promise<any>\n getPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => PTLElementType\n findPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>\n}\n\nexport const setupPktTestingLibrary: (options: PktTestingLibraryOptions) => PktTestingLibrary = (\n options: PktTestingLibraryOptions,\n) => {\n const tools: TestingLibraryTools = {\n fireEvent: options.fireEvent,\n findAllByLabelText: options.findAllByLabelText,\n findAllByDisplayValue: options.findAllByDisplayValue,\n findAllByTestId: options.findAllByTestId,\n findAllByText: options.findAllByText,\n getAllByLabelText: options.getAllByLabelText,\n getAllByDisplayValue: options.getAllByDisplayValue,\n getAllByTestId: options.getAllByTestId,\n getAllByText: options.getAllByText,\n }\n return {\n findPktElementByLabelText: withTestingLibrary(tools, findPktElementByLabel),\n waitForPktElementsToBeDefined,\n getPktElementByLabelText: withTestingLibrary(tools, getPktElementByLabel),\n setPktElementChecked: withTestingLibrary(tools, setPktElementChecked),\n isPktElementChecked: withTestingLibrary(tools, isPktElementChecked),\n getPktSelectOptions: withTestingLibrary(tools, getPktSelectOptions),\n getAllPktElementsByLabelText: withTestingLibrary(tools, getAllPktElementsByLabelText),\n setPktElementValue: withTestingLibrary(tools, setPktElementValue),\n pktClickButton: withTestingLibrary(tools, pktClickButton),\n setPktSelectedOptionsByLabel: withTestingLibrary(tools, setPktSelectedOptionsByLabel),\n getPktElementByDisplayValue: withTestingLibrary(tools, getPktElementByDisplayValue),\n findPktElementByDisplayValue: withTestingLibrary(tools, findPktElementByDisplayValue),\n }\n}\n\ntype SyncQueries = typeof getAllByText | typeof getAllByLabelText | typeof getAllByTestId | typeof getAllByDisplayValue\ntype AsyncQueries =\n | FindAllByBoundAttribute\n | typeof findAllByText\n | typeof findAllByLabelText\n | typeof findAllByTestId\n | typeof findAllByDisplayValue\n\ntype QueryTypes = 'label' | 'text' | 'displayValue' | 'testid'\n\nconst syncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): SyncQueries => {\n const queries: Record<QueryTypes, SyncQueries> = {\n text: testingLibrary.getAllByText,\n label: testingLibrary.getAllByLabelText,\n testid: testingLibrary.getAllByTestId,\n displayValue: testingLibrary.getAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst asyncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): AsyncQueries => {\n const queries: Record<QueryTypes, AsyncQueries> = {\n text: testingLibrary.findAllByText,\n label: testingLibrary.findAllByLabelText,\n testid: testingLibrary.findAllByTestId,\n displayValue: testingLibrary.findAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst syncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? (getPktElementBy(testingLibrary)(query, elementOrIdentifier) as ElementType)\n : (elementOrIdentifier as ElementType)\n\nconst asyncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n async <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? ((await findPktElementBy(testingLibrary)(query, elementOrIdentifier)) as ElementType)\n : (elementOrIdentifier as ElementType)\n\nconst asyncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => Promise<ResultType>,\n query: QueryTypes = 'label',\n ) => {\n return async (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = await asyncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return await func(element, ...restArgs)\n }\n }\n\nconst syncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => ResultType,\n query: QueryTypes = 'label',\n ) => {\n return (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return func(element, ...restArgs)\n }\n }\n\nconst withTestingLibrary = <F>(testingLibrary: TestingLibraryTools, fn: (testingLibrary: TestingLibraryTools) => F) =>\n fn(testingLibrary)\n\n/**\n * Sørger for at alle brukte custom elements fra Punkt er definerte og erstattet med implementasjoner.\n * Bør kalles etter `render`, før noen operasjoner og antakelser gjøres.\n *\n * F.eks.:\n * <code>\n * render(<div><PktTextinput id=\"textinput\" name={'textInput'} label=\"My text input\" aria-label=\"My text input\" /></div>);\n * await waitForPktElementsToBeDefined();\n *\n * await setPktElementValue(\"My text input\", \"new value\");\n * </code>\n */\nconst waitForPktElementsToBeDefined = async () =>\n await Promise.all(\n PKT_CUSTOM_ELEMENTS.map((elementName) => {\n if (document.querySelector(elementName) !== null) {\n return window.customElements.whenDefined(elementName)\n }\n }).filter((promise) => promise),\n )\n\nconst findPossibleWrappingPktCustomElement =\n (testingLibrary: TestingLibraryTools) =>\n <R extends PTLElementType>(innerElement: HTMLElement | null, isByRole: boolean, args: Array<any>): PTLElementType => {\n if (!innerElement === null) {\n throw getElementError(`Finner ikke noe element med ${isByRole ? 'role' : 'label'} \"${args[0]}\"`, document.body)\n }\n const pktElement = innerElement?.closest(PKT_CUSTOM_FORMFIELDS.join(', ')) as R | null\n if (pktElement) {\n return pktElement as R\n } else {\n return innerElement as R\n }\n }\n\nconst getPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n (query: QueryTypes = 'label', identifier: string | RegExp, container?: HTMLElement): PTLElementType => {\n try {\n const queryFunc = syncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = doElementSearch(identifier, query, queryFunc, container)[0]\n return findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, [])\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst removeElementBySelector = (ancestor: HTMLElement, selector: string) => {\n const elements = Array.from(ancestor.querySelectorAll(selector))\n elements.forEach((element) => {\n element.parentNode?.removeChild(element)\n })\n}\n\nfunction getPureLabelText(label: Node) {\n const clonedLabel = label.cloneNode(true) as HTMLElement\n removeElementBySelector(clonedLabel, 'pkt-helptext')\n removeElementBySelector(clonedLabel, '.pkt-input-suffix')\n removeElementBySelector(clonedLabel, '.pkt-input-prefix')\n removeElementBySelector(clonedLabel, '.pkt-input-icon')\n removeElementBySelector(clonedLabel, '.pkt-input__counter')\n removeElementBySelector(clonedLabel, 'option')\n removeElementBySelector(clonedLabel, 'pkt-listbox')\n removeElementBySelector(clonedLabel, '.pkt-alert--error')\n removeElementBySelector(clonedLabel, '.pkt-tag')\n removeElementBySelector(clonedLabel, '.pkt-input-check__input-helptext')\n removeElementBySelector(clonedLabel, '.pkt-inputwrapper__helptext')\n return clonedLabel.textContent?.trim() || null\n}\n\nconst getPureLabelTextForLabelOwner = (labelOwner: HTMLElement): string | null => {\n const label =\n ('labels' in labelOwner &&\n labelOwner.labels instanceof NodeList &&\n labelOwner.labels.length > 0 &&\n labelOwner.labels[0]) ||\n (['input', ...PKT_CUSTOM_FORMFIELDS].includes(labelOwner.tagName.toLowerCase()) &&\n (labelOwner.querySelector('label') as HTMLLabelElement | null)) ||\n null\n if (label) {\n return getPureLabelText(label)\n } else {\n return null\n }\n}\n\nconst labelMatcher = (labelTextToMatch: string) => (nodeContent: string, element: Element | null) => {\n if (element instanceof HTMLElement) {\n const labelWithoutHelptext = getPureLabelTextForLabelOwner(element as HTMLElement)\n return labelWithoutHelptext === labelTextToMatch\n } else {\n return false\n }\n}\n\nconst fallbackSearchForPktSelectByLabel =\n (testingLibrary: TestingLibraryTools) =>\n (identifier: any, query: QueryTypes, container: HTMLElement = document.body): PTLElementType => {\n if (typeof identifier === 'string' && query === 'label') {\n // Spesial-case for <pkt-select> som ikke har aria-label\n const matchingLabel: HTMLLabelElement | undefined = Array.from(container.querySelectorAll('label')).find(\n (labelElement) => getPureLabelText(labelElement) === identifier,\n )\n const labelOwner =\n matchingLabel?.control || matchingLabel?.closest('pkt-select') || matchingLabel?.closest('pkt-combobox')\n if (!labelOwner) {\n throw getElementError(`Fant ikke noe element med label \"${identifier}\"`, container)\n }\n return labelOwner as PTLElementType\n }\n throw getElementError(`Fant ikke noe element med ${query} \"${identifier}\"`, container)\n }\n\nconst doElementSearch = <T>(\n identifier: string | RegExp,\n query: QueryTypes,\n queryFunc: (...args: Parameters<AllByBoundAttribute>) => T,\n container: HTMLElement = document.body,\n) => {\n return typeof identifier === 'string' && query === 'label'\n ? queryFunc(container, labelMatcher(identifier.trim()))\n : queryFunc(container, identifier)\n}\n\nconst findPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n async (\n query: QueryTypes = 'label',\n identifier: string | RegExp,\n container?: HTMLElement,\n ): Promise<PTLElementType> => {\n try {\n const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0]\n return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []))\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst getPktElementByLabel =\n (testingLibrary: TestingLibraryTools) => (label: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('label', label, container)\n\nconst findPktElementByLabel =\n (testingLibrary: TestingLibraryTools) =>\n async (label: string | RegExp, container?: HTMLElement): Promise<PTLElementType> =>\n findPktElementBy(testingLibrary)('label', label, container)\n\nconst getPktElementByText = (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('text', text, container)\n\nconst findPktElementByText =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('text', text, container)\n\nconst setPktElementChecked = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType, checked: boolean) => {\n if (!('checked' in element)) {\n throw new Error('Bare elementer som har en \"checked\"-attributt støttes')\n }\n let returnValue: boolean = false\n if (element.tagName === 'INPUT') {\n // https://github.com/testing-library/react-testing-library/issues/175#issuecomment-637349276\n // kentcdodds: \"this should probably be documented better, but with checkboxes you don't actually fire change\n // events, you should fire click events instead.\"\n const htmlInputElement = element as HTMLInputElement\n if (htmlInputElement.type === 'radio') {\n if (!checked) {\n throw new Error(\"Kan ikke av-velge en <input type='radio'> - prøv å velge en annen radioknapp i samme gruppe\")\n } else {\n returnValue = testingLibrary.fireEvent.click(element)\n await new Promise((resolve) => setTimeout(resolve, 0))\n }\n } else if (htmlInputElement.type === 'checkbox') {\n if (htmlInputElement.checked !== checked) {\n returnValue = testingLibrary.fireEvent.click(element)\n }\n }\n } else {\n returnValue = testingLibrary.fireEvent.change(element, { target: { checked } })\n }\n\n return Promise.resolve(returnValue)\n })\n\nconst isPktElementChecked =\n (testingLibrary: TestingLibraryTools) =>\n (target: LabelOrElement): boolean => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<PTLElementType>(target, 'label')\n\n if ('checked' in element) return !!(element as HTMLInputElement).checked\n\n const descendant = element.querySelector('input[type=\"radio\"]:checked, input[type=\"checkbox\"]:checked')\n return descendant !== null\n }\n\nconst getPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('displayValue', text, container)\n\nconst findPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('displayValue', text, container)\n\n/**\n * Representerer en option i en PktSelect.\n *\n * @property {string} 0 - verdien (value)\n * @property {string | null} 1 - Tekstinnholdet, <option>tekstinnhold</option>\n * @property {boolean} 2 - Om denne er valgt (selected)\n */\nexport type PktOption = [string, string | undefined, boolean]\n\nconst getPktSelectOptions = (testingLibrary: TestingLibraryTools) =>\n syncFuncWithStringIdentifierOrElement(testingLibrary)<PktSelect, Array<PktOption>>(\n (selectElement: PktSelect, onlySelected?: boolean): Array<PktOption> => {\n const optionElements: Array<HTMLOptionElement> = Array.from(\n selectElement.querySelectorAll('option:not(.pkt-hide), data:not(.pkt.hide)'),\n )\n const filter = onlySelected ? ([, , selected]: PktOption) => selected : (_: PktOption) => true\n const currentValue = selectElement.value\n return optionElements\n .map(\n (optionElement) =>\n [optionElement.value, optionElement.textContent?.trim(), optionElement.value === currentValue] as PktOption,\n )\n .filter(filter)\n },\n )\n\nconst getAllPktElementsByLabelText =\n (testingLibrary: TestingLibraryTools) =>\n (label: string, container?: HTMLElement): Element[] => {\n const innerElements = testingLibrary.getAllByLabelText(container || document.body, label)\n return innerElements.map((element) => findPossibleWrappingPktCustomElement(testingLibrary)(element, false, []))\n }\n\nconst setPktElementValue = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (\n element: PTLElementType,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n } = false,\n ): Promise<boolean> => {\n const options =\n typeof optionsOrUseInputEvent === 'object'\n ? optionsOrUseInputEvent\n : // Hvis det er en boolean, så vær bakoverkompatibel\n (optionsOrUseInputEvent && {\n useInputEventForNative: true,\n useChangeEventForNative: true,\n setValuePropForNative: true,\n }) || {\n useInputEventForNative: false,\n useChangeEventForNative: true,\n setValuePropForNative: false,\n }\n if (Array.isArray(valueOrValues) && valueOrValues.length > 1 && element.tagName === 'PKT-SELECT') {\n throw new Error('Multi-verdi <pkt-select> støttes ikke. Bruk <pkt-combobox> i stedet.')\n }\n if (element.tagName === 'PKT-SELECT' || element.tagName === 'PKT-COMBOBOX') {\n const pktSelect = element as HTMLSelectElement\n const multiple = pktSelect.multiple\n const valueAsArray = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues]\n const newValue = (multiple && valueAsArray) || (valueAsArray.length == 0 && '') || valueAsArray[0]\n testingLibrary.fireEvent.change(element, { target: { value: newValue } })\n return Promise.resolve(true)\n } else {\n if (options.setValuePropForNative) {\n if ('value' in element) {\n element.value = valueOrValues.toString()\n }\n }\n if (options.useInputEventForNative) {\n testingLibrary.fireEvent.input(element, { target: { value: valueOrValues } })\n }\n if (options.useChangeEventForNative) {\n testingLibrary.fireEvent.change(element, { target: { value: valueOrValues } })\n }\n return Promise.resolve(true)\n }\n },\n )\n\nconst containsRadioInput = (element: Element): boolean => {\n if (element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'radio') return true\n\n if (element.querySelector?.('input[type=\"radio\"]')) return true\n\n if (element.tagName === 'LABEL') {\n const label = element as HTMLLabelElement\n const control = label.control || (label.htmlFor ? document.getElementById(label.htmlFor) : null)\n return !!(control && (control as HTMLInputElement).type === 'radio')\n }\n\n return false\n}\n\nconst pktClickButton = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType) => {\n if (containsRadioInput(element)) {\n throw new Error('Klikk på <pkt-radiobutton> støttes ikke - bruk setPktElementChecked i stedet')\n }\n return testingLibrary.fireEvent.click(element)\n }, 'text')\n\nconst setPktSelectedOptionsByLabel = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (pktSelect: PktSelect, ...desiredOptionLabels: Array<string>) => {\n const availableOptions = getPktSelectOptions(testingLibrary)(pktSelect)\n const selectedOptions = desiredOptionLabels\n .map((optionLabel) => availableOptions.find(([_, label]) => label === optionLabel))\n .filter((possibleOption) => possibleOption) as Array<PktOption>\n if (selectedOptions.length !== desiredOptionLabels.length) {\n throw new Error(\n \"Noen av option'ene finnes ikke i denne komponenten. Du valgte \" +\n JSON.stringify(desiredOptionLabels) +\n ', mens valgmulighetene er ' +\n JSON.stringify(availableOptions.map(([, label]) => label)),\n )\n }\n\n return await setPktElementValue(testingLibrary)(\n pktSelect,\n selectedOptions.map(([value]) => value),\n )\n },\n )\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"punkt-testing-utils.es.js","sources":["../src/index.ts"],"sourcesContent":["import DomTestingLibrary, {\n FindAllByBoundAttribute,\n findAllByDisplayValue,\n findAllByLabelText,\n findAllByTestId,\n findAllByText,\n getAllByDisplayValue,\n getAllByLabelText,\n getAllByTestId,\n getAllByText,\n getElementError,\n} from '@testing-library/dom'\nimport {\n PktBackLink,\n PktCheckbox,\n PktCombobox,\n PktDatepicker,\n PktHelptext,\n PktIcon,\n PktInputWrapper,\n PktLoader,\n PktProgressbar,\n PktRadioButton,\n PktSelect,\n PktTextarea,\n} from '@oslokommune/punkt-elements'\nimport { AllByBoundAttribute } from '@testing-library/dom/types/queries'\n\nexport const PKT_CUSTOM_FORMFIELDS = [\n 'pkt-backlink',\n 'pkt-checkbox',\n 'pkt-combobox',\n 'pkt-datepicker',\n 'pkt-progressbar',\n 'pkt-radiobutton',\n 'pkt-select',\n 'pkt-textarea',\n 'pkt-textinput',\n]\nconst PKT_CUSTOM_ELEMENTS = [\n 'pkt-input-wrapper',\n 'pkt-icon',\n 'pkt-helptext',\n 'pkt-loader',\n 'pkt-backlink',\n ...PKT_CUSTOM_FORMFIELDS,\n]\n\ntype PTLElementType =\n | PktBackLink\n | PktCheckbox\n | PktCombobox\n | PktDatepicker\n | PktHelptext\n | PktIcon\n | PktInputWrapper\n | PktLoader\n | PktProgressbar\n | PktRadioButton\n | PktSelect\n | PktTextarea\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement\n\nexport type PktTestingLibraryOptions = Pick<\n typeof DomTestingLibrary,\n | 'fireEvent'\n | 'findAllByLabelText'\n | 'findAllByTestId'\n | 'findAllByDisplayValue'\n | 'findAllByText'\n | 'getAllByLabelText'\n | 'getAllByTestId'\n | 'getAllByDisplayValue'\n | 'getAllByText'\n>\n\ntype TestingLibraryTools = {\n fireEvent: typeof DomTestingLibrary.fireEvent\n findAllByLabelText: typeof DomTestingLibrary.findAllByLabelText\n findAllByTestId: typeof DomTestingLibrary.findAllByTestId\n findAllByDisplayValue: typeof DomTestingLibrary.findAllByDisplayValue\n findAllByText: typeof DomTestingLibrary.findAllByText\n getAllByLabelText: typeof DomTestingLibrary.getAllByLabelText\n getAllByTestId: typeof DomTestingLibrary.getAllByTestId\n getAllByDisplayValue: typeof DomTestingLibrary.getAllByDisplayValue\n getAllByText: typeof DomTestingLibrary.getAllByText\n}\n\nexport type LabelOrElement<ElementType = PTLElementType> = string | RegExp | ElementType | HTMLLabelElement\n\nexport type PktElementValueType = string | number | Date\n\nexport type PktTestingLibrary = {\n findPktElementByLabelText: (\n label: string | RegExp | HTMLLabelElement,\n container?: HTMLElement,\n ) => Promise<PTLElementType>\n getPktElementByLabelText: (label: string | RegExp | HTMLLabelElement, container?: HTMLElement) => PTLElementType\n getPktSelectOptions: (labelOrElement: LabelOrElement<PktSelect>, onlySelected?: boolean) => Array<PktOption>\n getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[]\n setPktElementChecked: (labelOrElement: LabelOrElement, checked: boolean) => Promise<boolean>\n isPktElementChecked: (labelOrElement: LabelOrElement) => boolean\n setPktElementValue: (\n labelOrElement: LabelOrElement,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent?:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n },\n ) => Promise<boolean>\n pktClickButton: (labelOrElement: LabelOrElement<HTMLInputElement | HTMLButtonElement>) => Promise<boolean>\n waitForPktElementsToBeDefined: () => Promise<any>\n setPktSelectedOptionsByLabel: (\n labelOrElement: LabelOrElement<PktSelect>,\n ...desiredOptionLabels: Array<string>\n ) => Promise<any>\n getPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => PTLElementType\n findPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>\n}\n\nexport const setupPktTestingLibrary: (options: PktTestingLibraryOptions) => PktTestingLibrary = (\n options: PktTestingLibraryOptions,\n) => {\n const tools: TestingLibraryTools = {\n fireEvent: options.fireEvent,\n findAllByLabelText: options.findAllByLabelText,\n findAllByDisplayValue: options.findAllByDisplayValue,\n findAllByTestId: options.findAllByTestId,\n findAllByText: options.findAllByText,\n getAllByLabelText: options.getAllByLabelText,\n getAllByDisplayValue: options.getAllByDisplayValue,\n getAllByTestId: options.getAllByTestId,\n getAllByText: options.getAllByText,\n }\n return {\n findPktElementByLabelText: withTestingLibrary(tools, findPktElementByLabel),\n waitForPktElementsToBeDefined,\n getPktElementByLabelText: withTestingLibrary(tools, getPktElementByLabel),\n setPktElementChecked: withTestingLibrary(tools, setPktElementChecked),\n isPktElementChecked: withTestingLibrary(tools, isPktElementChecked),\n getPktSelectOptions: withTestingLibrary(tools, getPktSelectOptions),\n getAllPktElementsByLabelText: withTestingLibrary(tools, getAllPktElementsByLabelText),\n setPktElementValue: withTestingLibrary(tools, setPktElementValue),\n pktClickButton: withTestingLibrary(tools, pktClickButton),\n setPktSelectedOptionsByLabel: withTestingLibrary(tools, setPktSelectedOptionsByLabel),\n getPktElementByDisplayValue: withTestingLibrary(tools, getPktElementByDisplayValue),\n findPktElementByDisplayValue: withTestingLibrary(tools, findPktElementByDisplayValue),\n }\n}\n\ntype SyncQueries = typeof getAllByText | typeof getAllByLabelText | typeof getAllByTestId | typeof getAllByDisplayValue\ntype AsyncQueries =\n | FindAllByBoundAttribute\n | typeof findAllByText\n | typeof findAllByLabelText\n | typeof findAllByTestId\n | typeof findAllByDisplayValue\n\ntype QueryTypes = 'label' | 'text' | 'displayValue' | 'testid'\n\nconst syncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): SyncQueries => {\n const queries: Record<QueryTypes, SyncQueries> = {\n text: testingLibrary.getAllByText,\n label: testingLibrary.getAllByLabelText,\n testid: testingLibrary.getAllByTestId,\n displayValue: testingLibrary.getAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst asyncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): AsyncQueries => {\n const queries: Record<QueryTypes, AsyncQueries> = {\n text: testingLibrary.findAllByText,\n label: testingLibrary.findAllByLabelText,\n testid: testingLibrary.findAllByTestId,\n displayValue: testingLibrary.findAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst syncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? (getPktElementBy(testingLibrary)(query, elementOrIdentifier) as ElementType)\n : (elementOrIdentifier as ElementType)\n\nconst getByLabelElement = <ElementType>(possibleLabelElement: HTMLLabelElement) => {\n const control = possibleLabelElement instanceof HTMLLabelElement && (possibleLabelElement.control as ElementType)\n if (control) {\n return control\n } else {\n throw new Error('Fant ikke noe skjema-element for labelen: ' + possibleLabelElement.outerHTML)\n }\n}\n\nconst asyncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n async <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n (elementOrIdentifier instanceof HTMLLabelElement && getByLabelElement<ElementType>(elementOrIdentifier)) ||\n (typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? ((await findPktElementBy(testingLibrary)(query, elementOrIdentifier)) as ElementType)\n : (elementOrIdentifier as ElementType))\n\nconst asyncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => Promise<ResultType>,\n query: QueryTypes = 'label',\n ) => {\n return async (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = await asyncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return await func(element, ...restArgs)\n }\n }\n\nconst syncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => ResultType,\n query: QueryTypes = 'label',\n ) => {\n return (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return func(element, ...restArgs)\n }\n }\n\nconst withTestingLibrary = <F>(testingLibrary: TestingLibraryTools, fn: (testingLibrary: TestingLibraryTools) => F) =>\n fn(testingLibrary)\n\n/**\n * Sørger for at alle brukte custom elements fra Punkt er definerte og erstattet med implementasjoner.\n * Bør kalles etter `render`, før noen operasjoner og antakelser gjøres.\n *\n * F.eks.:\n * <code>\n * render(<div><PktTextinput id=\"textinput\" name={'textInput'} label=\"My text input\" aria-label=\"My text input\" /></div>);\n * await waitForPktElementsToBeDefined();\n *\n * await setPktElementValue(\"My text input\", \"new value\");\n * </code>\n */\nconst waitForPktElementsToBeDefined = async () =>\n await Promise.all(\n PKT_CUSTOM_ELEMENTS.map((elementName) => {\n if (document.querySelector(elementName) !== null) {\n return window.customElements.whenDefined(elementName)\n }\n }).filter((promise) => promise),\n )\n\nconst findPossibleWrappingPktCustomElement =\n (testingLibrary: TestingLibraryTools) =>\n <R extends PTLElementType>(innerElement: HTMLElement | null, isByRole: boolean, args: Array<any>): PTLElementType => {\n if (!innerElement === null) {\n throw getElementError(`Finner ikke noe element med ${isByRole ? 'role' : 'label'} \"${args[0]}\"`, document.body)\n }\n const pktElement = innerElement?.closest(PKT_CUSTOM_FORMFIELDS.join(', ')) as R | null\n if (pktElement) {\n return pktElement as R\n } else {\n return innerElement as R\n }\n }\n\nconst getPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n (query: QueryTypes = 'label', identifier: string | RegExp, container?: HTMLElement): PTLElementType => {\n try {\n const queryFunc = syncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = doElementSearch(identifier, query, queryFunc, container)[0]\n return findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, [])\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst removeElementBySelector = (ancestor: HTMLElement, selector: string) => {\n const elements = Array.from(ancestor.querySelectorAll(selector))\n elements.forEach((element) => {\n element.parentNode?.removeChild(element)\n })\n}\n\nfunction getPureLabelText(label: Node) {\n const clonedLabel = label.cloneNode(true) as HTMLElement\n removeElementBySelector(clonedLabel, 'pkt-helptext')\n removeElementBySelector(clonedLabel, '.pkt-input-suffix')\n removeElementBySelector(clonedLabel, '.pkt-input-prefix')\n removeElementBySelector(clonedLabel, '.pkt-input-icon')\n removeElementBySelector(clonedLabel, '.pkt-input__counter')\n removeElementBySelector(clonedLabel, 'option')\n removeElementBySelector(clonedLabel, 'pkt-listbox')\n removeElementBySelector(clonedLabel, '.pkt-alert--error')\n removeElementBySelector(clonedLabel, '.pkt-tag')\n removeElementBySelector(clonedLabel, '.pkt-input-check__input-helptext')\n removeElementBySelector(clonedLabel, '.pkt-inputwrapper__helptext')\n return clonedLabel.textContent?.trim() || null\n}\n\nconst getPureLabelTextForLabelOwner = (labelOwner: HTMLElement): string | null => {\n const label =\n ('labels' in labelOwner &&\n labelOwner.labels instanceof NodeList &&\n labelOwner.labels.length > 0 &&\n labelOwner.labels[0]) ||\n (['input', ...PKT_CUSTOM_FORMFIELDS].includes(labelOwner.tagName.toLowerCase()) &&\n (labelOwner.querySelector('label') as HTMLLabelElement | null)) ||\n null\n if (label) {\n return getPureLabelText(label)\n } else {\n return null\n }\n}\n\nconst labelMatcher = (labelTextToMatch: string) => (nodeContent: string, element: Element | null) => {\n if (element instanceof HTMLElement) {\n const labelWithoutHelptext = getPureLabelTextForLabelOwner(element as HTMLElement)\n return labelWithoutHelptext === labelTextToMatch\n } else {\n return false\n }\n}\n\nconst fallbackSearchForPktSelectByLabel =\n (testingLibrary: TestingLibraryTools) =>\n (identifier: any, query: QueryTypes, container: HTMLElement = document.body): PTLElementType => {\n if (typeof identifier === 'string' && query === 'label') {\n // Spesial-case for <pkt-select> som ikke har aria-label\n const matchingLabel: HTMLLabelElement | undefined = Array.from(container.querySelectorAll('label')).find(\n (labelElement) => getPureLabelText(labelElement) === identifier,\n )\n const labelOwner =\n matchingLabel?.control || matchingLabel?.closest('pkt-select') || matchingLabel?.closest('pkt-combobox')\n if (!labelOwner) {\n throw getElementError(`Fant ikke noe element med label \"${identifier}\"`, container)\n }\n return labelOwner as PTLElementType\n }\n throw getElementError(`Fant ikke noe element med ${query} \"${identifier}\"`, container)\n }\n\nconst doElementSearch = <T>(\n identifier: string | RegExp | HTMLLabelElement,\n query: QueryTypes,\n queryFunc: (...args: Parameters<AllByBoundAttribute>) => T,\n container: HTMLElement = document.body,\n): T => {\n return identifier instanceof HTMLLabelElement\n ? getByLabelElement(identifier)\n : typeof identifier === 'string' && query === 'label'\n ? queryFunc(container, labelMatcher(identifier.trim()))\n : queryFunc(container, identifier)\n}\n\nconst findPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n async (\n query: QueryTypes = 'label',\n identifier: string | RegExp | HTMLLabelElement,\n container?: HTMLElement,\n ): Promise<PTLElementType> => {\n try {\n if (identifier instanceof HTMLLabelElement) {\n return Promise.resolve(getByLabelElement<PTLElementType>(identifier))\n }\n const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0]\n return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []))\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst getPktElementByLabel =\n (testingLibrary: TestingLibraryTools) => (label: string | RegExp | HTMLLabelElement, container?: HTMLElement) =>\n label instanceof HTMLLabelElement\n ? getByLabelElement<PTLElementType>(label)\n : getPktElementBy(testingLibrary)('label', label, container)\n\nconst findPktElementByLabel =\n (testingLibrary: TestingLibraryTools) =>\n async (label: string | RegExp | HTMLLabelElement, container?: HTMLElement): Promise<PTLElementType> =>\n label instanceof HTMLLabelElement\n ? getByLabelElement<PTLElementType>(label)\n : findPktElementBy(testingLibrary)('label', label, container)\n\nconst getPktElementByText = (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('text', text, container)\n\nconst findPktElementByText =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('text', text, container)\n\nconst setPktElementChecked = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType, checked: boolean) => {\n if (!('checked' in element)) {\n throw new Error('Bare elementer som har en \"checked\"-attributt støttes')\n }\n let returnValue: boolean = false\n if (element.tagName === 'INPUT') {\n // https://github.com/testing-library/react-testing-library/issues/175#issuecomment-637349276\n // kentcdodds: \"this should probably be documented better, but with checkboxes you don't actually fire change\n // events, you should fire click events instead.\"\n const htmlInputElement = element as HTMLInputElement\n if (htmlInputElement.type === 'radio') {\n if (!checked) {\n throw new Error(\"Kan ikke av-velge en <input type='radio'> - prøv å velge en annen radioknapp i samme gruppe\")\n } else {\n returnValue = testingLibrary.fireEvent.click(element)\n await new Promise((resolve) => setTimeout(resolve, 0))\n }\n } else if (htmlInputElement.type === 'checkbox') {\n if (htmlInputElement.checked !== checked) {\n returnValue = testingLibrary.fireEvent.click(element)\n }\n }\n } else {\n returnValue = testingLibrary.fireEvent.change(element, { target: { checked } })\n }\n\n return Promise.resolve(returnValue)\n })\n\nconst isPktElementChecked =\n (testingLibrary: TestingLibraryTools) =>\n (target: LabelOrElement): boolean => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<PTLElementType>(target, 'label')\n\n if ('checked' in element) return !!(element as HTMLInputElement).checked\n\n const descendant = element.querySelector('input[type=\"radio\"]:checked, input[type=\"checkbox\"]:checked')\n return descendant !== null\n }\n\nconst getPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('displayValue', text, container)\n\nconst findPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('displayValue', text, container)\n\n/**\n * Representerer en option i en PktSelect.\n *\n * @property {string} 0 - verdien (value)\n * @property {string | null} 1 - Tekstinnholdet, <option>tekstinnhold</option>\n * @property {boolean} 2 - Om denne er valgt (selected)\n */\nexport type PktOption = [string, string | undefined, boolean]\n\nconst getPktSelectOptions = (testingLibrary: TestingLibraryTools) =>\n syncFuncWithStringIdentifierOrElement(testingLibrary)<PktSelect, Array<PktOption>>(\n (selectElement: PktSelect, onlySelected?: boolean): Array<PktOption> => {\n const optionElements: Array<HTMLOptionElement> = Array.from(\n selectElement.querySelectorAll('option:not(.pkt-hide), data:not(.pkt.hide)'),\n )\n const filter = onlySelected ? ([, , selected]: PktOption) => selected : (_: PktOption) => true\n const currentValue = selectElement.value\n return optionElements\n .map(\n (optionElement) =>\n [optionElement.value, optionElement.textContent?.trim(), optionElement.value === currentValue] as PktOption,\n )\n .filter(filter)\n },\n )\n\nconst getAllPktElementsByLabelText =\n (testingLibrary: TestingLibraryTools) =>\n (label: string, container?: HTMLElement): Element[] => {\n const innerElements = testingLibrary.getAllByLabelText(container || document.body, label)\n return innerElements.map((element) => findPossibleWrappingPktCustomElement(testingLibrary)(element, false, []))\n }\n\nconst setPktElementValue = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (\n element: PTLElementType,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n } = false,\n ): Promise<boolean> => {\n const options =\n typeof optionsOrUseInputEvent === 'object'\n ? optionsOrUseInputEvent\n : // Hvis det er en boolean, så vær bakoverkompatibel\n (optionsOrUseInputEvent && {\n useInputEventForNative: true,\n useChangeEventForNative: true,\n setValuePropForNative: true,\n }) || {\n useInputEventForNative: false,\n useChangeEventForNative: true,\n setValuePropForNative: false,\n }\n if (Array.isArray(valueOrValues) && valueOrValues.length > 1 && element.tagName === 'PKT-SELECT') {\n throw new Error('Multi-verdi <pkt-select> støttes ikke. Bruk <pkt-combobox> i stedet.')\n }\n if (element.tagName === 'PKT-SELECT' || element.tagName === 'PKT-COMBOBOX') {\n const pktSelect = element as HTMLSelectElement\n const multiple = pktSelect.multiple\n const valueAsArray = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues]\n const newValue = (multiple && valueAsArray) || (valueAsArray.length == 0 && '') || valueAsArray[0]\n testingLibrary.fireEvent.change(element, { target: { value: newValue } })\n return Promise.resolve(true)\n } else {\n if (options.setValuePropForNative) {\n if ('value' in element) {\n element.value = valueOrValues.toString()\n }\n }\n if (options.useInputEventForNative) {\n testingLibrary.fireEvent.input(element, { target: { value: valueOrValues } })\n }\n if (options.useChangeEventForNative) {\n testingLibrary.fireEvent.change(element, { target: { value: valueOrValues } })\n }\n return Promise.resolve(true)\n }\n },\n )\n\nconst containsRadioInput = (element: Element): boolean => {\n if (element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'radio') return true\n\n if (element.querySelector?.('input[type=\"radio\"]')) return true\n\n if (element.tagName === 'LABEL') {\n const label = element as HTMLLabelElement\n const control = label.control || (label.htmlFor ? document.getElementById(label.htmlFor) : null)\n return !!(control && (control as HTMLInputElement).type === 'radio')\n }\n\n return false\n}\n\nconst pktClickButton = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType) => {\n if (containsRadioInput(element)) {\n throw new Error('Klikk på <pkt-radiobutton> støttes ikke - bruk setPktElementChecked i stedet')\n }\n return testingLibrary.fireEvent.click(element)\n }, 'text')\n\nconst setPktSelectedOptionsByLabel = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (pktSelect: PktSelect, ...desiredOptionLabels: Array<string>) => {\n const availableOptions = getPktSelectOptions(testingLibrary)(pktSelect)\n const selectedOptions = desiredOptionLabels\n .map((optionLabel) => availableOptions.find(([_, label]) => label === optionLabel))\n .filter((possibleOption) => possibleOption) as Array<PktOption>\n if (selectedOptions.length !== desiredOptionLabels.length) {\n throw new Error(\n \"Noen av option'ene finnes ikke i denne komponenten. Du valgte \" +\n JSON.stringify(desiredOptionLabels) +\n ', mens valgmulighetene er ' +\n JSON.stringify(availableOptions.map(([, label]) => label)),\n )\n }\n\n return await setPktElementValue(testingLibrary)(\n pktSelect,\n selectedOptions.map(([value]) => value),\n )\n },\n )\n"],"names":[],"mappings":"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"}
@@ -77,7 +77,15 @@
77
77
  }
78
78
  };
79
79
  const syncResolveIdentifierOrElement = (testingLibrary) => (elementOrIdentifier, query) => typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? getPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier;
80
- const asyncResolveIdentifierOrElement = (testingLibrary) => async (elementOrIdentifier, query) => typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? await findPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier;
80
+ const getByLabelElement = (possibleLabelElement) => {
81
+ const control = possibleLabelElement instanceof HTMLLabelElement && possibleLabelElement.control;
82
+ if (control) {
83
+ return control;
84
+ } else {
85
+ throw new Error("Fant ikke noe skjema-element for labelen: " + possibleLabelElement.outerHTML);
86
+ }
87
+ };
88
+ const asyncResolveIdentifierOrElement = (testingLibrary) => async (elementOrIdentifier, query) => elementOrIdentifier instanceof HTMLLabelElement && getByLabelElement(elementOrIdentifier) || (typeof elementOrIdentifier === "string" || elementOrIdentifier instanceof RegExp ? await findPktElementBy(testingLibrary)(query, elementOrIdentifier) : elementOrIdentifier);
81
89
  const asyncFuncWithStringIdentifierOrElement = (testingLibrary) => (func, query = "label") => {
82
90
  return async (labelOrPktElement, ...restArgs) => {
83
91
  const element = await asyncResolveIdentifierOrElement(testingLibrary)(labelOrPktElement, query);
@@ -171,10 +179,13 @@
171
179
  throw dom.getElementError(`Fant ikke noe element med ${query} "${identifier}"`, container);
172
180
  };
173
181
  const doElementSearch = (identifier, query, queryFunc, container = document.body) => {
174
- return typeof identifier === "string" && query === "label" ? queryFunc(container, labelMatcher(identifier.trim())) : queryFunc(container, identifier);
182
+ return identifier instanceof HTMLLabelElement ? getByLabelElement(identifier) : typeof identifier === "string" && query === "label" ? queryFunc(container, labelMatcher(identifier.trim())) : queryFunc(container, identifier);
175
183
  };
176
184
  const findPktElementBy = (testingLibrary) => async (query = "label", identifier, container) => {
177
185
  try {
186
+ if (identifier instanceof HTMLLabelElement) {
187
+ return Promise.resolve(getByLabelElement(identifier));
188
+ }
178
189
  const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query);
179
190
  const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0];
180
191
  return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []));
@@ -182,8 +193,8 @@
182
193
  return fallbackSearchForPktSelectByLabel()(identifier, query, container);
183
194
  }
184
195
  };
185
- const getPktElementByLabel = (testingLibrary) => (label, container) => getPktElementBy(testingLibrary)("label", label, container);
186
- const findPktElementByLabel = (testingLibrary) => async (label, container) => findPktElementBy(testingLibrary)("label", label, container);
196
+ const getPktElementByLabel = (testingLibrary) => (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : getPktElementBy(testingLibrary)("label", label, container);
197
+ const findPktElementByLabel = (testingLibrary) => async (label, container) => label instanceof HTMLLabelElement ? getByLabelElement(label) : findPktElementBy(testingLibrary)("label", label, container);
187
198
  const setPktElementChecked = (testingLibrary) => asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element, checked) => {
188
199
  if (!("checked" in element)) {
189
200
  throw new Error('Bare elementer som har en "checked"-attributt støttes');
@@ -1 +1 @@
1
- {"version":3,"file":"punkt-testing-utils.umd.js","sources":["../src/index.ts"],"sourcesContent":["import DomTestingLibrary, {\n FindAllByBoundAttribute,\n findAllByDisplayValue,\n findAllByLabelText,\n findAllByTestId,\n findAllByText,\n getAllByDisplayValue,\n getAllByLabelText,\n getAllByTestId,\n getAllByText,\n getElementError,\n} from '@testing-library/dom'\nimport {\n PktBackLink,\n PktCheckbox,\n PktCombobox,\n PktDatepicker,\n PktHelptext,\n PktIcon,\n PktInputWrapper,\n PktLoader,\n PktProgressbar,\n PktRadioButton,\n PktSelect,\n PktTextarea,\n} from '@oslokommune/punkt-elements'\nimport { AllByBoundAttribute } from '@testing-library/dom/types/queries'\n\nexport const PKT_CUSTOM_FORMFIELDS = [\n 'pkt-backlink',\n 'pkt-checkbox',\n 'pkt-combobox',\n 'pkt-datepicker',\n 'pkt-progressbar',\n 'pkt-radiobutton',\n 'pkt-select',\n 'pkt-textarea',\n 'pkt-textinput',\n]\nconst PKT_CUSTOM_ELEMENTS = [\n 'pkt-input-wrapper',\n 'pkt-icon',\n 'pkt-helptext',\n 'pkt-loader',\n 'pkt-backlink',\n ...PKT_CUSTOM_FORMFIELDS,\n]\n\ntype PTLElementType =\n | PktBackLink\n | PktCheckbox\n | PktCombobox\n | PktDatepicker\n | PktHelptext\n | PktIcon\n | PktInputWrapper\n | PktLoader\n | PktProgressbar\n | PktRadioButton\n | PktSelect\n | PktTextarea\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement\n\nexport type PktTestingLibraryOptions = Pick<\n typeof DomTestingLibrary,\n | 'fireEvent'\n | 'findAllByLabelText'\n | 'findAllByTestId'\n | 'findAllByDisplayValue'\n | 'findAllByText'\n | 'getAllByLabelText'\n | 'getAllByTestId'\n | 'getAllByDisplayValue'\n | 'getAllByText'\n>\n\ntype TestingLibraryTools = {\n fireEvent: typeof DomTestingLibrary.fireEvent\n findAllByLabelText: typeof DomTestingLibrary.findAllByLabelText\n findAllByTestId: typeof DomTestingLibrary.findAllByTestId\n findAllByDisplayValue: typeof DomTestingLibrary.findAllByDisplayValue\n findAllByText: typeof DomTestingLibrary.findAllByText\n getAllByLabelText: typeof DomTestingLibrary.getAllByLabelText\n getAllByTestId: typeof DomTestingLibrary.getAllByTestId\n getAllByDisplayValue: typeof DomTestingLibrary.getAllByDisplayValue\n getAllByText: typeof DomTestingLibrary.getAllByText\n}\n\nexport type LabelOrElement<ElementType = PTLElementType> = string | RegExp | ElementType\n\nexport type PktElementValueType = string | number | Date\n\nexport type PktTestingLibrary = {\n findPktElementByLabelText: (label: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>\n getPktElementByLabelText: (label: string | RegExp, container?: HTMLElement) => PTLElementType\n getPktSelectOptions: (labelOrElement: LabelOrElement<PktSelect>, onlySelected?: boolean) => Array<PktOption>\n getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[]\n setPktElementChecked: (labelOrElement: LabelOrElement, checked: boolean) => Promise<boolean>\n isPktElementChecked: (labelOrElement: LabelOrElement) => boolean\n setPktElementValue: (\n labelOrElement: LabelOrElement,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent?:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n },\n ) => Promise<boolean>\n pktClickButton: (labelOrElement: LabelOrElement<HTMLInputElement | HTMLButtonElement>) => Promise<boolean>\n waitForPktElementsToBeDefined: () => Promise<any>\n setPktSelectedOptionsByLabel: (\n labelOrElement: LabelOrElement<PktSelect>,\n ...desiredOptionLabels: Array<string>\n ) => Promise<any>\n getPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => PTLElementType\n findPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>\n}\n\nexport const setupPktTestingLibrary: (options: PktTestingLibraryOptions) => PktTestingLibrary = (\n options: PktTestingLibraryOptions,\n) => {\n const tools: TestingLibraryTools = {\n fireEvent: options.fireEvent,\n findAllByLabelText: options.findAllByLabelText,\n findAllByDisplayValue: options.findAllByDisplayValue,\n findAllByTestId: options.findAllByTestId,\n findAllByText: options.findAllByText,\n getAllByLabelText: options.getAllByLabelText,\n getAllByDisplayValue: options.getAllByDisplayValue,\n getAllByTestId: options.getAllByTestId,\n getAllByText: options.getAllByText,\n }\n return {\n findPktElementByLabelText: withTestingLibrary(tools, findPktElementByLabel),\n waitForPktElementsToBeDefined,\n getPktElementByLabelText: withTestingLibrary(tools, getPktElementByLabel),\n setPktElementChecked: withTestingLibrary(tools, setPktElementChecked),\n isPktElementChecked: withTestingLibrary(tools, isPktElementChecked),\n getPktSelectOptions: withTestingLibrary(tools, getPktSelectOptions),\n getAllPktElementsByLabelText: withTestingLibrary(tools, getAllPktElementsByLabelText),\n setPktElementValue: withTestingLibrary(tools, setPktElementValue),\n pktClickButton: withTestingLibrary(tools, pktClickButton),\n setPktSelectedOptionsByLabel: withTestingLibrary(tools, setPktSelectedOptionsByLabel),\n getPktElementByDisplayValue: withTestingLibrary(tools, getPktElementByDisplayValue),\n findPktElementByDisplayValue: withTestingLibrary(tools, findPktElementByDisplayValue),\n }\n}\n\ntype SyncQueries = typeof getAllByText | typeof getAllByLabelText | typeof getAllByTestId | typeof getAllByDisplayValue\ntype AsyncQueries =\n | FindAllByBoundAttribute\n | typeof findAllByText\n | typeof findAllByLabelText\n | typeof findAllByTestId\n | typeof findAllByDisplayValue\n\ntype QueryTypes = 'label' | 'text' | 'displayValue' | 'testid'\n\nconst syncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): SyncQueries => {\n const queries: Record<QueryTypes, SyncQueries> = {\n text: testingLibrary.getAllByText,\n label: testingLibrary.getAllByLabelText,\n testid: testingLibrary.getAllByTestId,\n displayValue: testingLibrary.getAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst asyncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): AsyncQueries => {\n const queries: Record<QueryTypes, AsyncQueries> = {\n text: testingLibrary.findAllByText,\n label: testingLibrary.findAllByLabelText,\n testid: testingLibrary.findAllByTestId,\n displayValue: testingLibrary.findAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst syncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? (getPktElementBy(testingLibrary)(query, elementOrIdentifier) as ElementType)\n : (elementOrIdentifier as ElementType)\n\nconst asyncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n async <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? ((await findPktElementBy(testingLibrary)(query, elementOrIdentifier)) as ElementType)\n : (elementOrIdentifier as ElementType)\n\nconst asyncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => Promise<ResultType>,\n query: QueryTypes = 'label',\n ) => {\n return async (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = await asyncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return await func(element, ...restArgs)\n }\n }\n\nconst syncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => ResultType,\n query: QueryTypes = 'label',\n ) => {\n return (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return func(element, ...restArgs)\n }\n }\n\nconst withTestingLibrary = <F>(testingLibrary: TestingLibraryTools, fn: (testingLibrary: TestingLibraryTools) => F) =>\n fn(testingLibrary)\n\n/**\n * Sørger for at alle brukte custom elements fra Punkt er definerte og erstattet med implementasjoner.\n * Bør kalles etter `render`, før noen operasjoner og antakelser gjøres.\n *\n * F.eks.:\n * <code>\n * render(<div><PktTextinput id=\"textinput\" name={'textInput'} label=\"My text input\" aria-label=\"My text input\" /></div>);\n * await waitForPktElementsToBeDefined();\n *\n * await setPktElementValue(\"My text input\", \"new value\");\n * </code>\n */\nconst waitForPktElementsToBeDefined = async () =>\n await Promise.all(\n PKT_CUSTOM_ELEMENTS.map((elementName) => {\n if (document.querySelector(elementName) !== null) {\n return window.customElements.whenDefined(elementName)\n }\n }).filter((promise) => promise),\n )\n\nconst findPossibleWrappingPktCustomElement =\n (testingLibrary: TestingLibraryTools) =>\n <R extends PTLElementType>(innerElement: HTMLElement | null, isByRole: boolean, args: Array<any>): PTLElementType => {\n if (!innerElement === null) {\n throw getElementError(`Finner ikke noe element med ${isByRole ? 'role' : 'label'} \"${args[0]}\"`, document.body)\n }\n const pktElement = innerElement?.closest(PKT_CUSTOM_FORMFIELDS.join(', ')) as R | null\n if (pktElement) {\n return pktElement as R\n } else {\n return innerElement as R\n }\n }\n\nconst getPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n (query: QueryTypes = 'label', identifier: string | RegExp, container?: HTMLElement): PTLElementType => {\n try {\n const queryFunc = syncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = doElementSearch(identifier, query, queryFunc, container)[0]\n return findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, [])\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst removeElementBySelector = (ancestor: HTMLElement, selector: string) => {\n const elements = Array.from(ancestor.querySelectorAll(selector))\n elements.forEach((element) => {\n element.parentNode?.removeChild(element)\n })\n}\n\nfunction getPureLabelText(label: Node) {\n const clonedLabel = label.cloneNode(true) as HTMLElement\n removeElementBySelector(clonedLabel, 'pkt-helptext')\n removeElementBySelector(clonedLabel, '.pkt-input-suffix')\n removeElementBySelector(clonedLabel, '.pkt-input-prefix')\n removeElementBySelector(clonedLabel, '.pkt-input-icon')\n removeElementBySelector(clonedLabel, '.pkt-input__counter')\n removeElementBySelector(clonedLabel, 'option')\n removeElementBySelector(clonedLabel, 'pkt-listbox')\n removeElementBySelector(clonedLabel, '.pkt-alert--error')\n removeElementBySelector(clonedLabel, '.pkt-tag')\n removeElementBySelector(clonedLabel, '.pkt-input-check__input-helptext')\n removeElementBySelector(clonedLabel, '.pkt-inputwrapper__helptext')\n return clonedLabel.textContent?.trim() || null\n}\n\nconst getPureLabelTextForLabelOwner = (labelOwner: HTMLElement): string | null => {\n const label =\n ('labels' in labelOwner &&\n labelOwner.labels instanceof NodeList &&\n labelOwner.labels.length > 0 &&\n labelOwner.labels[0]) ||\n (['input', ...PKT_CUSTOM_FORMFIELDS].includes(labelOwner.tagName.toLowerCase()) &&\n (labelOwner.querySelector('label') as HTMLLabelElement | null)) ||\n null\n if (label) {\n return getPureLabelText(label)\n } else {\n return null\n }\n}\n\nconst labelMatcher = (labelTextToMatch: string) => (nodeContent: string, element: Element | null) => {\n if (element instanceof HTMLElement) {\n const labelWithoutHelptext = getPureLabelTextForLabelOwner(element as HTMLElement)\n return labelWithoutHelptext === labelTextToMatch\n } else {\n return false\n }\n}\n\nconst fallbackSearchForPktSelectByLabel =\n (testingLibrary: TestingLibraryTools) =>\n (identifier: any, query: QueryTypes, container: HTMLElement = document.body): PTLElementType => {\n if (typeof identifier === 'string' && query === 'label') {\n // Spesial-case for <pkt-select> som ikke har aria-label\n const matchingLabel: HTMLLabelElement | undefined = Array.from(container.querySelectorAll('label')).find(\n (labelElement) => getPureLabelText(labelElement) === identifier,\n )\n const labelOwner =\n matchingLabel?.control || matchingLabel?.closest('pkt-select') || matchingLabel?.closest('pkt-combobox')\n if (!labelOwner) {\n throw getElementError(`Fant ikke noe element med label \"${identifier}\"`, container)\n }\n return labelOwner as PTLElementType\n }\n throw getElementError(`Fant ikke noe element med ${query} \"${identifier}\"`, container)\n }\n\nconst doElementSearch = <T>(\n identifier: string | RegExp,\n query: QueryTypes,\n queryFunc: (...args: Parameters<AllByBoundAttribute>) => T,\n container: HTMLElement = document.body,\n) => {\n return typeof identifier === 'string' && query === 'label'\n ? queryFunc(container, labelMatcher(identifier.trim()))\n : queryFunc(container, identifier)\n}\n\nconst findPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n async (\n query: QueryTypes = 'label',\n identifier: string | RegExp,\n container?: HTMLElement,\n ): Promise<PTLElementType> => {\n try {\n const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0]\n return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []))\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst getPktElementByLabel =\n (testingLibrary: TestingLibraryTools) => (label: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('label', label, container)\n\nconst findPktElementByLabel =\n (testingLibrary: TestingLibraryTools) =>\n async (label: string | RegExp, container?: HTMLElement): Promise<PTLElementType> =>\n findPktElementBy(testingLibrary)('label', label, container)\n\nconst getPktElementByText = (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('text', text, container)\n\nconst findPktElementByText =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('text', text, container)\n\nconst setPktElementChecked = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType, checked: boolean) => {\n if (!('checked' in element)) {\n throw new Error('Bare elementer som har en \"checked\"-attributt støttes')\n }\n let returnValue: boolean = false\n if (element.tagName === 'INPUT') {\n // https://github.com/testing-library/react-testing-library/issues/175#issuecomment-637349276\n // kentcdodds: \"this should probably be documented better, but with checkboxes you don't actually fire change\n // events, you should fire click events instead.\"\n const htmlInputElement = element as HTMLInputElement\n if (htmlInputElement.type === 'radio') {\n if (!checked) {\n throw new Error(\"Kan ikke av-velge en <input type='radio'> - prøv å velge en annen radioknapp i samme gruppe\")\n } else {\n returnValue = testingLibrary.fireEvent.click(element)\n await new Promise((resolve) => setTimeout(resolve, 0))\n }\n } else if (htmlInputElement.type === 'checkbox') {\n if (htmlInputElement.checked !== checked) {\n returnValue = testingLibrary.fireEvent.click(element)\n }\n }\n } else {\n returnValue = testingLibrary.fireEvent.change(element, { target: { checked } })\n }\n\n return Promise.resolve(returnValue)\n })\n\nconst isPktElementChecked =\n (testingLibrary: TestingLibraryTools) =>\n (target: LabelOrElement): boolean => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<PTLElementType>(target, 'label')\n\n if ('checked' in element) return !!(element as HTMLInputElement).checked\n\n const descendant = element.querySelector('input[type=\"radio\"]:checked, input[type=\"checkbox\"]:checked')\n return descendant !== null\n }\n\nconst getPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('displayValue', text, container)\n\nconst findPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('displayValue', text, container)\n\n/**\n * Representerer en option i en PktSelect.\n *\n * @property {string} 0 - verdien (value)\n * @property {string | null} 1 - Tekstinnholdet, <option>tekstinnhold</option>\n * @property {boolean} 2 - Om denne er valgt (selected)\n */\nexport type PktOption = [string, string | undefined, boolean]\n\nconst getPktSelectOptions = (testingLibrary: TestingLibraryTools) =>\n syncFuncWithStringIdentifierOrElement(testingLibrary)<PktSelect, Array<PktOption>>(\n (selectElement: PktSelect, onlySelected?: boolean): Array<PktOption> => {\n const optionElements: Array<HTMLOptionElement> = Array.from(\n selectElement.querySelectorAll('option:not(.pkt-hide), data:not(.pkt.hide)'),\n )\n const filter = onlySelected ? ([, , selected]: PktOption) => selected : (_: PktOption) => true\n const currentValue = selectElement.value\n return optionElements\n .map(\n (optionElement) =>\n [optionElement.value, optionElement.textContent?.trim(), optionElement.value === currentValue] as PktOption,\n )\n .filter(filter)\n },\n )\n\nconst getAllPktElementsByLabelText =\n (testingLibrary: TestingLibraryTools) =>\n (label: string, container?: HTMLElement): Element[] => {\n const innerElements = testingLibrary.getAllByLabelText(container || document.body, label)\n return innerElements.map((element) => findPossibleWrappingPktCustomElement(testingLibrary)(element, false, []))\n }\n\nconst setPktElementValue = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (\n element: PTLElementType,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n } = false,\n ): Promise<boolean> => {\n const options =\n typeof optionsOrUseInputEvent === 'object'\n ? optionsOrUseInputEvent\n : // Hvis det er en boolean, så vær bakoverkompatibel\n (optionsOrUseInputEvent && {\n useInputEventForNative: true,\n useChangeEventForNative: true,\n setValuePropForNative: true,\n }) || {\n useInputEventForNative: false,\n useChangeEventForNative: true,\n setValuePropForNative: false,\n }\n if (Array.isArray(valueOrValues) && valueOrValues.length > 1 && element.tagName === 'PKT-SELECT') {\n throw new Error('Multi-verdi <pkt-select> støttes ikke. Bruk <pkt-combobox> i stedet.')\n }\n if (element.tagName === 'PKT-SELECT' || element.tagName === 'PKT-COMBOBOX') {\n const pktSelect = element as HTMLSelectElement\n const multiple = pktSelect.multiple\n const valueAsArray = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues]\n const newValue = (multiple && valueAsArray) || (valueAsArray.length == 0 && '') || valueAsArray[0]\n testingLibrary.fireEvent.change(element, { target: { value: newValue } })\n return Promise.resolve(true)\n } else {\n if (options.setValuePropForNative) {\n if ('value' in element) {\n element.value = valueOrValues.toString()\n }\n }\n if (options.useInputEventForNative) {\n testingLibrary.fireEvent.input(element, { target: { value: valueOrValues } })\n }\n if (options.useChangeEventForNative) {\n testingLibrary.fireEvent.change(element, { target: { value: valueOrValues } })\n }\n return Promise.resolve(true)\n }\n },\n )\n\nconst containsRadioInput = (element: Element): boolean => {\n if (element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'radio') return true\n\n if (element.querySelector?.('input[type=\"radio\"]')) return true\n\n if (element.tagName === 'LABEL') {\n const label = element as HTMLLabelElement\n const control = label.control || (label.htmlFor ? document.getElementById(label.htmlFor) : null)\n return !!(control && (control as HTMLInputElement).type === 'radio')\n }\n\n return false\n}\n\nconst pktClickButton = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType) => {\n if (containsRadioInput(element)) {\n throw new Error('Klikk på <pkt-radiobutton> støttes ikke - bruk setPktElementChecked i stedet')\n }\n return testingLibrary.fireEvent.click(element)\n }, 'text')\n\nconst setPktSelectedOptionsByLabel = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (pktSelect: PktSelect, ...desiredOptionLabels: Array<string>) => {\n const availableOptions = getPktSelectOptions(testingLibrary)(pktSelect)\n const selectedOptions = desiredOptionLabels\n .map((optionLabel) => availableOptions.find(([_, label]) => label === optionLabel))\n .filter((possibleOption) => possibleOption) as Array<PktOption>\n if (selectedOptions.length !== desiredOptionLabels.length) {\n throw new Error(\n \"Noen av option'ene finnes ikke i denne komponenten. Du valgte \" +\n JSON.stringify(desiredOptionLabels) +\n ', mens valgmulighetene er ' +\n JSON.stringify(availableOptions.map(([, label]) => label)),\n )\n }\n\n return await setPktElementValue(testingLibrary)(\n pktSelect,\n selectedOptions.map(([value]) => value),\n )\n },\n )\n"],"names":["getElementError"],"mappings":"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"}
1
+ {"version":3,"file":"punkt-testing-utils.umd.js","sources":["../src/index.ts"],"sourcesContent":["import DomTestingLibrary, {\n FindAllByBoundAttribute,\n findAllByDisplayValue,\n findAllByLabelText,\n findAllByTestId,\n findAllByText,\n getAllByDisplayValue,\n getAllByLabelText,\n getAllByTestId,\n getAllByText,\n getElementError,\n} from '@testing-library/dom'\nimport {\n PktBackLink,\n PktCheckbox,\n PktCombobox,\n PktDatepicker,\n PktHelptext,\n PktIcon,\n PktInputWrapper,\n PktLoader,\n PktProgressbar,\n PktRadioButton,\n PktSelect,\n PktTextarea,\n} from '@oslokommune/punkt-elements'\nimport { AllByBoundAttribute } from '@testing-library/dom/types/queries'\n\nexport const PKT_CUSTOM_FORMFIELDS = [\n 'pkt-backlink',\n 'pkt-checkbox',\n 'pkt-combobox',\n 'pkt-datepicker',\n 'pkt-progressbar',\n 'pkt-radiobutton',\n 'pkt-select',\n 'pkt-textarea',\n 'pkt-textinput',\n]\nconst PKT_CUSTOM_ELEMENTS = [\n 'pkt-input-wrapper',\n 'pkt-icon',\n 'pkt-helptext',\n 'pkt-loader',\n 'pkt-backlink',\n ...PKT_CUSTOM_FORMFIELDS,\n]\n\ntype PTLElementType =\n | PktBackLink\n | PktCheckbox\n | PktCombobox\n | PktDatepicker\n | PktHelptext\n | PktIcon\n | PktInputWrapper\n | PktLoader\n | PktProgressbar\n | PktRadioButton\n | PktSelect\n | PktTextarea\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement\n\nexport type PktTestingLibraryOptions = Pick<\n typeof DomTestingLibrary,\n | 'fireEvent'\n | 'findAllByLabelText'\n | 'findAllByTestId'\n | 'findAllByDisplayValue'\n | 'findAllByText'\n | 'getAllByLabelText'\n | 'getAllByTestId'\n | 'getAllByDisplayValue'\n | 'getAllByText'\n>\n\ntype TestingLibraryTools = {\n fireEvent: typeof DomTestingLibrary.fireEvent\n findAllByLabelText: typeof DomTestingLibrary.findAllByLabelText\n findAllByTestId: typeof DomTestingLibrary.findAllByTestId\n findAllByDisplayValue: typeof DomTestingLibrary.findAllByDisplayValue\n findAllByText: typeof DomTestingLibrary.findAllByText\n getAllByLabelText: typeof DomTestingLibrary.getAllByLabelText\n getAllByTestId: typeof DomTestingLibrary.getAllByTestId\n getAllByDisplayValue: typeof DomTestingLibrary.getAllByDisplayValue\n getAllByText: typeof DomTestingLibrary.getAllByText\n}\n\nexport type LabelOrElement<ElementType = PTLElementType> = string | RegExp | ElementType | HTMLLabelElement\n\nexport type PktElementValueType = string | number | Date\n\nexport type PktTestingLibrary = {\n findPktElementByLabelText: (\n label: string | RegExp | HTMLLabelElement,\n container?: HTMLElement,\n ) => Promise<PTLElementType>\n getPktElementByLabelText: (label: string | RegExp | HTMLLabelElement, container?: HTMLElement) => PTLElementType\n getPktSelectOptions: (labelOrElement: LabelOrElement<PktSelect>, onlySelected?: boolean) => Array<PktOption>\n getAllPktElementsByLabelText: (label: string, container?: HTMLElement) => Element[]\n setPktElementChecked: (labelOrElement: LabelOrElement, checked: boolean) => Promise<boolean>\n isPktElementChecked: (labelOrElement: LabelOrElement) => boolean\n setPktElementValue: (\n labelOrElement: LabelOrElement,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent?:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n },\n ) => Promise<boolean>\n pktClickButton: (labelOrElement: LabelOrElement<HTMLInputElement | HTMLButtonElement>) => Promise<boolean>\n waitForPktElementsToBeDefined: () => Promise<any>\n setPktSelectedOptionsByLabel: (\n labelOrElement: LabelOrElement<PktSelect>,\n ...desiredOptionLabels: Array<string>\n ) => Promise<any>\n getPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => PTLElementType\n findPktElementByDisplayValue: (labelOrElement: string | RegExp, container?: HTMLElement) => Promise<PTLElementType>\n}\n\nexport const setupPktTestingLibrary: (options: PktTestingLibraryOptions) => PktTestingLibrary = (\n options: PktTestingLibraryOptions,\n) => {\n const tools: TestingLibraryTools = {\n fireEvent: options.fireEvent,\n findAllByLabelText: options.findAllByLabelText,\n findAllByDisplayValue: options.findAllByDisplayValue,\n findAllByTestId: options.findAllByTestId,\n findAllByText: options.findAllByText,\n getAllByLabelText: options.getAllByLabelText,\n getAllByDisplayValue: options.getAllByDisplayValue,\n getAllByTestId: options.getAllByTestId,\n getAllByText: options.getAllByText,\n }\n return {\n findPktElementByLabelText: withTestingLibrary(tools, findPktElementByLabel),\n waitForPktElementsToBeDefined,\n getPktElementByLabelText: withTestingLibrary(tools, getPktElementByLabel),\n setPktElementChecked: withTestingLibrary(tools, setPktElementChecked),\n isPktElementChecked: withTestingLibrary(tools, isPktElementChecked),\n getPktSelectOptions: withTestingLibrary(tools, getPktSelectOptions),\n getAllPktElementsByLabelText: withTestingLibrary(tools, getAllPktElementsByLabelText),\n setPktElementValue: withTestingLibrary(tools, setPktElementValue),\n pktClickButton: withTestingLibrary(tools, pktClickButton),\n setPktSelectedOptionsByLabel: withTestingLibrary(tools, setPktSelectedOptionsByLabel),\n getPktElementByDisplayValue: withTestingLibrary(tools, getPktElementByDisplayValue),\n findPktElementByDisplayValue: withTestingLibrary(tools, findPktElementByDisplayValue),\n }\n}\n\ntype SyncQueries = typeof getAllByText | typeof getAllByLabelText | typeof getAllByTestId | typeof getAllByDisplayValue\ntype AsyncQueries =\n | FindAllByBoundAttribute\n | typeof findAllByText\n | typeof findAllByLabelText\n | typeof findAllByTestId\n | typeof findAllByDisplayValue\n\ntype QueryTypes = 'label' | 'text' | 'displayValue' | 'testid'\n\nconst syncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): SyncQueries => {\n const queries: Record<QueryTypes, SyncQueries> = {\n text: testingLibrary.getAllByText,\n label: testingLibrary.getAllByLabelText,\n testid: testingLibrary.getAllByTestId,\n displayValue: testingLibrary.getAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst asyncQueryFunctionResolver =\n (testingLibrary: TestingLibraryTools) =>\n (queryType: QueryTypes): AsyncQueries => {\n const queries: Record<QueryTypes, AsyncQueries> = {\n text: testingLibrary.findAllByText,\n label: testingLibrary.findAllByLabelText,\n testid: testingLibrary.findAllByTestId,\n displayValue: testingLibrary.findAllByDisplayValue,\n }\n const query = queries[queryType]\n if (query) {\n return query\n } else {\n throw new Error('Unsupported query type: ' + queryType)\n }\n }\n\nconst syncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? (getPktElementBy(testingLibrary)(query, elementOrIdentifier) as ElementType)\n : (elementOrIdentifier as ElementType)\n\nconst getByLabelElement = <ElementType>(possibleLabelElement: HTMLLabelElement) => {\n const control = possibleLabelElement instanceof HTMLLabelElement && (possibleLabelElement.control as ElementType)\n if (control) {\n return control\n } else {\n throw new Error('Fant ikke noe skjema-element for labelen: ' + possibleLabelElement.outerHTML)\n }\n}\n\nconst asyncResolveIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n async <ElementType>(elementOrIdentifier: string | RegExp | HTMLElement, query: QueryTypes) =>\n (elementOrIdentifier instanceof HTMLLabelElement && getByLabelElement<ElementType>(elementOrIdentifier)) ||\n (typeof elementOrIdentifier === 'string' || elementOrIdentifier instanceof RegExp\n ? ((await findPktElementBy(testingLibrary)(query, elementOrIdentifier)) as ElementType)\n : (elementOrIdentifier as ElementType))\n\nconst asyncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => Promise<ResultType>,\n query: QueryTypes = 'label',\n ) => {\n return async (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = await asyncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return await func(element, ...restArgs)\n }\n }\n\nconst syncFuncWithStringIdentifierOrElement =\n (testingLibrary: TestingLibraryTools) =>\n <ElementType, ResultType>(\n func: (element: ElementType, ...restArgs: Array<any>) => ResultType,\n query: QueryTypes = 'label',\n ) => {\n return (labelOrPktElement: string | RegExp | HTMLElement, ...restArgs: Array<any>) => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<ElementType>(labelOrPktElement, query)\n return func(element, ...restArgs)\n }\n }\n\nconst withTestingLibrary = <F>(testingLibrary: TestingLibraryTools, fn: (testingLibrary: TestingLibraryTools) => F) =>\n fn(testingLibrary)\n\n/**\n * Sørger for at alle brukte custom elements fra Punkt er definerte og erstattet med implementasjoner.\n * Bør kalles etter `render`, før noen operasjoner og antakelser gjøres.\n *\n * F.eks.:\n * <code>\n * render(<div><PktTextinput id=\"textinput\" name={'textInput'} label=\"My text input\" aria-label=\"My text input\" /></div>);\n * await waitForPktElementsToBeDefined();\n *\n * await setPktElementValue(\"My text input\", \"new value\");\n * </code>\n */\nconst waitForPktElementsToBeDefined = async () =>\n await Promise.all(\n PKT_CUSTOM_ELEMENTS.map((elementName) => {\n if (document.querySelector(elementName) !== null) {\n return window.customElements.whenDefined(elementName)\n }\n }).filter((promise) => promise),\n )\n\nconst findPossibleWrappingPktCustomElement =\n (testingLibrary: TestingLibraryTools) =>\n <R extends PTLElementType>(innerElement: HTMLElement | null, isByRole: boolean, args: Array<any>): PTLElementType => {\n if (!innerElement === null) {\n throw getElementError(`Finner ikke noe element med ${isByRole ? 'role' : 'label'} \"${args[0]}\"`, document.body)\n }\n const pktElement = innerElement?.closest(PKT_CUSTOM_FORMFIELDS.join(', ')) as R | null\n if (pktElement) {\n return pktElement as R\n } else {\n return innerElement as R\n }\n }\n\nconst getPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n (query: QueryTypes = 'label', identifier: string | RegExp, container?: HTMLElement): PTLElementType => {\n try {\n const queryFunc = syncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = doElementSearch(identifier, query, queryFunc, container)[0]\n return findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, [])\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst removeElementBySelector = (ancestor: HTMLElement, selector: string) => {\n const elements = Array.from(ancestor.querySelectorAll(selector))\n elements.forEach((element) => {\n element.parentNode?.removeChild(element)\n })\n}\n\nfunction getPureLabelText(label: Node) {\n const clonedLabel = label.cloneNode(true) as HTMLElement\n removeElementBySelector(clonedLabel, 'pkt-helptext')\n removeElementBySelector(clonedLabel, '.pkt-input-suffix')\n removeElementBySelector(clonedLabel, '.pkt-input-prefix')\n removeElementBySelector(clonedLabel, '.pkt-input-icon')\n removeElementBySelector(clonedLabel, '.pkt-input__counter')\n removeElementBySelector(clonedLabel, 'option')\n removeElementBySelector(clonedLabel, 'pkt-listbox')\n removeElementBySelector(clonedLabel, '.pkt-alert--error')\n removeElementBySelector(clonedLabel, '.pkt-tag')\n removeElementBySelector(clonedLabel, '.pkt-input-check__input-helptext')\n removeElementBySelector(clonedLabel, '.pkt-inputwrapper__helptext')\n return clonedLabel.textContent?.trim() || null\n}\n\nconst getPureLabelTextForLabelOwner = (labelOwner: HTMLElement): string | null => {\n const label =\n ('labels' in labelOwner &&\n labelOwner.labels instanceof NodeList &&\n labelOwner.labels.length > 0 &&\n labelOwner.labels[0]) ||\n (['input', ...PKT_CUSTOM_FORMFIELDS].includes(labelOwner.tagName.toLowerCase()) &&\n (labelOwner.querySelector('label') as HTMLLabelElement | null)) ||\n null\n if (label) {\n return getPureLabelText(label)\n } else {\n return null\n }\n}\n\nconst labelMatcher = (labelTextToMatch: string) => (nodeContent: string, element: Element | null) => {\n if (element instanceof HTMLElement) {\n const labelWithoutHelptext = getPureLabelTextForLabelOwner(element as HTMLElement)\n return labelWithoutHelptext === labelTextToMatch\n } else {\n return false\n }\n}\n\nconst fallbackSearchForPktSelectByLabel =\n (testingLibrary: TestingLibraryTools) =>\n (identifier: any, query: QueryTypes, container: HTMLElement = document.body): PTLElementType => {\n if (typeof identifier === 'string' && query === 'label') {\n // Spesial-case for <pkt-select> som ikke har aria-label\n const matchingLabel: HTMLLabelElement | undefined = Array.from(container.querySelectorAll('label')).find(\n (labelElement) => getPureLabelText(labelElement) === identifier,\n )\n const labelOwner =\n matchingLabel?.control || matchingLabel?.closest('pkt-select') || matchingLabel?.closest('pkt-combobox')\n if (!labelOwner) {\n throw getElementError(`Fant ikke noe element med label \"${identifier}\"`, container)\n }\n return labelOwner as PTLElementType\n }\n throw getElementError(`Fant ikke noe element med ${query} \"${identifier}\"`, container)\n }\n\nconst doElementSearch = <T>(\n identifier: string | RegExp | HTMLLabelElement,\n query: QueryTypes,\n queryFunc: (...args: Parameters<AllByBoundAttribute>) => T,\n container: HTMLElement = document.body,\n): T => {\n return identifier instanceof HTMLLabelElement\n ? getByLabelElement(identifier)\n : typeof identifier === 'string' && query === 'label'\n ? queryFunc(container, labelMatcher(identifier.trim()))\n : queryFunc(container, identifier)\n}\n\nconst findPktElementBy =\n (testingLibrary: TestingLibraryTools) =>\n async (\n query: QueryTypes = 'label',\n identifier: string | RegExp | HTMLLabelElement,\n container?: HTMLElement,\n ): Promise<PTLElementType> => {\n try {\n if (identifier instanceof HTMLLabelElement) {\n return Promise.resolve(getByLabelElement<PTLElementType>(identifier))\n }\n const queryFunc = asyncQueryFunctionResolver(testingLibrary)(query)\n const innerElement = (await doElementSearch(identifier, query, queryFunc, container))[0]\n return Promise.resolve(findPossibleWrappingPktCustomElement(testingLibrary)(innerElement, false, []))\n } catch (e) {\n return fallbackSearchForPktSelectByLabel(testingLibrary)(identifier, query, container)\n }\n }\n\nconst getPktElementByLabel =\n (testingLibrary: TestingLibraryTools) => (label: string | RegExp | HTMLLabelElement, container?: HTMLElement) =>\n label instanceof HTMLLabelElement\n ? getByLabelElement<PTLElementType>(label)\n : getPktElementBy(testingLibrary)('label', label, container)\n\nconst findPktElementByLabel =\n (testingLibrary: TestingLibraryTools) =>\n async (label: string | RegExp | HTMLLabelElement, container?: HTMLElement): Promise<PTLElementType> =>\n label instanceof HTMLLabelElement\n ? getByLabelElement<PTLElementType>(label)\n : findPktElementBy(testingLibrary)('label', label, container)\n\nconst getPktElementByText = (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('text', text, container)\n\nconst findPktElementByText =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('text', text, container)\n\nconst setPktElementChecked = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType, checked: boolean) => {\n if (!('checked' in element)) {\n throw new Error('Bare elementer som har en \"checked\"-attributt støttes')\n }\n let returnValue: boolean = false\n if (element.tagName === 'INPUT') {\n // https://github.com/testing-library/react-testing-library/issues/175#issuecomment-637349276\n // kentcdodds: \"this should probably be documented better, but with checkboxes you don't actually fire change\n // events, you should fire click events instead.\"\n const htmlInputElement = element as HTMLInputElement\n if (htmlInputElement.type === 'radio') {\n if (!checked) {\n throw new Error(\"Kan ikke av-velge en <input type='radio'> - prøv å velge en annen radioknapp i samme gruppe\")\n } else {\n returnValue = testingLibrary.fireEvent.click(element)\n await new Promise((resolve) => setTimeout(resolve, 0))\n }\n } else if (htmlInputElement.type === 'checkbox') {\n if (htmlInputElement.checked !== checked) {\n returnValue = testingLibrary.fireEvent.click(element)\n }\n }\n } else {\n returnValue = testingLibrary.fireEvent.change(element, { target: { checked } })\n }\n\n return Promise.resolve(returnValue)\n })\n\nconst isPktElementChecked =\n (testingLibrary: TestingLibraryTools) =>\n (target: LabelOrElement): boolean => {\n const element = syncResolveIdentifierOrElement(testingLibrary)<PTLElementType>(target, 'label')\n\n if ('checked' in element) return !!(element as HTMLInputElement).checked\n\n const descendant = element.querySelector('input[type=\"radio\"]:checked, input[type=\"checkbox\"]:checked')\n return descendant !== null\n }\n\nconst getPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n getPktElementBy(testingLibrary)('displayValue', text, container)\n\nconst findPktElementByDisplayValue =\n (testingLibrary: TestingLibraryTools) => (text: string | RegExp, container?: HTMLElement) =>\n findPktElementBy(testingLibrary)('displayValue', text, container)\n\n/**\n * Representerer en option i en PktSelect.\n *\n * @property {string} 0 - verdien (value)\n * @property {string | null} 1 - Tekstinnholdet, <option>tekstinnhold</option>\n * @property {boolean} 2 - Om denne er valgt (selected)\n */\nexport type PktOption = [string, string | undefined, boolean]\n\nconst getPktSelectOptions = (testingLibrary: TestingLibraryTools) =>\n syncFuncWithStringIdentifierOrElement(testingLibrary)<PktSelect, Array<PktOption>>(\n (selectElement: PktSelect, onlySelected?: boolean): Array<PktOption> => {\n const optionElements: Array<HTMLOptionElement> = Array.from(\n selectElement.querySelectorAll('option:not(.pkt-hide), data:not(.pkt.hide)'),\n )\n const filter = onlySelected ? ([, , selected]: PktOption) => selected : (_: PktOption) => true\n const currentValue = selectElement.value\n return optionElements\n .map(\n (optionElement) =>\n [optionElement.value, optionElement.textContent?.trim(), optionElement.value === currentValue] as PktOption,\n )\n .filter(filter)\n },\n )\n\nconst getAllPktElementsByLabelText =\n (testingLibrary: TestingLibraryTools) =>\n (label: string, container?: HTMLElement): Element[] => {\n const innerElements = testingLibrary.getAllByLabelText(container || document.body, label)\n return innerElements.map((element) => findPossibleWrappingPktCustomElement(testingLibrary)(element, false, []))\n }\n\nconst setPktElementValue = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (\n element: PTLElementType,\n valueOrValues: PktElementValueType | Array<PktElementValueType>,\n optionsOrUseInputEvent:\n | boolean\n | {\n useInputEventForNative?: boolean\n useChangeEventForNative?: boolean\n setValuePropForNative?: boolean\n } = false,\n ): Promise<boolean> => {\n const options =\n typeof optionsOrUseInputEvent === 'object'\n ? optionsOrUseInputEvent\n : // Hvis det er en boolean, så vær bakoverkompatibel\n (optionsOrUseInputEvent && {\n useInputEventForNative: true,\n useChangeEventForNative: true,\n setValuePropForNative: true,\n }) || {\n useInputEventForNative: false,\n useChangeEventForNative: true,\n setValuePropForNative: false,\n }\n if (Array.isArray(valueOrValues) && valueOrValues.length > 1 && element.tagName === 'PKT-SELECT') {\n throw new Error('Multi-verdi <pkt-select> støttes ikke. Bruk <pkt-combobox> i stedet.')\n }\n if (element.tagName === 'PKT-SELECT' || element.tagName === 'PKT-COMBOBOX') {\n const pktSelect = element as HTMLSelectElement\n const multiple = pktSelect.multiple\n const valueAsArray = Array.isArray(valueOrValues) ? valueOrValues : [valueOrValues]\n const newValue = (multiple && valueAsArray) || (valueAsArray.length == 0 && '') || valueAsArray[0]\n testingLibrary.fireEvent.change(element, { target: { value: newValue } })\n return Promise.resolve(true)\n } else {\n if (options.setValuePropForNative) {\n if ('value' in element) {\n element.value = valueOrValues.toString()\n }\n }\n if (options.useInputEventForNative) {\n testingLibrary.fireEvent.input(element, { target: { value: valueOrValues } })\n }\n if (options.useChangeEventForNative) {\n testingLibrary.fireEvent.change(element, { target: { value: valueOrValues } })\n }\n return Promise.resolve(true)\n }\n },\n )\n\nconst containsRadioInput = (element: Element): boolean => {\n if (element.tagName === 'INPUT' && (element as HTMLInputElement).type === 'radio') return true\n\n if (element.querySelector?.('input[type=\"radio\"]')) return true\n\n if (element.tagName === 'LABEL') {\n const label = element as HTMLLabelElement\n const control = label.control || (label.htmlFor ? document.getElementById(label.htmlFor) : null)\n return !!(control && (control as HTMLInputElement).type === 'radio')\n }\n\n return false\n}\n\nconst pktClickButton = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(async (element: PTLElementType) => {\n if (containsRadioInput(element)) {\n throw new Error('Klikk på <pkt-radiobutton> støttes ikke - bruk setPktElementChecked i stedet')\n }\n return testingLibrary.fireEvent.click(element)\n }, 'text')\n\nconst setPktSelectedOptionsByLabel = (testingLibrary: TestingLibraryTools) =>\n asyncFuncWithStringIdentifierOrElement(testingLibrary)(\n async (pktSelect: PktSelect, ...desiredOptionLabels: Array<string>) => {\n const availableOptions = getPktSelectOptions(testingLibrary)(pktSelect)\n const selectedOptions = desiredOptionLabels\n .map((optionLabel) => availableOptions.find(([_, label]) => label === optionLabel))\n .filter((possibleOption) => possibleOption) as Array<PktOption>\n if (selectedOptions.length !== desiredOptionLabels.length) {\n throw new Error(\n \"Noen av option'ene finnes ikke i denne komponenten. Du valgte \" +\n JSON.stringify(desiredOptionLabels) +\n ', mens valgmulighetene er ' +\n JSON.stringify(availableOptions.map(([, label]) => label)),\n )\n }\n\n return await setPktElementValue(testingLibrary)(\n pktSelect,\n selectedOptions.map(([value]) => value),\n )\n },\n )\n"],"names":["getElementError"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oslokommune/punkt-testing-utils",
3
- "version": "13.2.1",
3
+ "version": "13.2.2",
4
4
  "description": "Test-utilities for Punkt",
5
5
  "homepage": "https://punkt.oslo.kommune.no",
6
6
  "author": "Team Designsystem, Oslo Origo",
@@ -66,5 +66,5 @@
66
66
  "url": "https://github.com/oslokommune/punkt/issues"
67
67
  },
68
68
  "license": "MIT",
69
- "gitHead": "8644dd757c4d3adb7735e42089f33366629730bf"
69
+ "gitHead": "8a165b419da3227c2bc84eba43b530ca37c6bb45"
70
70
  }