From 75d95283a5169217c2a899605fbe245069ce6944 Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Mon, 2 Nov 2026 16:53:14 +0100 Subject: [PATCH 1/6] test(settings): cover changing the password Signed-off-by: Peter Ringelmann Assisted-by: ClaudeCode:claude-opus-5-5 --- .../playwright/e2e/settings/password.spec.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/playwright/e2e/settings/password.spec.ts diff --git a/tests/playwright/e2e/settings/password.spec.ts b/tests/playwright/e2e/settings/password.spec.ts new file mode 100644 index 0000000000000..e93fda52bdd28 --- /dev/null +++ b/tests/playwright/e2e/settings/password.spec.ts @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { login } from '@nextcloud/e2e-test-server/playwright' +import { expect, request } from '@playwright/test' +import { test } from '../../support/fixtures/personal-settings-page.ts' +import { getToast } from '../../support/utils/toast.ts' + +const newPassword = 'Another-Passw0rd-for-e2e!' + +test.describe('Settings: Change password', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/settings/user/security') + await expect(page.getByRole('heading', { name: 'Password', level: 2, exact: true })).toBeVisible() + }) + + test('changes the password', async ({ page, user, baseURL }) => { + await page.getByLabel('Current password').fill(user.password) + await page.getByLabel('New password').fill(newPassword) + await page.getByRole('button', { name: 'Change password' }).click() + + await expect(getToast(page, 'Saved')).toBeVisible() + await expect(page.getByLabel('Current password')).toHaveValue('') + await expect(page.getByLabel('New password')).toHaveValue('') + + const context = await request.newContext({ baseURL }) + await expect(login(context, user)).rejects.toThrow() + await login(context, { ...user, password: newPassword }) + await context.dispose() + }) + + test('rejects a wrong current password', async ({ page }) => { + await page.getByLabel('Current password').fill('not-my-password') + await page.getByLabel('New password').fill(newPassword) + await page.getByRole('button', { name: 'Change password' }).click() + + await expect(getToast(page, 'Wrong password')).toBeVisible() + }) +}) From b4c60b560023d38309ab2a05af46639d5dcd5a6e Mon Sep 17 00:00:00 2001 From: Peter Ringelmann Date: Mon, 2 Nov 2026 16:53:30 +0100 Subject: [PATCH 2/6] refactor(settings): migrate password, WebAuthn and language sections to Vue 3 Signed-off-by: Peter Ringelmann Assisted-by: ClaudeCode:claude-opus-5-5 --- .../LanguageLocaleSettings.vue | 8 +-- .../components/FirstDayOfWeekSection.spec.ts | 58 +++++++++++++++++++ .../components}/FirstDayOfWeekSection.vue | 30 +++++++--- .../components}/LanguageSection.vue | 10 ++-- .../components}/LanguageSectionEntry.vue | 17 +++--- .../components}/LocaleSection.vue | 10 ++-- .../components}/LocaleSectionEntry.vue | 42 +++++++++----- .../components}/TimezoneSection.vue | 4 +- apps/settings/src/language-locale/main.ts | 12 ++++ apps/settings/src/main-language-locale.js | 20 ------- apps/settings/src/main-personal-password.js | 19 ------ apps/settings/src/main-personal-webauth.js | 23 -------- .../PasswordSection.vue | 2 +- apps/settings/src/password/main.ts | 9 +++ .../components}/WebAuthnAddDevice.vue | 12 ++-- .../components}/WebAuthnDevice.vue | 4 +- .../components}/WebAuthnSection.vue | 8 +-- apps/settings/src/webauthn/main.ts | 17 ++++++ .../settings/personal/language.locale.php | 3 +- .../settings/personal/security/password.php | 3 +- .../settings/personal/security/webauthn.php | 5 +- build/frontend-legacy/eslint.config.mjs | 5 +- build/frontend-legacy/tsconfig.json | 2 +- build/frontend-legacy/vitest.config.mts | 7 ++- build/frontend-legacy/webpack.modules.cjs | 3 - build/frontend/package.json | 4 +- build/frontend/tsconfig.json | 2 +- build/frontend/vite.config.ts | 9 ++- build/frontend/vitest.config.ts | 6 ++ 29 files changed, 217 insertions(+), 137 deletions(-) rename apps/settings/src/{views => language-locale}/LanguageLocaleSettings.vue (64%) create mode 100644 apps/settings/src/language-locale/components/FirstDayOfWeekSection.spec.ts rename apps/settings/src/{components/PersonalInfo => language-locale/components}/FirstDayOfWeekSection.vue (75%) rename apps/settings/src/{components/PersonalInfo/LanguageSection => language-locale/components}/LanguageSection.vue (84%) rename apps/settings/src/{components/PersonalInfo/LanguageSection => language-locale/components}/LanguageSectionEntry.vue (85%) rename apps/settings/src/{components/PersonalInfo/LocaleSection => language-locale/components}/LocaleSection.vue (83%) rename apps/settings/src/{components/PersonalInfo/LocaleSection => language-locale/components}/LocaleSectionEntry.vue (71%) rename apps/settings/src/{components/PersonalInfo => language-locale/components}/TimezoneSection.vue (93%) create mode 100644 apps/settings/src/language-locale/main.ts delete mode 100644 apps/settings/src/main-language-locale.js delete mode 100644 apps/settings/src/main-personal-password.js delete mode 100644 apps/settings/src/main-personal-webauth.js rename apps/settings/src/{components => password}/PasswordSection.vue (98%) create mode 100644 apps/settings/src/password/main.ts rename apps/settings/src/{components/WebAuthn => webauthn/components}/WebAuthnAddDevice.vue (95%) rename apps/settings/src/{components/WebAuthn => webauthn/components}/WebAuthnDevice.vue (94%) rename apps/settings/src/{components/WebAuthn => webauthn/components}/WebAuthnSection.vue (95%) create mode 100644 apps/settings/src/webauthn/main.ts diff --git a/apps/settings/src/views/LanguageLocaleSettings.vue b/apps/settings/src/language-locale/LanguageLocaleSettings.vue similarity index 64% rename from apps/settings/src/views/LanguageLocaleSettings.vue rename to apps/settings/src/language-locale/LanguageLocaleSettings.vue index 27cee8021ecd0..e915a24d75614 100644 --- a/apps/settings/src/views/LanguageLocaleSettings.vue +++ b/apps/settings/src/language-locale/LanguageLocaleSettings.vue @@ -6,11 +6,11 @@