2022-07-19 19:55:05 +00:00
|
|
|
import { expect, type Page } from '@playwright/test'
|
|
|
|
import { createHash } from 'crypto'
|
|
|
|
import { readFile } from 'fs/promises'
|
2023-05-12 18:22:49 +00:00
|
|
|
import { execFile } from 'node:child_process'
|
|
|
|
import { promisify } from 'node:util'
|
|
|
|
|
|
|
|
const exec = promisify(execFile)
|
2022-07-19 19:55:05 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
2023-05-12 18:22:49 +00:00
|
|
|
|
|
|
|
export async function CLI(...args: string[]) {
|
|
|
|
return await exec('./packages/cli/dist/index.cjs', args, {
|
|
|
|
env: {
|
|
|
|
...process.env,
|
|
|
|
CRYPTGEON_SERVER: 'http://localhost:1234',
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|