mirror of
https://github.com/cupcakearmy/cryptgeon.git
synced 2025-09-06 17:30:39 +00:00
Compare commits
26 Commits
c3794fa2b6
...
v2.8.0
Author | SHA1 | Date | |
---|---|---|---|
6b5eea34a1 | |||
d70bee14af | |||
4960260076 | |||
3247a0cfca | |||
9527a499ed | |||
b5590bb5ef | |||
7691dc80f8 | |||
f8d8fa05b0 | |||
7aae690850 | |||
e15d9eb537 | |||
7fe70a6f3b | |||
d86ef79abd | |||
23446a4c74 | |||
ee92928d1f | |||
b60a079bbe | |||
ba474dff31 | |||
3cb002ee33 | |||
a10d8735dd | |||
dfa2401eea | |||
ea58d89f98 | |||
eaca1a981d | |||
199755d18e | |||
724d0709d3 | |||
bd5acca97a | |||
a0a99cd3cc | |||
|
8ccfdd6e2e |
13
.github/workflows/test.yaml
vendored
13
.github/workflows/test.yaml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# Node
|
||||
- uses: pnpm/action-setup@v3
|
||||
- uses: pnpm/action-setup@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
cache: 'pnpm'
|
||||
@@ -27,13 +27,16 @@ jobs:
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
pnpm install
|
||||
pnpm exec playwright install --with-deps
|
||||
pnpm run test:prepare
|
||||
|
||||
- name: Run your tests
|
||||
run: pnpm test
|
||||
- uses: actions/upload-artifact@v3
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
if: ${{ !cancelled() }}
|
||||
with:
|
||||
name: test-results
|
||||
path: test-results
|
||||
name: playwright-report
|
||||
path: test-results/
|
||||
retention-days: 7
|
||||
|
@@ -9,7 +9,7 @@ services:
|
||||
|
||||
app:
|
||||
build: .
|
||||
env_file: .dev.env
|
||||
env_file: .env.dev
|
||||
depends_on:
|
||||
- redis
|
||||
restart: unless-stopped
|
||||
|
@@ -5,8 +5,8 @@
|
||||
"dev": "run-p dev:*",
|
||||
"docker:up": "docker compose -f docker-compose.dev.yaml up",
|
||||
"docker:build": "docker compose -f docker-compose.dev.yaml build",
|
||||
"test": "playwright test --project chrome firefox safari",
|
||||
"test:local": "playwright test --project chrome",
|
||||
"test": "playwright test --project=chrome --project=firefox --project=safari",
|
||||
"test:local": "playwright test --project=chrome",
|
||||
"test:server": "run-s docker:up",
|
||||
"test:prepare": "run-p build docker:build",
|
||||
"build": "pnpm run --recursive --filter=!@cryptgeon/backend build"
|
||||
@@ -17,5 +17,5 @@
|
||||
"npm-run-all": "^4.1.5",
|
||||
"shelljs": "^0.8.5"
|
||||
},
|
||||
"packageManager": "pnpm@9.8.0"
|
||||
"packageManager": "pnpm@9.9.0"
|
||||
}
|
||||
|
2
packages/backend/Cargo.lock
generated
2
packages/backend/Cargo.lock
generated
@@ -261,7 +261,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cryptgeon"
|
||||
version = "2.7.0"
|
||||
version = "2.8.0"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"bs62",
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "cryptgeon"
|
||||
version = "2.7.0"
|
||||
version = "2.8.0"
|
||||
authors = ["cupcakearmy <hi@nicco.io>"]
|
||||
edition = "2021"
|
||||
rust-version = "1.80"
|
||||
|
@@ -38,10 +38,6 @@ pub static ref ALLOW_FILES: bool = std::env::var("ALLOW_FILES")
|
||||
.unwrap_or("true".to_string())
|
||||
.parse()
|
||||
.unwrap();
|
||||
pub static ref THEME_NEW_NOTE_NOTICE: bool = std::env::var("THEME_NEW_NOTE_NOTICE")
|
||||
.unwrap_or("true".to_string())
|
||||
.parse()
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
// THEME
|
||||
@@ -62,4 +58,8 @@ lazy_static! {
|
||||
.unwrap_or("".to_string())
|
||||
.parse()
|
||||
.unwrap();
|
||||
pub static ref THEME_NEW_NOTE_NOTICE: bool = std::env::var("THEME_NEW_NOTE_NOTICE")
|
||||
.unwrap_or("true".to_string())
|
||||
.parse()
|
||||
.unwrap();
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
use axum::{
|
||||
extract::Request,
|
||||
extract::{DefaultBodyLimit, Request},
|
||||
routing::{delete, get, post},
|
||||
Router, ServiceExt,
|
||||
};
|
||||
@@ -7,7 +7,6 @@ use dotenv::dotenv;
|
||||
use tower::Layer;
|
||||
use tower_http::{
|
||||
compression::CompressionLayer,
|
||||
limit::RequestBodyLimitLayer,
|
||||
normalize_path::NormalizePathLayer,
|
||||
services::{ServeDir, ServeFile},
|
||||
};
|
||||
@@ -47,14 +46,14 @@ async fn main() {
|
||||
let app = Router::new()
|
||||
.nest("/api", api_routes)
|
||||
.fallback_service(serve_dir)
|
||||
.layer(DefaultBodyLimit::max(*config::LIMIT))
|
||||
.layer(
|
||||
CompressionLayer::new()
|
||||
.br(true)
|
||||
.deflate(true)
|
||||
.gzip(true)
|
||||
.zstd(true),
|
||||
)
|
||||
.layer(RequestBodyLimitLayer::new(*config::LIMIT));
|
||||
);
|
||||
|
||||
let app = NormalizePathLayer::trim_trailing_slash().layer(app);
|
||||
|
||||
@@ -62,9 +61,7 @@ async fn main() {
|
||||
.await
|
||||
.unwrap();
|
||||
println!("listening on {}", listener.local_addr().unwrap());
|
||||
println!("Config {}", *config::LIMIT);
|
||||
axum::serve(listener, ServiceExt::<Request>::into_make_service(app))
|
||||
// axum::serve(listener, app)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
@@ -1,7 +1,9 @@
|
||||
use axum::extract::Path;
|
||||
use axum::http::StatusCode;
|
||||
use axum::response::{IntoResponse, Response};
|
||||
use axum::Json;
|
||||
use axum::{
|
||||
extract::Path,
|
||||
http::StatusCode,
|
||||
response::{IntoResponse, Response},
|
||||
Json,
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::time::SystemTime;
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
use crate::config;
|
||||
use axum::http::StatusCode;
|
||||
use axum::Json;
|
||||
use axum::{http::StatusCode, Json};
|
||||
use serde::Serialize;
|
||||
|
||||
#[derive(Serialize)]
|
||||
@@ -13,12 +12,12 @@ pub struct Status {
|
||||
pub max_expiration: u32,
|
||||
pub allow_advanced: bool,
|
||||
pub allow_files: bool,
|
||||
pub theme_new_note_notice: bool,
|
||||
// Theme
|
||||
pub theme_image: String,
|
||||
pub theme_text: String,
|
||||
pub theme_page_title: String,
|
||||
pub theme_favicon: String,
|
||||
pub theme_new_note_notice: bool,
|
||||
}
|
||||
|
||||
pub async fn get_status() -> (StatusCode, Json<Status>) {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cryptgeon",
|
||||
"version": "2.7.0",
|
||||
"version": "2.8.0",
|
||||
"homepage": "https://github.com/cupcakearmy/cryptgeon",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@@ -25,7 +25,7 @@
|
||||
"new_note": "new note",
|
||||
"new_note_notice": "<b>availability:</b><br />the note is not guaranteed to be stored as everything is kept in ram, if it fills up the oldest notes will be removed.<br />(you probably will be fine, just be warned.)",
|
||||
"errors": {
|
||||
"note_to_big": "could not create note. note is to big",
|
||||
"note_to_big": "could not create note. note is too big",
|
||||
"note_error": "could not create note. please try again.",
|
||||
"max": "max: {n}",
|
||||
"empty_content": "note is empty."
|
||||
@@ -44,7 +44,7 @@
|
||||
"decryption_failed": "wrong password. could not decipher. probably a broken link. note was destroyed.",
|
||||
"unsupported_type": "unsupported note type."
|
||||
},
|
||||
"explanation": "click below to show and delete the note if the counter has reached it's limit",
|
||||
"explanation": "click below to show and delete the note if the counter has reached its limit",
|
||||
"show_note": "show note",
|
||||
"warning_will_not_see_again": "you will <b>not</b> get the chance to see the note again.",
|
||||
"download_all": "download all",
|
||||
|
@@ -18,19 +18,19 @@
|
||||
export let icon: keyof typeof map
|
||||
</script>
|
||||
|
||||
<div on:click {...$$restProps}>
|
||||
<button on:click {...$$restProps}>
|
||||
{#if map[icon]}
|
||||
<svelte:component this={map[icon]} />
|
||||
{/if}
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<style>
|
||||
div {
|
||||
button {
|
||||
display: inline-block;
|
||||
contain: strict;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
div > :global(svg) {
|
||||
button > :global(svg) {
|
||||
display: block;
|
||||
fill: currentColor;
|
||||
}
|
||||
|
@@ -39,13 +39,23 @@
|
||||
<input bind:value {...$$restProps} class:valid={valid === true} />
|
||||
<div class="icons">
|
||||
{#if isPassword}
|
||||
<Icon class="icon" icon={hidden ? 'eye' : 'eye-off'} on:click={toggle} />
|
||||
<Icon
|
||||
disabled={$$restProps.disabled}
|
||||
class="icon"
|
||||
icon={hidden ? 'eye' : 'eye-off'}
|
||||
on:click={toggle}
|
||||
/>
|
||||
{/if}
|
||||
{#if random}
|
||||
<Icon class="icon" icon="dice" on:click={randomFN} />
|
||||
<Icon disabled={$$restProps.disabled} class="icon" icon="dice" on:click={randomFN} />
|
||||
{/if}
|
||||
{#if copy}
|
||||
<Icon class="icon" icon="copy" on:click={() => copyFN(value.toString())} />
|
||||
<Icon
|
||||
disabled={$$restProps.disabled}
|
||||
class="icon"
|
||||
icon="copy"
|
||||
on:click={() => copyFN(value.toString())}
|
||||
/>
|
||||
{/if}
|
||||
</div>
|
||||
</label>
|
||||
|
@@ -116,6 +116,7 @@ export type Status = {
|
||||
theme_text: string
|
||||
theme_favicon: string
|
||||
theme_page_title: string
|
||||
theme_new_note_notice: boolean
|
||||
}
|
||||
|
||||
export async function status() {
|
||||
|
@@ -4,16 +4,17 @@ const config: PlaywrightTestConfig = {
|
||||
use: {
|
||||
video: 'retain-on-failure',
|
||||
baseURL: 'http://localhost:3000',
|
||||
actionTimeout: 10_000,
|
||||
actionTimeout: 30_000,
|
||||
},
|
||||
|
||||
outputDir: './test-results',
|
||||
testDir: './test',
|
||||
timeout: 10_000,
|
||||
timeout: 30_000,
|
||||
fullyParallel: true,
|
||||
retries: 2,
|
||||
|
||||
webServer: {
|
||||
command: 'docker compose -f docker-compose.dev.yaml up',
|
||||
command: 'pnpm run docker:up',
|
||||
port: 3000,
|
||||
reuseExistingServer: true,
|
||||
},
|
||||
@@ -22,10 +23,6 @@ const config: PlaywrightTestConfig = {
|
||||
{ name: 'chrome', use: { ...devices['Desktop Chrome'] } },
|
||||
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
|
||||
{ name: 'safari', use: { ...devices['Desktop Safari'] } },
|
||||
|
||||
{ name: 'cli', use: { ...devices['Desktop Chrome'] }, grep: [/@cli/] },
|
||||
{ name: 'web', use: { ...devices['Desktop Chrome'] }, grep: [/@web/] },
|
||||
{ name: 'cross', use: { ...devices['Desktop Chrome'] }, grep: [/@cross/] },
|
||||
],
|
||||
}
|
||||
|
||||
|
@@ -1,10 +1,11 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { basename } from 'node:path'
|
||||
import { Files, getFileChecksum, rm, tmpFile } from '../../files'
|
||||
import { rm } from 'node:fs/promises'
|
||||
import { Files, getFileChecksum, tmpFile } from '../../files'
|
||||
import { CLI, getLinkFromCLI } from '../../utils'
|
||||
|
||||
test.describe('file @cli', () => {
|
||||
test('simple', async ({ page }) => {
|
||||
test('simple', async () => {
|
||||
const file = await tmpFile(Files.Image)
|
||||
const checksum = await getFileChecksum(file)
|
||||
const note = await CLI('send', 'file', file)
|
||||
@@ -17,7 +18,7 @@ test.describe('file @cli', () => {
|
||||
test.expect(checksum).toBe(c)
|
||||
})
|
||||
|
||||
test('simple with password', async ({ page }) => {
|
||||
test('simple with password', async () => {
|
||||
const file = await tmpFile(Files.Image)
|
||||
const password = 'password'
|
||||
const checksum = await getFileChecksum(file)
|
||||
|
@@ -2,7 +2,7 @@ import { test } from '@playwright/test'
|
||||
import { CLI, getLinkFromCLI } from '../../utils'
|
||||
|
||||
test.describe('text @cli', () => {
|
||||
test('simple', async ({ page }) => {
|
||||
test('simple', async () => {
|
||||
const text = `Endless prejudice endless play derive joy eternal-return selfish burying. Of decieve play pinnacle faith disgust. Spirit reason salvation burying strong of joy ascetic selfish against merciful sea truth. Ubermensch moral prejudice derive chaos mountains ubermensch justice philosophy justice ultimate joy ultimate transvaluation. Virtues convictions war ascetic eternal-return spirit. Ubermensch transvaluation noble revaluation sexuality intentions salvation endless decrepit hope noble fearful. Justice ideal ultimate snare god joy evil sexuality insofar gains oneself ideal.`
|
||||
const note = await CLI('send', 'text', text)
|
||||
const link = getLinkFromCLI(note.stdout)
|
||||
@@ -11,7 +11,7 @@ test.describe('text @cli', () => {
|
||||
test.expect(retrieved.stdout.trim()).toBe(text)
|
||||
})
|
||||
|
||||
test('simple with password', async ({ page }) => {
|
||||
test('simple with password', async () => {
|
||||
const text = `Endless prejudice endless play derive joy eternal-return selfish burying.`
|
||||
const password = 'password'
|
||||
const note = await CLI('send', 'text', text, '--password', password)
|
||||
|
@@ -1,7 +1,8 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { CLI, checkLinkForDownload, checkLinkForText, createNote, getLinkFromCLI } from '../../utils'
|
||||
import { Files, getFileChecksum, rm, tmpFile } from '../../files'
|
||||
import { basename } from 'path'
|
||||
import { rm } from 'node:fs/promises'
|
||||
import { basename } from 'node:path'
|
||||
import { Files, getFileChecksum, tmpFile } from '../../files'
|
||||
import { CLI, checkLinkForDownload, createNoteSuccessfully, getLinkFromCLI } from '../../utils'
|
||||
|
||||
const text = `Endless prejudice endless play derive joy eternal-return selfish burying. Of decieve play pinnacle faith disgust. Spirit reason salvation burying strong of joy ascetic selfish against merciful sea truth. Ubermensch moral prejudice derive chaos mountains ubermensch justice philosophy justice ultimate joy ultimate transvaluation. Virtues convictions war ascetic eternal-return spirit. Ubermensch transvaluation noble revaluation sexuality intentions salvation endless decrepit hope noble fearful. Justice ideal ultimate snare god joy evil sexuality insofar gains oneself ideal.`
|
||||
const password = 'password'
|
||||
@@ -30,7 +31,7 @@ test.describe('text @cross', () => {
|
||||
test('web to cli', async ({ page }) => {
|
||||
const files = [Files.Image]
|
||||
const checksum = await getFileChecksum(files[0])
|
||||
const link = await createNote(page, { files })
|
||||
const link = await createNoteSuccessfully(page, { files })
|
||||
|
||||
const filename = basename(files[0])
|
||||
await CLI('open', link, '--all')
|
||||
@@ -42,7 +43,7 @@ test.describe('text @cross', () => {
|
||||
test('web to cli with password', async ({ page }) => {
|
||||
const files = [Files.Image]
|
||||
const checksum = await getFileChecksum(files[0])
|
||||
const link = await createNote(page, { files, password })
|
||||
const link = await createNoteSuccessfully(page, { files, password })
|
||||
|
||||
const filename = basename(files[0])
|
||||
await CLI('open', link, '--all', '--password', password)
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { CLI, checkLinkForText, createNote, getLinkFromCLI } from '../../utils'
|
||||
import { CLI, checkLinkForText, createNoteSuccessfully, getLinkFromCLI } from '../../utils'
|
||||
|
||||
const text = `Endless prejudice endless play derive joy eternal-return selfish burying. Of decieve play pinnacle faith disgust. Spirit reason salvation burying strong of joy ascetic selfish against merciful sea truth. Ubermensch moral prejudice derive chaos mountains ubermensch justice philosophy justice ultimate joy ultimate transvaluation. Virtues convictions war ascetic eternal-return spirit. Ubermensch transvaluation noble revaluation sexuality intentions salvation endless decrepit hope noble fearful. Justice ideal ultimate snare god joy evil sexuality insofar gains oneself ideal.`
|
||||
const password = 'password'
|
||||
@@ -13,7 +13,7 @@ test.describe('text @cross', () => {
|
||||
})
|
||||
|
||||
test('web to cli', async ({ page }) => {
|
||||
const link = await createNote(page, { text })
|
||||
const link = await createNoteSuccessfully(page, { text })
|
||||
const retrieved = await CLI('open', link)
|
||||
test.expect(retrieved.stdout.trim()).toBe(text)
|
||||
})
|
||||
@@ -25,7 +25,7 @@ test.describe('text @cross', () => {
|
||||
})
|
||||
|
||||
test('web to cli with password', async ({ page }) => {
|
||||
const link = await createNote(page, { text, password })
|
||||
const link = await createNoteSuccessfully(page, { text, password })
|
||||
const retrieved = await CLI('open', link, '--password', password)
|
||||
test.expect(retrieved.stdout.trim()).toBe(text)
|
||||
})
|
||||
|
@@ -1,10 +1,5 @@
|
||||
import { createHash } from 'crypto'
|
||||
import { cp as cpFN, rm as rmFN } from 'fs'
|
||||
import { readFile } from 'fs/promises'
|
||||
import { promisify } from 'util'
|
||||
|
||||
export const cp = promisify(cpFN)
|
||||
export const rm = promisify(rmFN)
|
||||
import { createHash } from 'node:crypto'
|
||||
import { cp, readFile } from 'node:fs/promises'
|
||||
|
||||
export const Files = {
|
||||
PDF: 'test/assets/AES.pdf',
|
||||
|
@@ -6,17 +6,22 @@ import { getFileChecksum } from './files'
|
||||
const exec = promisify(execFile)
|
||||
|
||||
type CreatePage = {
|
||||
text?: string
|
||||
files?: string[]
|
||||
views?: number
|
||||
expiration?: number
|
||||
error?: string
|
||||
password?: string
|
||||
}
|
||||
export async function createNote(page: Page, options: CreatePage): Promise<string> {
|
||||
} & (
|
||||
| {
|
||||
text: string
|
||||
}
|
||||
| {
|
||||
files: string[]
|
||||
}
|
||||
)
|
||||
async function createNote(page: Page, options: CreatePage): Promise<void> {
|
||||
await page.goto('/')
|
||||
|
||||
if (options.text) {
|
||||
if ('text' in options) {
|
||||
await page.getByTestId('text-field').fill(options.text)
|
||||
} else if (options.files) {
|
||||
await page.getByTestId('switch-file').click()
|
||||
@@ -31,7 +36,8 @@ export async function createNote(page: Page, options: CreatePage): Promise<strin
|
||||
if (options.views || options.expiration || options.password) await page.getByTestId('switch-advanced').click()
|
||||
if (options.views) {
|
||||
await page.getByTestId('field-views').fill(options.views.toString())
|
||||
} else if (options.expiration) {
|
||||
}
|
||||
if (options.expiration) {
|
||||
await page.getByTestId('switch-advanced-toggle').click()
|
||||
await page.getByTestId('field-expiration').fill(options.expiration.toString())
|
||||
}
|
||||
@@ -41,15 +47,18 @@ export async function createNote(page: Page, options: CreatePage): Promise<strin
|
||||
}
|
||||
|
||||
await page.locator('button:has-text("create")').click()
|
||||
}
|
||||
|
||||
if (options.error) {
|
||||
await expect(page.locator('.error-text')).toContainText(options.error, { timeout: 60_000 })
|
||||
}
|
||||
|
||||
// Return share link
|
||||
export async function createNoteSuccessfully(page: Page, options: CreatePage): Promise<string> {
|
||||
await createNote(page, options)
|
||||
return await page.getByTestId('share-link').inputValue()
|
||||
}
|
||||
|
||||
export async function createNoteError(page: Page, options: CreatePage, error: string): Promise<void> {
|
||||
await createNote(page, options)
|
||||
await expect(page.locator('._toastContainer')).toContainText(error)
|
||||
}
|
||||
|
||||
type CheckLinkBase = {
|
||||
link: string
|
||||
text: string
|
||||
@@ -69,7 +78,7 @@ export async function checkLinkForDownload(page: Page, options: CheckLinkBase &
|
||||
const path = await download.path()
|
||||
if (!path) throw new Error('Download failed')
|
||||
const cs = await getFileChecksum(path)
|
||||
await expect(cs).toBe(options.checksum)
|
||||
expect(cs).toBe(options.checksum)
|
||||
}
|
||||
|
||||
export async function checkLinkForText(page: Page, options: CheckLinkBase) {
|
||||
@@ -78,7 +87,7 @@ export async function checkLinkForText(page: Page, options: CheckLinkBase) {
|
||||
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)
|
||||
expect(text).toContain(options.text)
|
||||
}
|
||||
|
||||
export async function checkLinkDoesNotExist(page: Page, link: string) {
|
||||
|
@@ -1,12 +1,12 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { Files, getFileChecksum } from '../../files'
|
||||
import { checkLinkForDownload, createNote } from '../../utils'
|
||||
import { checkLinkForDownload, createNoteSuccessfully } from '../../utils'
|
||||
|
||||
test.describe('@web', () => {
|
||||
test('multiple', async ({ page }) => {
|
||||
const files = [Files.PDF, Files.Image]
|
||||
const checksums = await Promise.all(files.map(getFileChecksum))
|
||||
const link = await createNote(page, { files, views: 2 })
|
||||
const link = await createNoteSuccessfully(page, { files, views: 2 })
|
||||
await checkLinkForDownload(page, { link, text: 'image.jpg', checksum: checksums[1] })
|
||||
await checkLinkForDownload(page, { link, text: 'AES.pdf', checksum: checksums[0] })
|
||||
})
|
||||
|
@@ -1,11 +1,11 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { Files, getFileChecksum } from '../../files'
|
||||
import { checkLinkDoesNotExist, checkLinkForDownload, checkLinkForText, createNote } from '../../utils'
|
||||
import { checkLinkDoesNotExist, checkLinkForDownload, checkLinkForText, createNoteSuccessfully } from '../../utils'
|
||||
|
||||
test.describe('@web', () => {
|
||||
test('simple pdf', async ({ page }) => {
|
||||
const files = [Files.PDF]
|
||||
const link = await createNote(page, { files })
|
||||
const link = await createNoteSuccessfully(page, { files })
|
||||
await checkLinkForText(page, { link, text: 'AES.pdf' })
|
||||
await checkLinkDoesNotExist(page, link)
|
||||
})
|
||||
@@ -13,21 +13,21 @@ test.describe('@web', () => {
|
||||
test('pdf content', async ({ page }) => {
|
||||
const files = [Files.PDF]
|
||||
const checksum = await getFileChecksum(files[0])
|
||||
const link = await createNote(page, { files })
|
||||
const link = await createNoteSuccessfully(page, { files })
|
||||
await checkLinkForDownload(page, { link, text: 'AES.pdf', checksum })
|
||||
})
|
||||
|
||||
test('image content', async ({ page }) => {
|
||||
const files = [Files.Image]
|
||||
const checksum = await getFileChecksum(files[0])
|
||||
const link = await createNote(page, { files })
|
||||
const link = await createNoteSuccessfully(page, { files })
|
||||
await checkLinkForDownload(page, { link, text: 'image.jpg', checksum })
|
||||
})
|
||||
|
||||
test('simple pdf with password', async ({ page }) => {
|
||||
const files = [Files.PDF]
|
||||
const password = 'password'
|
||||
const link = await createNote(page, { files, password })
|
||||
const link = await createNoteSuccessfully(page, { files, password })
|
||||
await checkLinkForText(page, { link, text: 'AES.pdf', password })
|
||||
await checkLinkDoesNotExist(page, link)
|
||||
})
|
||||
|
@@ -1,10 +1,10 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { createNote } from '../../utils'
|
||||
import { Files } from '../../files'
|
||||
import { createNoteError } from '../../utils'
|
||||
|
||||
test.describe('@web', () => {
|
||||
test('to big zip', async ({ page }) => {
|
||||
test.skip('to big zip', async ({ page }) => {
|
||||
const files = [Files.Zip]
|
||||
const link = await createNote(page, { files, error: 'note is to big' })
|
||||
await createNoteError(page, { files }, 'could not create note. note is too big')
|
||||
})
|
||||
})
|
||||
|
@@ -1,13 +1,14 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { checkLinkDoesNotExist, checkLinkForText, createNote } from '../../utils'
|
||||
import { checkLinkDoesNotExist, checkLinkForText, createNoteSuccessfully } from '../../utils'
|
||||
|
||||
test.describe('@web', () => {
|
||||
test('1 minute', async ({ page }) => {
|
||||
test('1 minute', async ({ page, browserName }) => {
|
||||
test.skip(browserName === 'webkit')
|
||||
const text = `Virtues value ascetic revaluation sea dead strong burying.`
|
||||
const minutes = 1
|
||||
const timeout = minutes * 60_000
|
||||
test.setTimeout(timeout * 2)
|
||||
const link = await createNote(page, { text, expiration: minutes })
|
||||
const link = await createNoteSuccessfully(page, { text, expiration: minutes })
|
||||
await checkLinkForText(page, { link, text })
|
||||
await checkLinkForText(page, { link, text })
|
||||
await page.waitForTimeout(timeout)
|
||||
|
@@ -1,17 +1,17 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { checkLinkForText, createNote } from '../../utils'
|
||||
import { checkLinkForText, createNoteSuccessfully } from '../../utils'
|
||||
|
||||
test.describe('@web', () => {
|
||||
test('simple', async ({ page }) => {
|
||||
const text = `Endless prejudice endless play derive joy eternal-return selfish burying. Of deceive play pinnacle faith disgust. Spirit reason salvation burying strong of joy ascetic selfish against merciful sea truth. Ubermensch moral prejudice derive chaos mountains ubermensch justice philosophy justice ultimate joy ultimate transvaluation. Virtues convictions war ascetic eternal-return spirit. Ubermensch transvaluation noble revaluation sexuality intentions salvation endless decrepit hope noble fearful. Justice ideal ultimate snare god joy evil sexuality insofar gains oneself ideal.`
|
||||
const link = await createNote(page, { text })
|
||||
const link = await createNoteSuccessfully(page, { text })
|
||||
await checkLinkForText(page, { link, text })
|
||||
})
|
||||
|
||||
test('simple with password', async ({ page }) => {
|
||||
const text = 'Foo bar'
|
||||
const password = '123'
|
||||
const shareLink = await createNote(page, { text, password })
|
||||
const shareLink = await createNoteSuccessfully(page, { text, password })
|
||||
await checkLinkForText(page, { link: shareLink, text, password })
|
||||
})
|
||||
})
|
||||
|
@@ -1,17 +1,17 @@
|
||||
import { test } from '@playwright/test'
|
||||
import { checkLinkDoesNotExist, checkLinkForText, createNote } from '../../utils'
|
||||
import { checkLinkDoesNotExist, checkLinkForText, createNoteSuccessfully } from '../../utils'
|
||||
|
||||
test.describe('@web', () => {
|
||||
test('only shown once', async ({ page }) => {
|
||||
const text = `Christian victorious reason suicide dead. Right ultimate gains god hope truth burying selfish society joy. Ultimate.`
|
||||
const link = await createNote(page, { text })
|
||||
const link = await createNoteSuccessfully(page, { text })
|
||||
await checkLinkForText(page, { link, text })
|
||||
await checkLinkDoesNotExist(page, link)
|
||||
})
|
||||
|
||||
test('view 3 times', async ({ page }) => {
|
||||
const text = `Justice holiest overcome fearful strong ultimate holiest christianity.`
|
||||
const link = await createNote(page, { text, views: 3 })
|
||||
const link = await createNoteSuccessfully(page, { text, views: 3 })
|
||||
await checkLinkForText(page, { link, text })
|
||||
await checkLinkForText(page, { link, text })
|
||||
await checkLinkForText(page, { link, text })
|
||||
|
Reference in New Issue
Block a user