///
import { readFileSync, statSync } from 'fs'
import { join, basename } from 'path'
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
}
if (el.type === 'datetime-local') {
el.value = new Date(`${s}:00.000Z`).toISOString().slice(0, 'yyyy-MM-DDTHH:mm'.length)
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
}
invoke(key: string, value: unknown) {
if (key === 'val') {
this.selectedElements.forEach((el) => (el as unknown as Record).valueAsNumber = value);
}
return this
}
trigger(which: string) {
return this
}
attachFile(filename: string | string[]) {
const { File, FileList } = window;
const theFilenames = Array.isArray(filename) ? filename : [filename];
const theFiles = theFilenames.map((f) => {
const filePath = join('cypress', 'fixtures', f);
const { mtimeMs: lastModified } = statSync(filePath);
const contents = readFileSync(filePath);
return new File(
[contents],
basename(filePath),
{
lastModified,
type: '',
},
);
});
(theFiles as unknown as Record).__proto__ = Object.create(FileList.prototype);
this.selectedElements.forEach((el) => {
Object.defineProperty(el, 'files', {
value: theFiles,
writable: false,
})
});
return this;
}
}
export default class JSDOMDummyCypress {
private currentElement = window.document;
wait(time: number) {
return this;
}
get(q: string) {
return new JSDOMJQuery(this.currentElement.querySelectorAll(q));
}
}