fix(settings): omit leading/trailing and consecuting dots in noralizePagePath

This commit is contained in:
2026-07-28 20:10:20 +02:00
parent c2402f9360
commit d3f3ef37ed
2 changed files with 30 additions and 4 deletions
@@ -26,11 +26,34 @@ vi.mock('vue-router', () => ({
describe('useSettingsPage', () => { describe('useSettingsPage', () => {
describe('goToSettingsPage', () => { 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(); const { goToSettingsPage } = useSettingsPage();
await goToSettingsPage('a.b.c'); await goToSettingsPage(settingsPath);
expect(pushRoute).toHaveBeenCalledWith('/settings/a/b/c'); expect(pushRoute).toHaveBeenCalledWith(expectedRoute);
pushRoute.mockClear();
}); });
}); });
}); });
@@ -17,7 +17,10 @@ limitations under the License.
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
const normalizePagePath = function normalizePagePath (path) { const normalizePagePath = function normalizePagePath (path) {
return path.replaceAll('.', '/'); return path
.replace(/\.+/g, '.')
.replace(/^\.+|\.+$/g, '')
.replaceAll('.', '/');
}; };
export const useSettingsPage = function useSettingsPage () { export const useSettingsPage = function useSettingsPage () {