diff --git a/e2e/tests/auth.spec.ts b/e2e/tests/auth.spec.ts index 39f98110fc..ae6fc9ce3b 100644 --- a/e2e/tests/auth.spec.ts +++ b/e2e/tests/auth.spec.ts @@ -5,7 +5,9 @@ import { defaultUserAdmin, routes } from '../config'; import { acceptRecovery } from '../utils/controllers/acceptRecovery'; import { createUser } from '../utils/controllers/createUser'; import { loginBasic, loginRecoveryCodes, loginTOTP } from '../utils/controllers/login'; +import { logout } from '../utils/controllers/logout'; import { enableTOTP } from '../utils/controllers/mfa/enableTOTP'; +import { changePassword, changePasswordByAdmin } from '../utils/controllers/profile'; import { dockerRestart } from '../utils/docker'; import { waitForBase } from '../utils/waitForBase'; import { waitForRoute } from '../utils/waitForRoute'; @@ -74,3 +76,27 @@ test('Add user to admin group', async ({ page, context }) => { await waitForRoute(page, routes.admin.wizard); expect(page.url()).toBe(routes.base + routes.admin.wizard); }); + +test('Change user password', async ({ page, context }) => { + await waitForBase(page); + const testUser = await createUser(context, faker.person.firstName().toLowerCase()); + await loginBasic(page, testUser); + testUser.password = await changePassword(page, testUser.password); + await logout(page); + await loginBasic(page, testUser); + await waitForRoute(page, routes.me); + expect(page.url()).toBe(routes.base + routes.me); +}); + +test('Change user password by admin', async ({ page, context }) => { + await waitForBase(page); + const testUser = await createUser(context, faker.person.firstName().toLowerCase()); + await loginBasic(page, defaultUserAdmin); + await page.goto(routes.base + routes.admin.users); + await page.getByText(testUser.username).click(); + testUser.password = await changePasswordByAdmin(page); + await logout(page); + await loginBasic(page, testUser); + await waitForRoute(page, routes.me); + expect(page.url()).toBe(routes.base + routes.me); +}); diff --git a/e2e/utils/controllers/profile.ts b/e2e/utils/controllers/profile.ts new file mode 100644 index 0000000000..e3e00e60aa --- /dev/null +++ b/e2e/utils/controllers/profile.ts @@ -0,0 +1,31 @@ +import { Page } from 'playwright'; + +import { routes } from '../../config'; + +export const changePassword = async (page: Page, currentPassword: string) => { + await page.goto(routes.base + routes.me); + await page.getByTestId('edit-user').click(); + await page.getByTestId('button-change-password').click(); + const formElement = page.getByTestId('change-self-password-form'); + await formElement.waitFor({ state: 'visible' }); + await formElement.getByTestId('field-old_password').type(currentPassword); + const newPassword = 'Test1234#$%'; + await formElement.getByTestId('field-new_password').type(newPassword); + await formElement.getByTestId('field-repeat').type(newPassword); + await formElement.locator('button[type="submit"]').click(); + await formElement.waitFor({ state: 'hidden', timeout: 2000 }); + return newPassword; +}; + +export const changePasswordByAdmin = async (page: Page) => { + await page.getByTestId('edit-user').click(); + await page.getByTestId('button-change-password').click(); + const formElement = page.getByTestId('change-password-admin-form'); + await formElement.waitFor({ state: 'visible' }); + const newPassword = 'Test1234#$%'; + await formElement.getByTestId('field-new_password').type(newPassword); + await formElement.getByTestId('field-repeat').type(newPassword); + await formElement.locator('button[type="submit"]').click(); + await formElement.waitFor({ state: 'hidden', timeout: 2000 }); + return newPassword; +}; diff --git a/web/src/pages/users/UserProfile/UserAuthInfo/UserAuthInfoPassword.tsx b/web/src/pages/users/UserProfile/UserAuthInfo/UserAuthInfoPassword.tsx index 82e8959ad4..8997f7b8cb 100644 --- a/web/src/pages/users/UserProfile/UserAuthInfo/UserAuthInfoPassword.tsx +++ b/web/src/pages/users/UserProfile/UserAuthInfo/UserAuthInfoPassword.tsx @@ -30,6 +30,7 @@ export const UserAuthInfoPassword = () => {