File size: 3,254 Bytes
8ede856
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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,
  });
});