char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Aleksander Grygierui: Linting & Formatting scripts (#26819)92d1bb0c9

char/aliceai-t5-moe
5.0 KiB163 linesraw
1import { CONFIG_LOCALSTORAGE_KEY, STORAGE_APP_NAME } from '$lib/constants';
2import { afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest';
3
4// node env unit project has no DOM, install a minimal localStorage backed by a Map
5beforeAll(() => {
6	const store = new Map<string, string>();
7	const polyfill: Storage = {
8		clear: () => store.clear(),
9		getItem: (k) => (store.has(k) ? store.get(k)! : null),
10		key: (i) => Array.from(store.keys())[i] ?? null,
11		get length() {
12			return store.size;
13		},
14		removeItem: (k) => {
15			store.delete(k);
16		},
17		setItem: (k, v) => {
18			store.set(k, String(v));
19		}
20	};
21
22	(globalThis as unknown as { localStorage: Storage }).localStorage = polyfill;
23});
24
25/**
26 * Migration `mcp-default-overrides-merge-v1` folds the values of the parallel
27 * `mcpDefaultServerOverrides` config entry onto `mcpServers[i].enabled` (the
28 * single source of truth for new-chat defaults). The legacy key is kept on
29 * disk for downgrade compatibility.
30 */
31describe('mcp-default-overrides-merge-v1 migration', () => {
32	const MIGRATION_STATE_KEY = `${STORAGE_APP_NAME}.migration-state`;
33	const MCP_DEFAULT_OVERRIDES_KEY = `${STORAGE_APP_NAME}.mcpDefaultServerOverrides`;
34
35	beforeEach(async () => {
36		localStorage.clear();
37		// Reset the migration run counter so `runAllMigrations` is guaranteed to execute.
38		await import('$lib/services/migration.service').then((mod) =>
39			mod.MigrationService.resetState()
40		);
41	});
42
43	afterEach(() => {
44		localStorage.clear();
45	});
46
47	async function runMigrations() {
48		const { MigrationService } = await import('$lib/services/migration.service');
49
50		await MigrationService.runAllMigrations();
51	}
52
53	function readConfig(): Record<string, unknown> {
54		const raw = localStorage.getItem(CONFIG_LOCALSTORAGE_KEY);
55
56		return raw ? (JSON.parse(raw) as Record<string, unknown>) : {};
57	}
58
59	function writeConfig(config: Record<string, unknown>) {
60		localStorage.setItem(CONFIG_LOCALSTORAGE_KEY, JSON.stringify(config));
61	}
62
63	it('applies matching overrides onto mcpServers[i].enabled and preserves the legacy key', async () => {
64		writeConfig({
65			[MCP_DEFAULT_OVERRIDES_KEY]: JSON.stringify([
66				{ enabled: true, serverId: 'exa' },
67				{ enabled: false, serverId: 'hf' }
68			]),
69			mcpServers: JSON.stringify([
70				{ enabled: false, id: 'exa', url: 'https://mcp.exa.ai/mcp' },
71				{ enabled: false, id: 'hf', url: 'https://huggingface.co/mcp' }
72			])
73		});
74
75		await runMigrations();
76
77		const after = readConfig();
78		const servers = JSON.parse(after.mcpServers as string) as Array<{
79			id: string;
80			enabled: boolean;
81		}>;
82
83		expect(servers.find((s) => s.id === 'exa')?.enabled).toBe(true);
84		expect(servers.find((s) => s.id === 'hf')?.enabled).toBe(false);
85		expect(MCP_DEFAULT_OVERRIDES_KEY in after).toBe(true);
86	});
87
88	it('skips override ids that do not match any configured server', async () => {
89		writeConfig({
90			[MCP_DEFAULT_OVERRIDES_KEY]: JSON.stringify([
91				{ enabled: true, serverId: 'orphan' },
92				{ enabled: true, serverId: 'exa' }
93			]),
94			mcpServers: JSON.stringify([{ enabled: false, id: 'exa', url: 'https://mcp.exa.ai/mcp' }])
95		});
96
97		await runMigrations();
98
99		const after = readConfig();
100		const servers = JSON.parse(after.mcpServers as string) as Array<{
101			id: string;
102			enabled: boolean;
103		}>;
104
105		expect(servers).toHaveLength(1);
106		expect(servers[0].enabled).toBe(true);
107		expect(MCP_DEFAULT_OVERRIDES_KEY in after).toBe(true);
108	});
109
110	it('is a no-op when there are no legacy overrides', async () => {
111		writeConfig({
112			mcpServers: JSON.stringify([{ enabled: true, id: 'exa', url: 'https://mcp.exa.ai/mcp' }])
113		});
114
115		await runMigrations();
116
117		const after = readConfig();
118		const servers = JSON.parse(after.mcpServers as string) as Array<{
119			id: string;
120			enabled: boolean;
121		}>;
122
123		expect(servers[0].enabled).toBe(true);
124		expect(MCP_DEFAULT_OVERRIDES_KEY in after).toBe(false);
125	});
126
127	it('does not rewrite mcpServers when override.enabled already matches', async () => {
128		const originalServers = JSON.stringify([
129			{ enabled: true, id: 'exa', url: 'https://mcp.exa.ai/mcp' }
130		]);
131
132		writeConfig({
133			[MCP_DEFAULT_OVERRIDES_KEY]: JSON.stringify([{ enabled: true, serverId: 'exa' }]),
134			mcpServers: originalServers
135		});
136
137		await runMigrations();
138
139		const after = readConfig();
140
141		expect(after.mcpServers).toBe(originalServers);
142		expect(MCP_DEFAULT_OVERRIDES_KEY in after).toBe(true);
143	});
144
145	it('records itself as completed so subsequent loads do not re-run', async () => {
146		writeConfig({
147			[MCP_DEFAULT_OVERRIDES_KEY]: JSON.stringify([{ enabled: true, serverId: 'exa' }]),
148			mcpServers: JSON.stringify([{ enabled: false, id: 'exa', url: 'https://mcp.exa.ai/mcp' }])
149		});
150
151		const { MigrationService } = await import('$lib/services/migration.service');
152
153		await MigrationService.runAllMigrations();
154
155		const stateRaw = localStorage.getItem(MIGRATION_STATE_KEY);
156
157		expect(stateRaw).not.toBeNull();
158		const state = JSON.parse(stateRaw!) as { completed: string[]; failed: string[] };
159
160		expect(state.completed).toContain('mcp-default-overrides-merge-v1');
161		expect(state.failed).not.toContain('mcp-default-overrides-merge-v1');
162	});
163});