2 changed files with 132 additions and 1 deletions
@ -0,0 +1,131 @@ |
|||||
|
import { test, expect, type Page, type TestInfo, Test } from '@playwright/test'; |
||||
|
import { MailDev } from 'maildev'; |
||||
|
|
||||
|
import * as utils from "../global-utils"; |
||||
|
import { createAccount, logUser } from './setups/user'; |
||||
|
import { activateTOTP } from './setups/2fa'; |
||||
|
|
||||
|
let users = utils.loadEnv(); |
||||
|
let mailserver; |
||||
|
|
||||
|
test.beforeAll('Setup', async ({ browser }, testInfo: TestInfo) => { |
||||
|
mailserver = new MailDev({ |
||||
|
port: process.env.MAILDEV_SMTP_PORT, |
||||
|
web: { port: process.env.MAILDEV_HTTP_PORT }, |
||||
|
}) |
||||
|
|
||||
|
await mailserver.listen(); |
||||
|
|
||||
|
await utils.startVault(browser, testInfo, { |
||||
|
SMTP_HOST: process.env.MAILDEV_HOST, |
||||
|
SMTP_FROM: process.env.PW_SMTP_FROM, |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
test.afterAll('Teardown', async ({}) => { |
||||
|
utils.stopVault(); |
||||
|
if( mailserver ){ |
||||
|
await mailserver.close(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
async function emergencyAccess(test: Test, page: Page, user: { name: string }) { |
||||
|
await test.step('Navigate', async () => { |
||||
|
await page.getByRole('button', { name: user.name }).click(); |
||||
|
await page.getByRole('menuitem', { name: 'Account settings' }).click(); |
||||
|
await page.getByRole('link', { name: 'Emergency access' }).click(); |
||||
|
await expect(page.locator('#main-content').getByText('Emergency access', { exact: true })).toBeVisible(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
test('Emergency access', async ({ browser, page }) => { |
||||
|
const context2 = await browser.newContext(); |
||||
|
const page2 = await context2.newPage(); |
||||
|
|
||||
|
const mailBuffer = mailserver.buffer(users.user1.email); |
||||
|
const mailBuffer2 = mailserver.buffer(users.user2.email); |
||||
|
|
||||
|
await createAccount(test, page, users.user1); |
||||
|
await createAccount(test, page2, users.user2); |
||||
|
|
||||
|
await test.step('Add test2', async () => { |
||||
|
await emergencyAccess(test, page, users.user1); |
||||
|
await page.getByRole('button', { name: 'Add emergency contact' }).click(); |
||||
|
await page.getByRole('textbox', { name: 'Email * (required)' }).fill(users.user2.email); |
||||
|
await page.getByRole('radio', { name: 'Takeover Can reset your' }).check(); |
||||
|
await page.getByRole('button', { name: 'Save' }).click(); |
||||
|
await utils.checkNotification(page, 'User(s) invited'); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Accept', async () => { |
||||
|
const email = await mailBuffer2.expect((m) => m.subject === "Emergency access for " + users.user1.name); |
||||
|
const pageE = await context2.newPage(); |
||||
|
await pageE.setContent(email.html); |
||||
|
const link = await pageE.getByTestId("emergency").getAttribute("href"); |
||||
|
await pageE.close(); |
||||
|
|
||||
|
await page2.goto(link); |
||||
|
await utils.checkNotification(page2, 'Invitation accepted'); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Confirm', async () => { |
||||
|
await emergencyAccess(test, page, users.user1); |
||||
|
await expect(page.locator('#main-content').getByText('Needs confirmation')).toBeVisible(); |
||||
|
await page.getByRole('button', { name: 'Options' }).click(); |
||||
|
await page.getByRole('menuitem', { name: 'Confirm' }).click(); |
||||
|
await page.getByRole('button', { name: 'Confirm' }).click(); |
||||
|
await utils.checkNotification(page, users.user2.name + ' confirmed'); |
||||
|
await mailBuffer2.expect((m) => m.subject === "Emergency access contact for " + users.user1.name + " confirmed"); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Request', async () => { |
||||
|
await emergencyAccess(test, page2, users.user2); |
||||
|
await page2.getByRole('button', { name: 'Options' }).click(); |
||||
|
await page2.getByRole('menuitem', { name: 'Request Access' }).click(); |
||||
|
await page2.getByRole('button', { name: 'Request Access' }).click(); |
||||
|
await utils.checkNotification(page2, 'Emergency access requested'); |
||||
|
await mailBuffer.expect((m) => m.subject === "Emergency access request by " + users.user2.name + " initiated"); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Approved', async () => { |
||||
|
await emergencyAccess(test, page, users.user1); |
||||
|
await page.getByRole('button', { name: 'Options' }).click(); |
||||
|
await page.getByRole('menuitem', { name: 'Approve' }).click(); |
||||
|
await page.getByRole('button', { name: 'Approve' }).click(); |
||||
|
await utils.checkNotification(page, 'Emergency access approved'); |
||||
|
await mailBuffer2.expect((m) => m.subject === "Emergency access request for " + users.user1.name + " approved"); |
||||
|
}); |
||||
|
await activateTOTP(test, page, users.user1); |
||||
|
|
||||
|
let newPassword = "TotoNewPassword"; |
||||
|
await test.step('Access', async () => { |
||||
|
await emergencyAccess(test, page2, users.user2); |
||||
|
await page2.getByRole('button', { name: 'Options' }).click(); |
||||
|
await page2.getByRole('menuitem', { name: 'Takeover' }).click(); |
||||
|
await page2.getByRole('textbox', { name: 'New master password * (required)', exact: true }).fill(newPassword); |
||||
|
await page2.getByRole('textbox', { name: 'Confirm new master password' }).fill(newPassword); |
||||
|
await page2.getByRole('button', { name: 'Save' }).click(); |
||||
|
await utils.checkNotification(page2, 'Password reset for ' + users.user1.name); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Changed no 2fa', async () => { |
||||
|
users.user1.password = newPassword; |
||||
|
await logUser(test, page, users.user1); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Reject', async () => { |
||||
|
await emergencyAccess(test, page, users.user1); |
||||
|
await page.getByRole('button', { name: 'Options' }).click(); |
||||
|
await page.getByRole('menuitem', { name: 'Reject' }).click(); |
||||
|
await utils.checkNotification(page, 'Emergency access rejected'); |
||||
|
await mailBuffer2.expect((m) => m.subject === "Emergency access request to " + users.user1.name + " rejected"); |
||||
|
}); |
||||
|
|
||||
|
await test.step('Remove', async () => { |
||||
|
await page.getByRole('button', { name: 'Options' }).click(); |
||||
|
await page.getByRole('menuitem', { name: 'Remove' }).click(); |
||||
|
await page.getByRole('button', { name: 'Yes' }).click(); |
||||
|
await utils.checkNotification(page, 'Removed user ' + users.user2.name); |
||||
|
await expect(page.getByText('You have not added any emergency contacts')).toBeVisible(); |
||||
|
}); |
||||
|
}); |
||||
Loading…
Reference in new issue