mirror of
https://github.com/documenso/documenso.git
synced 2025-11-17 18:21:32 +10:00
feat: improve tests
This commit is contained in:
@ -1,11 +1,16 @@
|
|||||||
# [[E2E Tests]]
|
# [[E2E Tests]]
|
||||||
E2E_TEST_USERNAME="Test"
|
|
||||||
E2E_TEST_USER_EMAIL="mytestuser@mail.com"
|
|
||||||
E2E_TEST_USER_PASSWORD="test_password"
|
|
||||||
E2E_TEST_SIGNER_NAME="Test Signer"
|
E2E_TEST_SIGNER_NAME="Test Signer"
|
||||||
E2E_TEST_SIGNER_EMAIL="testsigner@mail.com"
|
E2E_TEST_SIGNER_EMAIL="testsigner@mail.com"
|
||||||
E2E_TEST_SIGNING_SUBJECT="Test subject"
|
E2E_TEST_SIGNING_SUBJECT="Test subject"
|
||||||
E2E_TEST_SIGNING_MESSAGE="Test message"
|
E2E_TEST_SIGNING_MESSAGE="Test message"
|
||||||
|
# User for the "auth.setup.ts" file and the authenticated tests
|
||||||
|
E2E_TEST_AUTHENTICATE_USERNAME="New user"
|
||||||
|
E2E_TEST_AUTHENTICATE_USER_EMAIL="mytestnewuser@mail.com"
|
||||||
|
E2E_TEST_AUTHENTICATE_USER_PASSWORD="new_test_password"
|
||||||
|
# User for the *.unauthenticated.ts files
|
||||||
|
E2E_TEST_USERNAME="Test"
|
||||||
|
E2E_TEST_USER_EMAIL="mytestuser@mail.com"
|
||||||
|
E2E_TEST_USER_PASSWORD="test_password"
|
||||||
|
|
||||||
# [[SMTP]]
|
# [[SMTP]]
|
||||||
# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels
|
# OPTIONAL: Defines the transport to use for sending emails. Available options: smtp-auth (default) | smtp-api | mailchannels
|
||||||
|
|||||||
@ -1,12 +1,13 @@
|
|||||||
import { deleteUser } from '@documenso/lib/server-only/user/delete-user';
|
import { deleteUserAndItsData } from '@documenso/lib/server-only/user/delete-user-and-data';
|
||||||
|
|
||||||
async function teardown() {
|
async function teardown() {
|
||||||
if (!process.env.E2E_TEST_USERNAME) {
|
if (!process.env.E2E_TEST_USERNAME || !process.env.E2E_TEST_AUTHENTICATE_USERNAME) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await deleteUser(process.env.E2E_TEST_USERNAME);
|
await deleteUserAndItsData(process.env.E2E_TEST_USERNAME);
|
||||||
|
await deleteUserAndItsData(process.env.E2E_TEST_AUTHENTICATE_USERNAME);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error(`Error deleting user: ${e}`);
|
throw new Error(`Error deleting user: ${e}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,7 +32,7 @@ export default defineConfig({
|
|||||||
|
|
||||||
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||||
trace: 'on-first-retry',
|
trace: 'on-first-retry',
|
||||||
video: 'retain-on-failure',
|
navigationTimeout: 60 * 1000,
|
||||||
},
|
},
|
||||||
|
|
||||||
/* Configure projects for major browsers */
|
/* Configure projects for major browsers */
|
||||||
@ -41,7 +41,7 @@ export default defineConfig({
|
|||||||
{
|
{
|
||||||
name: 'Authenticated User Tests',
|
name: 'Authenticated User Tests',
|
||||||
testMatch: '*.authenticated.spec.ts',
|
testMatch: '*.authenticated.spec.ts',
|
||||||
dependencies: ['setup'],
|
dependencies: ['setup', 'cleanup db'],
|
||||||
use: {
|
use: {
|
||||||
...devices['Desktop Chrome'],
|
...devices['Desktop Chrome'],
|
||||||
storageState: STORAGE_STATE,
|
storageState: STORAGE_STATE,
|
||||||
@ -49,6 +49,7 @@ export default defineConfig({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Unauthenticated User Tests',
|
name: 'Unauthenticated User Tests',
|
||||||
|
dependencies: ['cleanup db'],
|
||||||
use: {
|
use: {
|
||||||
...devices['Desktop Chrome'],
|
...devices['Desktop Chrome'],
|
||||||
},
|
},
|
||||||
|
|||||||
@ -2,9 +2,9 @@ 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_AUTHENTICATE_USERNAME || '';
|
||||||
const email = process.env.E2E_TEST_USER_EMAIL || '';
|
const email = process.env.E2E_TEST_AUTHENTICATE_USER_EMAIL || '';
|
||||||
const password = process.env.E2E_TEST_USER_PASSWORD || '';
|
const password = process.env.E2E_TEST_AUTHENTICATE_USER_PASSWORD || '';
|
||||||
|
|
||||||
setup('authenticate', async ({ page }: { page: Page }) => {
|
setup('authenticate', async ({ page }: { page: Page }) => {
|
||||||
await page.goto('/signup');
|
await page.goto('/signup');
|
||||||
@ -16,9 +16,9 @@ setup('authenticate', async ({ page }: { page: Page }) => {
|
|||||||
const box = await canvas.boundingBox();
|
const box = await canvas.boundingBox();
|
||||||
|
|
||||||
if (box) {
|
if (box) {
|
||||||
await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2);
|
await page.mouse.move(box.x + box.width / 8, box.y + box.height / 6);
|
||||||
await page.mouse.down();
|
await page.mouse.down();
|
||||||
await page.mouse.move(box.x + box.width / 4, box.y + box.height / 4);
|
await page.mouse.move(box.x + box.width / 8, box.y + box.height / 6);
|
||||||
await page.mouse.up();
|
await page.mouse.up();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ setup('authenticate', async ({ page }: { page: Page }) => {
|
|||||||
await page.getByLabel('Email').fill(email);
|
await page.getByLabel('Email').fill(email);
|
||||||
await page.getByLabel('Password').fill(password);
|
await page.getByLabel('Password').fill(password);
|
||||||
await page.getByRole('button', { name: 'Sign In' }).click();
|
await page.getByRole('button', { name: 'Sign In' }).click();
|
||||||
await page.waitForURL('/documents');
|
|
||||||
await expect(page).toHaveURL('/documents');
|
await expect(page).toHaveURL('/documents');
|
||||||
await page.context().storageState({ path: STORAGE_STATE });
|
await page.context().storageState({ path: STORAGE_STATE });
|
||||||
});
|
});
|
||||||
|
|||||||
@ -29,6 +29,9 @@ test('user can sign up with email and password', async ({ page }: { page: Page }
|
|||||||
}
|
}
|
||||||
|
|
||||||
await page.getByRole('button', { name: 'Sign Up' }).click();
|
await page.getByRole('button', { name: 'Sign Up' }).click();
|
||||||
|
await page.waitForURL('/documents');
|
||||||
|
|
||||||
|
await expect(page).toHaveURL('/documents');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('user can login with user and password', async ({ page }: { page: Page }) => {
|
test('user can login with user and password', async ({ page }: { page: Page }) => {
|
||||||
@ -37,5 +40,6 @@ test('user can login with user and password', async ({ page }: { page: Page }) =
|
|||||||
await page.getByLabel('Password').fill(password);
|
await page.getByLabel('Password').fill(password);
|
||||||
await page.getByRole('button', { name: 'Sign In' }).click();
|
await page.getByRole('button', { name: 'Sign In' }).click();
|
||||||
|
|
||||||
|
await page.waitForURL('/documents');
|
||||||
await expect(page).toHaveURL('/documents');
|
await expect(page).toHaveURL('/documents');
|
||||||
});
|
});
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"build": "turbo run build",
|
"build": "turbo run build",
|
||||||
"dev": "turbo run dev --filter=@documenso/web --filter=@documenso/marketing",
|
"dev": "turbo run dev --filter=@documenso/web --filter=@documenso/marketing",
|
||||||
"start": "cd apps && cd web && next start",
|
"start": "cd apps && cd web && next start",
|
||||||
"test": "turbo run e2e:test",
|
"test": "cd apps && cd web && npm run test",
|
||||||
"lint": "turbo run lint",
|
"lint": "turbo run lint",
|
||||||
"format": "prettier --write \"**/*.{js,jsx,cjs,mjs,ts,tsx,cts,mts,mdx}\"",
|
"format": "prettier --write \"**/*.{js,jsx,cjs,mjs,ts,tsx,cts,mts,mdx}\"",
|
||||||
"prepare": "husky install",
|
"prepare": "husky install",
|
||||||
|
|||||||
41
packages/lib/server-only/user/delete-user-and-data.ts
Normal file
41
packages/lib/server-only/user/delete-user-and-data.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { prisma } from '@documenso/prisma';
|
||||||
|
|
||||||
|
export const deleteUserAndItsData = async (name: string) => {
|
||||||
|
const user = await prisma.user.findFirst({
|
||||||
|
where: {
|
||||||
|
name: {
|
||||||
|
contains: name,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!user) {
|
||||||
|
throw new Error(`User with name ${name} not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const document = await prisma.document.findMany({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
documentData: {
|
||||||
|
select: {
|
||||||
|
data: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.all([
|
||||||
|
await prisma.user.delete({
|
||||||
|
where: {
|
||||||
|
id: user.id,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
await prisma.documentData.deleteMany({
|
||||||
|
where: {
|
||||||
|
data: document[0]?.documentData.data,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
};
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import { prisma } from '@documenso/prisma';
|
|
||||||
|
|
||||||
export const deleteUser = async (name: string) => {
|
|
||||||
const user = await prisma.user.findFirst({
|
|
||||||
where: {
|
|
||||||
name: {
|
|
||||||
contains: name,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!user) {
|
|
||||||
throw new Error(`User with name ${name} not found`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return await prisma.user.delete({
|
|
||||||
where: {
|
|
||||||
id: user.id,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
@ -17,6 +17,7 @@
|
|||||||
"globalDependencies": ["**/.env.*local"],
|
"globalDependencies": ["**/.env.*local"],
|
||||||
"globalEnv": [
|
"globalEnv": [
|
||||||
"APP_VERSION",
|
"APP_VERSION",
|
||||||
|
|
||||||
"E2E_TEST_USERNAME",
|
"E2E_TEST_USERNAME",
|
||||||
"E2E_TEST_USER_EMAIL",
|
"E2E_TEST_USER_EMAIL",
|
||||||
"E2E_TEST_USER_PASSWORD",
|
"E2E_TEST_USER_PASSWORD",
|
||||||
@ -24,6 +25,10 @@
|
|||||||
"E2E_TEST_SIGNER_EMAIL",
|
"E2E_TEST_SIGNER_EMAIL",
|
||||||
"E2E_TEST_SIGNING_SUBJECT",
|
"E2E_TEST_SIGNING_SUBJECT",
|
||||||
"E2E_TEST_SIGNING_MESSAGE",
|
"E2E_TEST_SIGNING_MESSAGE",
|
||||||
|
"E2E_TEST_AUTHENTICATE_USERNAME",
|
||||||
|
"E2E_TEST_AUTHENTICATE_USER_EMAIL",
|
||||||
|
"E2E_TEST_AUTHENTICATE_USER_PASSWORD",
|
||||||
|
|
||||||
"NEXTAUTH_URL",
|
"NEXTAUTH_URL",
|
||||||
"NEXTAUTH_SECRET",
|
"NEXTAUTH_SECRET",
|
||||||
"NEXT_PUBLIC_WEBAPP_URL",
|
"NEXT_PUBLIC_WEBAPP_URL",
|
||||||
|
|||||||
Reference in New Issue
Block a user