mirror of
https://github.com/go-vikunja/vikunja.git
synced 2026-03-25 07:50:33 -05:00
54 lines
1.8 KiB
TypeScript
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)
|
|
}
|