test files in cli and cross with password

This commit is contained in:
2023-05-25 10:17:01 +02:00
parent b43b802221
commit fb95a68b0d
13 changed files with 225 additions and 62 deletions

View File

@@ -1,19 +1,25 @@
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'
import { getFileChecksum } from './files'
const exec = promisify(execFile)
type CreatePage = { text?: string; files?: string[]; views?: number; expiration?: number; error?: string }
type CreatePage = {
text?: string
files?: string[]
views?: number
expiration?: number
error?: string
password?: 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)
await page.getByTestId('text-field').fill(options.text)
} else if (options.files) {
await page.locator('[data-testid="switch-file"]').click()
await page.getByTestId('switch-file').click()
const [fileChooser] = await Promise.all([
page.waitForEvent('filechooser'),
@@ -22,13 +28,16 @@ export async function createNote(page: Page, options: CreatePage): Promise<strin
await fileChooser.setFiles(options.files)
}
if (options.views || options.expiration || options.password) await page.getByTestId('switch-advanced').click()
if (options.views) {
await page.locator('[data-testid="switch-advanced"]').click()
await page.locator('[data-testid="field-views"]').fill(options.views.toString())
await page.getByTestId('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.getByTestId('switch-advanced-toggle').click()
await page.getByTestId('field-expiration').fill(options.expiration.toString())
}
if (options.password) {
await page.getByTestId('custom-password').click()
await page.getByTestId('password').fill(options.password)
}
await page.locator('button:has-text("create")').click()
@@ -37,29 +46,39 @@ export async function createNote(page: Page, options: CreatePage): Promise<strin
await expect(page.locator('.error-text')).toContainText(options.error, { timeout: 60_000 })
}
const shareLink = await page.locator('[data-testid="share-link"]').inputValue()
return shareLink
// Return share link
return await page.getByTestId('share-link').inputValue()
}
export async function checkLinkForDownload(page: Page, link: string, text: string, checksum: string) {
type CheckLinkBase = {
link: string
text: string
password?: string
}
export async function checkLinkForDownload(page: Page, options: CheckLinkBase & { checksum: string }) {
await page.goto('/')
await page.goto(link)
await page.locator('[data-testid="show-note-button"]').click()
await page.goto(options.link)
if (options.password) await page.getByTestId('show-note-password').fill(options.password)
await page.getByTestId('show-note-button').click()
const [download] = await Promise.all([
page.waitForEvent('download'),
page.locator(`[data-testid="result"] >> text=${text}`).click(),
page.getByTestId(`result`).locator(`text=${options.text}`).click(),
])
const path = await download.path()
if (!path) throw new Error('Download failed')
const cs = await getFileChecksum(path)
await expect(cs).toBe(checksum)
await expect(cs).toBe(options.checksum)
}
export async function checkLinkForText(page: Page, link: string, text: string) {
export async function checkLinkForText(page: Page, options: CheckLinkBase) {
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)
await page.goto(options.link)
if (options.password) await page.getByTestId('show-note-password').fill(options.password)
await page.getByTestId('show-note-button').click()
const text = await page.getByTestId('result').locator('.note').innerText()
await expect(text).toContain(options.text)
}
export async function checkLinkDoesNotExist(page: Page, link: string) {
@@ -68,12 +87,6 @@ export async function checkLinkDoesNotExist(page: Page, link: string) {
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: {
@@ -82,3 +95,9 @@ export async function CLI(...args: string[]) {
},
})
}
export function getLinkFromCLI(output: string): string {
const match = output.match(/(https?:\/\/[^\s]+)/)
if (!match) throw new Error('No link found in CLI output')
return match[0]
}