mirror of
https://github.com/documenso/documenso.git
synced 2025-11-17 02:01:33 +10:00
feat: moved playwright to the web app
This commit is contained in:
36
apps/web/.env.example
Normal file
36
apps/web/.env.example
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# [[E2E Tests]]
|
||||||
|
E2E_TEST_USERNAME="Test"
|
||||||
|
E2E_TEST_USER_EMAIL="mytestuser@mail.com"
|
||||||
|
E2E_TEST_USER_PASSWORD="test_password"
|
||||||
|
|
||||||
|
# [[SMTP]]
|
||||||
|
# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels
|
||||||
|
NEXT_PRIVATE_SMTP_TRANSPORT="smtp-auth"
|
||||||
|
# OPTIONAL: Defines the host to use for sending emails.
|
||||||
|
NEXT_PRIVATE_SMTP_HOST="127.0.0.1"
|
||||||
|
# OPTIONAL: Defines the port to use for sending emails.
|
||||||
|
NEXT_PRIVATE_SMTP_PORT=2500
|
||||||
|
# OPTIONAL: Defines the username to use with the SMTP server.
|
||||||
|
NEXT_PRIVATE_SMTP_USERNAME="documenso"
|
||||||
|
# OPTIONAL: Defines the password to use with the SMTP server.
|
||||||
|
NEXT_PRIVATE_SMTP_PASSWORD="password"
|
||||||
|
# OPTIONAL: Defines the API key user to use with the SMTP server.
|
||||||
|
NEXT_PRIVATE_SMTP_APIKEY_USER=
|
||||||
|
# OPTIONAL: Defines the API key to use with the SMTP server.
|
||||||
|
NEXT_PRIVATE_SMTP_APIKEY=
|
||||||
|
# OPTIONAL: Defines whether to force the use of TLS.
|
||||||
|
NEXT_PRIVATE_SMTP_SECURE=
|
||||||
|
# REQUIRED: Defines the sender name to use for the from address.
|
||||||
|
NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso"
|
||||||
|
# REQUIRED: Defines the email address to use as the from address.
|
||||||
|
NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com"
|
||||||
|
# OPTIONAL: The API key to use for the MailChannels proxy endpoint.
|
||||||
|
NEXT_PRIVATE_MAILCHANNELS_API_KEY=
|
||||||
|
# OPTIONAL: The endpoint to use for the MailChannels API if using a proxy.
|
||||||
|
NEXT_PRIVATE_MAILCHANNELS_ENDPOINT=
|
||||||
|
# OPTIONAL: The domain to use for DKIM signing.
|
||||||
|
NEXT_PRIVATE_MAILCHANNELS_DKIM_DOMAIN=
|
||||||
|
# OPTIONAL: The selector to use for DKIM signing.
|
||||||
|
NEXT_PRIVATE_MAILCHANNELS_DKIM_SELECTOR=
|
||||||
|
# OPTIONAL: The private key to use for DKIM signing.
|
||||||
|
NEXT_PRIVATE_MAILCHANNELS_DKIM_PRIVATE_KEY=
|
||||||
27
apps/web/.github/workflows/playwright.yml
vendored
Normal file
27
apps/web/.github/workflows/playwright.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
name: Playwright Tests
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, master ]
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
timeout-minutes: 60
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
- name: Install Playwright Browsers
|
||||||
|
run: npx playwright install --with-deps
|
||||||
|
- name: Run Playwright tests
|
||||||
|
run: npx playwright test
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: playwright-report
|
||||||
|
path: playwright-report/
|
||||||
|
retention-days: 30
|
||||||
2
apps/web/.gitignore
vendored
Normal file
2
apps/web/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
playwright-report/
|
||||||
@ -43,6 +43,7 @@
|
|||||||
"zod": "^3.21.4"
|
"zod": "^3.21.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@playwright/test": "^1.38.0",
|
||||||
"@types/formidable": "^2.0.6",
|
"@types/formidable": "^2.0.6",
|
||||||
"@types/luxon": "^3.3.1",
|
"@types/luxon": "^3.3.1",
|
||||||
"@types/node": "20.1.0",
|
"@types/node": "20.1.0",
|
||||||
|
|||||||
85
apps/web/playwright.config.ts
Normal file
85
apps/web/playwright.config.ts
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import { defineConfig, devices } from '@playwright/test';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read environment variables from file.
|
||||||
|
* https://github.com/motdotla/dotenv
|
||||||
|
*/
|
||||||
|
import { config as dotenvConfig } from 'dotenv';
|
||||||
|
|
||||||
|
dotenvConfig();
|
||||||
|
|
||||||
|
export const STORAGE_STATE = 'playwright/.auth/user.json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://playwright.dev/docs/test-configuration.
|
||||||
|
*/
|
||||||
|
export default defineConfig({
|
||||||
|
testDir: './src/tests/e2e',
|
||||||
|
/* Run tests in files in parallel */
|
||||||
|
fullyParallel: true,
|
||||||
|
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||||
|
forbidOnly: !!process.env.CI,
|
||||||
|
/* Retry on CI only */
|
||||||
|
retries: process.env.CI ? 2 : 0,
|
||||||
|
/* Opt out of parallel tests on CI. */
|
||||||
|
workers: process.env.CI ? 1 : undefined,
|
||||||
|
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||||
|
reporter: 'html',
|
||||||
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||||
|
use: {
|
||||||
|
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||||
|
baseURL: 'http://localhost:3000',
|
||||||
|
|
||||||
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||||
|
trace: 'on-first-retry',
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Configure projects for major browsers */
|
||||||
|
projects: [
|
||||||
|
{ name: 'setup', testMatch: '**/*.setup.ts' },
|
||||||
|
{
|
||||||
|
name: 'Authenticated User Tests',
|
||||||
|
testMatch: '*.authenticated.spec.ts',
|
||||||
|
dependencies: ['setup'],
|
||||||
|
use: {
|
||||||
|
...devices['Desktop Chrome'],
|
||||||
|
storageState: STORAGE_STATE,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Unauthenticated User Tests',
|
||||||
|
use: {
|
||||||
|
...devices['Desktop Chrome'],
|
||||||
|
},
|
||||||
|
testMatch: '*.unauthenticated.spec.ts',
|
||||||
|
testIgnore: ['*.setup.ts', '*.authenticated.spec.ts'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
/* Test against mobile viewports. */
|
||||||
|
// {
|
||||||
|
// name: 'Mobile Chrome',
|
||||||
|
// use: { ...devices['Pixel 5'] },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: 'Mobile Safari',
|
||||||
|
// use: { ...devices['iPhone 12'] },
|
||||||
|
// },
|
||||||
|
|
||||||
|
/* Test against branded browsers. */
|
||||||
|
// {
|
||||||
|
// name: 'Microsoft Edge',
|
||||||
|
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: 'Google Chrome',
|
||||||
|
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
||||||
|
// },
|
||||||
|
|
||||||
|
/* Run your local dev server before starting the tests */
|
||||||
|
// webServer: {
|
||||||
|
// command: 'npm run start',
|
||||||
|
// url: 'http://127.0.0.1:3000',
|
||||||
|
// reuseExistingServer: !process.env.CI,
|
||||||
|
// },
|
||||||
|
});
|
||||||
45
apps/web/playwright/.auth/user.json
Normal file
45
apps/web/playwright/.auth/user.json
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"cookies": [
|
||||||
|
{
|
||||||
|
"name": "next-auth.csrf-token",
|
||||||
|
"value": "4772e794e5f5a82dced421cfe438001a4ee36c905374383a14ff24ea59a53eeb%7Cd73af8796095fa1296860e6979b54c53b94ebbb9553ec2c70b0cbcc4448192d0",
|
||||||
|
"domain": "localhost",
|
||||||
|
"path": "/",
|
||||||
|
"expires": -1,
|
||||||
|
"httpOnly": true,
|
||||||
|
"secure": false,
|
||||||
|
"sameSite": "Lax"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "next-auth.callback-url",
|
||||||
|
"value": "http%3A%2F%2Flocalhost%3A3000%2Fdocuments",
|
||||||
|
"domain": "localhost",
|
||||||
|
"path": "/",
|
||||||
|
"expires": -1,
|
||||||
|
"httpOnly": true,
|
||||||
|
"secure": false,
|
||||||
|
"sameSite": "Lax"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "next-auth.session-token",
|
||||||
|
"value": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..ZAKfOWExpxch-GkZ.h1-kr4EyMbgfKHz34rsb9PO-upqJOvUYL8e1rVEItSYk_fh4aJPFodW732rVqjNsdXaD2OB0OjKaAxF-0oF264aB5sqiTbaURM8ge8G_5YDgELKi8gzNAK21ta2IaQ57IX-94NhSgVVqhkRcx-Y1kcVdy23vHIzbmhzcP0zMkXVtHtw29zLC_hwLXrY.3fxNbK8FQKwPgWpCxvadeA",
|
||||||
|
"domain": "localhost",
|
||||||
|
"path": "/",
|
||||||
|
"expires": 1697899853.443211,
|
||||||
|
"httpOnly": true,
|
||||||
|
"secure": false,
|
||||||
|
"sameSite": "Lax"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"origins": [
|
||||||
|
{
|
||||||
|
"origin": "http://localhost:3000",
|
||||||
|
"localStorage": [
|
||||||
|
{
|
||||||
|
"name": "nextauth.message",
|
||||||
|
"value": "{\"event\":\"session\",\"data\":{\"trigger\":\"getSession\"},\"timestamp\":1695307853}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import { type Page, expect, test as setup } from '@playwright/test';
|
import { type Page, expect, test as setup } from '@playwright/test';
|
||||||
|
|
||||||
import { STORAGE_STATE } from '../../../../../playwright.config';
|
import { STORAGE_STATE } from '../../../playwright.config';
|
||||||
|
|
||||||
const username = process.env.E2E_TEST_USERNAME || '';
|
const username = process.env.E2E_TEST_USERNAME || '';
|
||||||
const email = process.env.E2E_TEST_USER_EMAIL || '';
|
const email = process.env.E2E_TEST_USER_EMAIL || '';
|
||||||
|
|||||||
@ -27,7 +27,7 @@ test.describe('Document upload test', () => {
|
|||||||
await page
|
await page
|
||||||
.getByText('Add a documentDrag & drop your document here.')
|
.getByText('Add a documentDrag & drop your document here.')
|
||||||
.locator('input[type=file]')
|
.locator('input[type=file]')
|
||||||
.setInputFiles('./apps/web/src/tests/e2e/documenso.pdf');
|
.setInputFiles('./src/tests/e2e/documenso.pdf');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('user can see /documents page', async ({ page }: { page: Page }) => {
|
test('user can see /documents page', async ({ page }: { page: Page }) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user