test: add vault.ts normalizeVaultPath and folderPathsForTarget tests

Cover normalizeVaultPath with clean paths, whitespace trimming, parent
traversal stripping, dot segments, null input, and empty segments.
Test folderPathsForTarget ancestor chain generation for various depths.

Change-Id: I4de1744301df1e42d35f0bd5702d5cc58fb9a277
This commit is contained in:
fancivez 2026-04-27 13:23:21 +08:00 committed by wujunchen
parent d6b89924f2
commit 3a2c4e6a1c

View file

@ -41,6 +41,7 @@ async function requireBundledModule(relativePath) {
const providerParsers = await requireBundledModule('src/provider-parsers.ts');
const settings = await requireBundledModule('src/settings.ts');
const streaming = await requireBundledModule('src/streaming.ts');
const vault = await requireBundledModule('src/vault.ts');
const cacheEntry = { generatedAt: '2024-01-01T00:00:00.000Z' };
const touched = cache.touchCacheEntry(cacheEntry, '2024-06-01T00:00:00.000Z');
@ -364,6 +365,22 @@ async function requireBundledModule(relativePath) {
assert.strictEqual(anthropicSettings.model, 'claude-sonnet-4-6', 'applyApiProviderPreset does not mutate input');
assert.strictEqual(anthropicSettings.apiProvider, 'anthropic', 'original provider unchanged');
// --- vault.ts: normalizeVaultPath and folderPathsForTarget ---
assert.strictEqual(vault.normalizeVaultPath('Reading/Articles'), 'Reading/Articles', 'normalizeVaultPath clean path unchanged');
assert.strictEqual(vault.normalizeVaultPath(' Reading / Articles '), 'Reading/Articles', 'normalizeVaultPath trims parts');
assert.strictEqual(vault.normalizeVaultPath('../bad/../path'), 'bad/path', 'normalizeVaultPath strips .. segments');
assert.strictEqual(vault.normalizeVaultPath('./relative/./path'), 'relative/path', 'normalizeVaultPath strips . segments');
assert.strictEqual(vault.normalizeVaultPath(''), '', 'normalizeVaultPath handles empty string');
assert.strictEqual(vault.normalizeVaultPath(null), '', 'normalizeVaultPath handles null');
assert.strictEqual(vault.normalizeVaultPath('single'), 'single', 'normalizeVaultPath handles single segment');
assert.strictEqual(vault.normalizeVaultPath('a//b///c'), 'a/b/c', 'normalizeVaultPath collapses empty segments');
assert.deepStrictEqual(vault.folderPathsForTarget('Reading/Articles'), ['Reading', 'Reading/Articles'], 'folderPathsForTarget returns ancestor chain');
assert.deepStrictEqual(vault.folderPathsForTarget('a/b/c'), ['a', 'a/b', 'a/b/c'], 'folderPathsForTarget 3-deep path');
assert.deepStrictEqual(vault.folderPathsForTarget('single'), ['single'], 'folderPathsForTarget single segment');
assert.deepStrictEqual(vault.folderPathsForTarget(''), [], 'folderPathsForTarget empty returns empty');
assert.deepStrictEqual(vault.folderPathsForTarget('../..'), [], 'folderPathsForTarget invalid path returns empty');
// --- i18n.ts: translate and resolveUiLanguage ---
// translate with explicit language
assert.strictEqual(i18n.translate({ uiLanguage: 'en' }, 'displayName'), 'Parallel Reader', 'translate returns en string');