From d3f3ef37edc7fd9aa87f0ed500ce5529429f5c3e Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Sun, 26 Jul 2026 19:04:59 +0200 Subject: [PATCH] fix(settings): omit leading/trailing and consecuting dots in noralizePagePath --- .../__tests__/useSettingsPage.test.js | 29 +++++++++++++++++-- .../settings/composables/useSettingsPage.js | 5 +++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/features/settings/composables/__tests__/useSettingsPage.test.js b/src/features/settings/composables/__tests__/useSettingsPage.test.js index e790d9a..91401e7 100644 --- a/src/features/settings/composables/__tests__/useSettingsPage.test.js +++ b/src/features/settings/composables/__tests__/useSettingsPage.test.js @@ -26,11 +26,34 @@ vi.mock('vue-router', () => ({ describe('useSettingsPage', () => { describe('goToSettingsPage', () => { - test('goes to correct route', async () => { + test.for([ + { settingsPath: 'a.b.c', expectedRoute: '/settings/a/b/c' }, + { settingsPath: 'a', expectedRoute: '/settings/a' }, + { settingsPath: 'a.b', expectedRoute: '/settings/a/b' }, + { settingsPath: 'a..b', expectedRoute: '/settings/a/b' }, + { settingsPath: '.a.b', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a.b', expectedRoute: '/settings/a/b' }, + { settingsPath: '.a.b.', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a.b..', expectedRoute: '/settings/a/b' }, + { settingsPath: 'a.b.', expectedRoute: '/settings/a/b' }, + { settingsPath: 'a.b..', expectedRoute: '/settings/a/b' }, + { settingsPath: '.a.b..', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a.b.', expectedRoute: '/settings/a/b' }, + { settingsPath: '.a..b', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a..b', expectedRoute: '/settings/a/b' }, + { settingsPath: '.a..b.', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a..b..', expectedRoute: '/settings/a/b' }, + { settingsPath: 'a..b.', expectedRoute: '/settings/a/b' }, + { settingsPath: 'a..b..', expectedRoute: '/settings/a/b' }, + { settingsPath: '.a..b..', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a..b.', expectedRoute: '/settings/a/b' }, + { settingsPath: '..a.....b.c..d....', expectedRoute: '/settings/a/b/c/d' } + ])('goes to correct route', async ({ settingsPath, expectedRoute }) => { const { goToSettingsPage } = useSettingsPage(); - await goToSettingsPage('a.b.c'); - expect(pushRoute).toHaveBeenCalledWith('/settings/a/b/c'); + await goToSettingsPage(settingsPath); + expect(pushRoute).toHaveBeenCalledWith(expectedRoute); + pushRoute.mockClear(); }); }); }); \ No newline at end of file diff --git a/src/features/settings/composables/useSettingsPage.js b/src/features/settings/composables/useSettingsPage.js index af0da5a..2205c0c 100644 --- a/src/features/settings/composables/useSettingsPage.js +++ b/src/features/settings/composables/useSettingsPage.js @@ -17,7 +17,10 @@ limitations under the License. import { useRouter } from 'vue-router'; const normalizePagePath = function normalizePagePath (path) { - return path.replaceAll('.', '/'); + return path + .replace(/\.+/g, '.') + .replace(/^\.+|\.+$/g, '') + .replaceAll('.', '/'); }; export const useSettingsPage = function useSettingsPage () {