Files
vikunja/frontend/tests/support/commands.ts

54 lines
1.8 KiB
TypeScript

import type {Locator} from '@playwright/test'
import {readFileSync} from 'fs'
import {join, dirname} from 'path'
import {fileURLToPath} from 'url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
/**
* Simulates pasting a file from the clipboard into an element
* @param locator - The element to paste into
* @param fileName - The name of the file in the fixtures directory
* @param fileType - The MIME type of the file (default: 'image/png')
*/
export async function pasteFile(locator: Locator, fileName: string, fileType = 'image/png') {
const filePath = join(__dirname, '../fixtures', fileName)
const fileBuffer = readFileSync(filePath)
const base64 = fileBuffer.toString('base64')
await locator.evaluate((element, {base64Data, name, type}) => {
// Convert base64 to blob
const byteCharacters = atob(base64Data)
const byteNumbers = new Array(byteCharacters.length)
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i)
}
const byteArray = new Uint8Array(byteNumbers)
const blob = new Blob([byteArray], {type})
// Create file and paste event
const file = new File([blob], name, {type})
const dataTransfer = new DataTransfer()
dataTransfer.items.add(file)
const pasteEvent = new ClipboardEvent('paste', {
bubbles: true,
cancelable: true,
clipboardData: dataTransfer,
})
element.dispatchEvent(pasteEvent)
}, {base64Data: base64, name: fileName, type: fileType})
}
/**
* Performs a drag and drop operation
* Note: Playwright has native dragTo() support, so this is just a wrapper for consistency
* @param source - The source locator to drag from
* @param target - The target locator to drop onto
*/
export async function dragAndDrop(source: Locator, target: Locator) {
await source.dragTo(target)
}