/// /// /// import * as fs from 'fs' import * as path from 'path' type TestFn = (form: HTMLFormElement, submitter: HTMLButtonElement | HTMLInputElement, after: Record | string) => unknown class JSDOMJQuery { private selectedElements: Node[] constructor(elements: NodeList) { this.selectedElements = Array.from(elements) } type(s: string) { this.selectedElements.forEach((el: any) => { if (el.tagName === 'TEXTAREA') { el.innerText = s el.value = s return } el.setAttribute('value', s) el.value = s }) return this } check() { this.selectedElements.forEach((el: any) => { el.setAttribute('checked', '') el.checked = true }) return this } select(v: string) { this.selectedElements.forEach((el: any) => { const option: any = Array.from(el.querySelectorAll('option')).find((o: any) => o.textContent === v) option.setAttribute('selected', '') el.value = option.value }) return this } last() { this.selectedElements = this.selectedElements.slice(-1) return this } then(fn: (...args: unknown[]) => unknown) { fn(this.selectedElements) return this } click() { return this } submit() { return this } } class JSDOMDummyCypress { private currentElement = window.document; get(q: string) { return new JSDOMJQuery(this.currentElement.querySelectorAll(q)); } } export const setup = (template: string) => { if (typeof cy !== 'undefined') { return () => { cy.intercept({ url: '/' }, { fixture: `templates/${template}.html` }); cy.intercept({ url: '/?*' }, { fixture: `templates/${template}.html` }).as('submitted'); } } return async () => { const templatePath = path.join('test', 'fixtures', 'templates', `${template}.html`) const templateRaw = await fs.promises.readFile(templatePath) window.document.open(undefined, undefined, undefined, true) window.document.write(templateRaw.toString('utf-8')) window.document.close() } } export const test = (retrieveSubmitterFn: (wrapper: any) => any, testFn: TestFn, expectedValue: Record | string) => { let form: HTMLFormElement let submitter: HTMLButtonElement | HTMLInputElement if (typeof cy !== 'undefined') { cy .visit('/') .get('form') .then((formResult: any) => { [form] = Array.from(formResult); }) retrieveSubmitterFn(cy) .then((submitterQueryEl: any) => { [submitter] = Array.from(submitterQueryEl as any[]) }) .click() cy .wait('@submitted') .location('search') .then(search => { testFn(form, submitter, search) }) } else { retrieveSubmitterFn(new JSDOMDummyCypress()) .then((submitterQueryEl: any) => { [submitter] = Array.from(submitterQueryEl as any[]); [form] = Array.from(window.document.getElementsByTagName('form')) testFn(form, submitter, expectedValue) }) .click(); } } export const makeSearchParams = (beforeValues: Record | string) => { switch (typeof (beforeValues as unknown)) { case 'string': return new URLSearchParams(beforeValues as string) case 'object': return Object .entries(beforeValues) .filter(([k]) => k.trim().length > 0) .reduce( (beforeSearchParams, [key, value]) => { const theValue = !Array.isArray(value) ? [value] : value theValue.forEach(v => { beforeSearchParams.append(key, v) }) return beforeSearchParams }, new URLSearchParams() ) default: break } throw new TypeError('Invalid parameter.') }