mirror of
https://github.com/cupcakearmy/cryptgeon.git
synced 2024-12-22 16:26:28 +00:00
Nicco
d7e5a34b14
* move to packages * update deps * update deps * actions maintenance * don't use blob * cli * fix default import * use synthetic default imports * remove comment * cli packaging * node 18 guard * packages * build system * testing * test pipeline * pipelines * changelog * version bump * update locales * update deps * update deps * update dependecies
85 lines
3.0 KiB
TypeScript
85 lines
3.0 KiB
TypeScript
import { expect, type Page } from '@playwright/test'
|
|
import { createHash } from 'crypto'
|
|
import { readFile } from 'fs/promises'
|
|
import { execFile } from 'node:child_process'
|
|
import { promisify } from 'node:util'
|
|
|
|
const exec = promisify(execFile)
|
|
|
|
type CreatePage = { text?: string; files?: string[]; views?: number; expiration?: number; error?: string }
|
|
export async function createNote(page: Page, options: CreatePage): Promise<string> {
|
|
await page.goto('/')
|
|
|
|
if (options.text) {
|
|
await page.locator('[data-testid="text-field"]').fill(options.text)
|
|
} else if (options.files) {
|
|
await page.locator('[data-testid="switch-file"]').click()
|
|
|
|
const [fileChooser] = await Promise.all([
|
|
page.waitForEvent('filechooser'),
|
|
page.locator('text=No Files Selected').click(),
|
|
])
|
|
await fileChooser.setFiles(options.files)
|
|
}
|
|
|
|
if (options.views) {
|
|
await page.locator('[data-testid="switch-advanced"]').click()
|
|
await page.locator('[data-testid="field-views"]').fill(options.views.toString())
|
|
} else if (options.expiration) {
|
|
await page.locator('[data-testid="switch-advanced"]').click()
|
|
await page.locator('[data-testid="switch-advanced-toggle"]').click()
|
|
await page.locator('[data-testid="field-expiration"]').fill(options.expiration.toString())
|
|
}
|
|
|
|
await page.locator('button:has-text("create")').click()
|
|
|
|
if (options.error) {
|
|
await expect(page.locator('.error-text')).toContainText(options.error, { timeout: 60_000 })
|
|
}
|
|
|
|
const shareLink = await page.locator('[data-testid="share-link"]').inputValue()
|
|
return shareLink
|
|
}
|
|
|
|
export async function checkLinkForDownload(page: Page, link: string, text: string, checksum: string) {
|
|
await page.goto('/')
|
|
await page.goto(link)
|
|
await page.locator('[data-testid="show-note-button"]').click()
|
|
|
|
const [download] = await Promise.all([
|
|
page.waitForEvent('download'),
|
|
page.locator(`[data-testid="result"] >> text=${text}`).click(),
|
|
])
|
|
const path = await download.path()
|
|
if (!path) throw new Error('Download failed')
|
|
const cs = await getFileChecksum(path)
|
|
await expect(cs).toBe(checksum)
|
|
}
|
|
export async function checkLinkForText(page: Page, link: string, text: string) {
|
|
await page.goto('/')
|
|
await page.goto(link)
|
|
await page.locator('[data-testid="show-note-button"]').click()
|
|
await expect(await page.locator('[data-testid="result"] >> .note').innerText()).toContain(text)
|
|
}
|
|
|
|
export async function checkLinkDoesNotExist(page: Page, link: string) {
|
|
await page.goto('/') // Required due to firefox: https://github.com/microsoft/playwright/issues/15781
|
|
await page.goto(link)
|
|
await expect(page.locator('main')).toContainText('note was not found or was already deleted')
|
|
}
|
|
|
|
export async function getFileChecksum(file: string) {
|
|
const buffer = await readFile(file)
|
|
const hash = createHash('sha3-256').update(buffer).digest('hex')
|
|
return hash
|
|
}
|
|
|
|
export async function CLI(...args: string[]) {
|
|
return await exec('./packages/cli/dist/index.cjs', args, {
|
|
env: {
|
|
...process.env,
|
|
CRYPTGEON_SERVER: 'http://localhost:1234',
|
|
},
|
|
})
|
|
}
|