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, }); });