From e47ca1d6b6168fb546eacd60d99bf0697c7a8d64 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 8 Mar 2024 00:04:27 +0000 Subject: [PATCH 1/4] chore: add e2e test for deleting a user --- .../profile/delete-account-dialog.tsx | 5 ++++- .../app-tests/e2e/test-delete-user.spec.ts | 21 +++++++++++++++++++ packages/prisma/package.json | 3 ++- packages/prisma/seed/users.ts | 21 +++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 packages/app-tests/e2e/test-delete-user.spec.ts diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 933b37f31..4db0ba01a 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -78,7 +78,9 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
- + @@ -110,6 +112,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp onClick={onDeleteAccount} loading={isDeletingAccount} variant="destructive" + data-testid="delete-account-confirmation-button" disabled={hasTwoFactorAuthentication} > {isDeletingAccount ? 'Deleting account...' : 'Delete Account'} diff --git a/packages/app-tests/e2e/test-delete-user.spec.ts b/packages/app-tests/e2e/test-delete-user.spec.ts new file mode 100644 index 000000000..acda3f0fc --- /dev/null +++ b/packages/app-tests/e2e/test-delete-user.spec.ts @@ -0,0 +1,21 @@ +import { test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedUser } from '@documenso/prisma/seed/users'; + +import { manualLogin } from './fixtures/authentication'; + +test('delete user', async ({ page }) => { + const user = await seedUser(); + + await manualLogin({ + page, + email: user.email, + redirectPath: '/settings', + }); + + await page.getByTestId('delete-account-button').click(); + await page.getByTestId('delete-account-confirmation-button').click(); + + await page.waitForURL(`${WEBAPP_BASE_URL}/signin`); +}); diff --git a/packages/prisma/package.json b/packages/prisma/package.json index 0cd3ed282..62248ffc0 100644 --- a/packages/prisma/package.json +++ b/packages/prisma/package.json @@ -12,7 +12,8 @@ "prisma:generate": "prisma generate", "prisma:migrate-dev": "prisma migrate dev", "prisma:migrate-deploy": "prisma migrate deploy", - "prisma:seed": "prisma db seed" + "prisma:seed": "prisma db seed", + "prisma:studio": "prisma studio" }, "prisma": { "seed": "ts-node --transpileOnly --project ./tsconfig.seed.json ./seed-database.ts" diff --git a/packages/prisma/seed/users.ts b/packages/prisma/seed/users.ts index 353683a1d..647b93736 100644 --- a/packages/prisma/seed/users.ts +++ b/packages/prisma/seed/users.ts @@ -26,6 +26,27 @@ export const seedUser = async ({ }); }; +export const seed2faUser = async ({ + name = `2fa-user-${Date.now()}`, + email = `2fa-user-${Date.now()}@test.documenso.com`, + password = 'password', + verified = true, +}: SeedUserOptions = {}) => { + return await prisma.user.create({ + data: { + name, + email, + password: hashSync(password), + emailVerified: verified ? new Date() : undefined, + url: name, + twoFactorEnabled: true, + twoFactorSecret: + 'b2840b216b1f089cb086bdd4260196c645d90b0bd3ff8f66d20d19b99a0da1631bf299e416476917194f1064f58b', + twoFactorBackupCodes: 'a-bunch-of-backup-codes', + }, + }); +}; + export const unseedUser = async (userId: number) => { await prisma.user.delete({ where: { From ff3b49656cf3a001076ddc94ed047663249b965a Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 8 Mar 2024 00:07:11 +0000 Subject: [PATCH 2/4] chore: remove unused function --- packages/prisma/seed/users.ts | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/packages/prisma/seed/users.ts b/packages/prisma/seed/users.ts index 647b93736..353683a1d 100644 --- a/packages/prisma/seed/users.ts +++ b/packages/prisma/seed/users.ts @@ -26,27 +26,6 @@ export const seedUser = async ({ }); }; -export const seed2faUser = async ({ - name = `2fa-user-${Date.now()}`, - email = `2fa-user-${Date.now()}@test.documenso.com`, - password = 'password', - verified = true, -}: SeedUserOptions = {}) => { - return await prisma.user.create({ - data: { - name, - email, - password: hashSync(password), - emailVerified: verified ? new Date() : undefined, - url: name, - twoFactorEnabled: true, - twoFactorSecret: - 'b2840b216b1f089cb086bdd4260196c645d90b0bd3ff8f66d20d19b99a0da1631bf299e416476917194f1064f58b', - twoFactorBackupCodes: 'a-bunch-of-backup-codes', - }, - }); -}; - export const unseedUser = async (userId: number) => { await prisma.user.delete({ where: { From ee35b4a24b2a380396d1540fbe74f245a386032b Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 8 Mar 2024 02:45:22 +0000 Subject: [PATCH 3/4] fix: update test to use getByRole --- .../settings/profile/delete-account-dialog.tsx | 2 +- package.json | 2 +- packages/app-tests/e2e/test-delete-user.spec.ts | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 4db0ba01a..8663aeea6 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -115,7 +115,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp data-testid="delete-account-confirmation-button" disabled={hasTwoFactorAuthentication} > - {isDeletingAccount ? 'Deleting account...' : 'Delete Account'} + {isDeletingAccount ? 'Deleting account...' : 'Confirm Deletion'} diff --git a/package.json b/package.json index 8ff557e9d..cbaa2a1eb 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "prisma:migrate-dev": "npm run with:env -- npm run prisma:migrate-dev -w @documenso/prisma", "prisma:migrate-deploy": "npm run with:env -- npm run prisma:migrate-deploy -w @documenso/prisma", "prisma:seed": "npm run with:env -- npm run prisma:seed -w @documenso/prisma", - "prisma:studio": "npm run with:env -- npx prisma studio --schema packages/prisma/schema.prisma", + "prisma:studio": "npm run with:env -- npm run prisma:studio -w @documenso/prisma", "with:env": "dotenv -e .env -e .env.local --", "reset:hard": "npm run clean && npm i && npm run prisma:generate", "precommit": "npm install && git add package.json package-lock.json" diff --git a/packages/app-tests/e2e/test-delete-user.spec.ts b/packages/app-tests/e2e/test-delete-user.spec.ts index acda3f0fc..beae6eb09 100644 --- a/packages/app-tests/e2e/test-delete-user.spec.ts +++ b/packages/app-tests/e2e/test-delete-user.spec.ts @@ -1,6 +1,7 @@ -import { test } from '@playwright/test'; +import { expect, test } from '@playwright/test'; import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { getUserByEmail } from '@documenso/lib/server-only/user/get-user-by-email'; import { seedUser } from '@documenso/prisma/seed/users'; import { manualLogin } from './fixtures/authentication'; @@ -14,8 +15,11 @@ test('delete user', async ({ page }) => { redirectPath: '/settings', }); - await page.getByTestId('delete-account-button').click(); - await page.getByTestId('delete-account-confirmation-button').click(); + await page.getByRole('button', { name: 'Delete Account' }).click(); + await page.getByRole('button', { name: 'Confirm Deletion' }).click(); await page.waitForURL(`${WEBAPP_BASE_URL}/signin`); + + // Verify that the user no longer exists in the database + await expect(getUserByEmail({ email: user.email })).rejects.toThrow(); }); From 3b3346e6affed0d5a62a38e91119c5d7bc621ce4 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Fri, 8 Mar 2024 13:47:59 +1100 Subject: [PATCH 4/4] fix: remove data-testid attributes --- .../(dashboard)/settings/profile/delete-account-dialog.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx index 8663aeea6..e9cc885e9 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx @@ -78,9 +78,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp
- + @@ -112,7 +110,6 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp onClick={onDeleteAccount} loading={isDeletingAccount} variant="destructive" - data-testid="delete-account-confirmation-button" disabled={hasTwoFactorAuthentication} > {isDeletingAccount ? 'Deleting account...' : 'Confirm Deletion'}