| import test from 'node:test'; |
| import assert from 'node:assert/strict'; |
|
|
| import * as hashRouteTabs from '../src/utils/hashRouteTabs.mjs'; |
| import { EXTENSION_ROUTE_NAME } from '../src/router/routeConstants.mjs'; |
|
|
| const { createTabRouteLocation, getValidHashTab } = hashRouteTabs; |
|
|
| test('getValidHashTab returns the tab name for a valid route hash', () => { |
| const validTabs = ['installed', 'market', 'mcp']; |
|
|
| assert.equal(getValidHashTab('#market', validTabs), 'market'); |
| }); |
|
|
| test('getValidHashTab rejects empty and unknown hashes', () => { |
| const validTabs = ['installed', 'market', 'mcp']; |
|
|
| assert.equal(getValidHashTab('', validTabs), null); |
| assert.equal(getValidHashTab('#unknown', validTabs), null); |
| }); |
|
|
| test('getValidHashTab uses the last hash segment when multiple hashes are present', () => { |
| const validTabs = ['installed', 'market', 'mcp']; |
|
|
| assert.equal(getValidHashTab('#/extension#foo#installed', validTabs), 'installed'); |
| }); |
|
|
| test('createTabRouteLocation preserves the current path and query', () => { |
| const query = { open_config: 'sample-plugin', page: '2' }; |
| const location = createTabRouteLocation( |
| { |
| path: '/extension', |
| query, |
| }, |
| 'market', |
| ); |
|
|
| assert.deepEqual(location, { |
| path: '/extension', |
| query: { open_config: 'sample-plugin', page: '2' }, |
| hash: '#market', |
| }); |
| assert.notEqual(location.query, query); |
| }); |
|
|
| test('createTabRouteLocation falls back to the extension route name', () => { |
| const location = createTabRouteLocation(undefined, 'installed'); |
|
|
| assert.deepEqual(location, { |
| name: EXTENSION_ROUTE_NAME, |
| query: {}, |
| hash: '#installed', |
| }); |
| }); |
|
|
| test('createTabRouteLocation prefers route name and preserves params', () => { |
| const params = { pluginId: 'demo-plugin' }; |
| const location = createTabRouteLocation( |
| { |
| name: 'ExtensionDetails', |
| path: '/extension/demo-plugin', |
| params, |
| query: { tab: 'details' }, |
| }, |
| 'market', |
| ); |
|
|
| assert.deepEqual(location, { |
| name: 'ExtensionDetails', |
| params: { pluginId: 'demo-plugin' }, |
| query: { tab: 'details' }, |
| hash: '#market', |
| }); |
| assert.notEqual(location.params, params); |
| }); |
|
|
| test('createTabRouteLocation omits params for path-based routes', () => { |
| const params = { pluginId: 'demo-plugin' }; |
| const location = createTabRouteLocation( |
| { |
| path: '/extension/demo-plugin', |
| params, |
| }, |
| 'installed', |
| ); |
|
|
| assert.deepEqual(location, { |
| path: '/extension/demo-plugin', |
| query: {}, |
| hash: '#installed', |
| }); |
| assert.equal(location.params, undefined); |
| }); |
|
|
| test('replaceTabRoute catches rejected router updates', async () => { |
| assert.equal(typeof hashRouteTabs.replaceTabRoute, 'function'); |
|
|
| const error = new Error('blocked'); |
| let logged; |
| const router = { |
| replace: async () => { |
| throw error; |
| }, |
| }; |
| const logger = { |
| warn: (message, cause) => { |
| logged = { message, cause }; |
| }, |
| }; |
|
|
| const result = await hashRouteTabs.replaceTabRoute( |
| router, |
| { name: EXTENSION_ROUTE_NAME, query: { page: '1' } }, |
| 'installed', |
| logger, |
| ); |
|
|
| assert.equal(result, false); |
| assert.deepEqual(logged, { |
| message: 'Failed to update extension tab route:', |
| cause: error, |
| }); |
| }); |
|
|