/** * v2.2.273 — 지식 문서 로컬 저장 (순수 로직: 파일명 안전화 + 저장 폴더 우선순위). */ import * as path from 'path'; import { sanitizeWikiFileName, pickWikiDir } from '../src/features/datacollect/wikiSave'; describe('sanitizeWikiFileName', () => { test('금지 문자 치환 + .md 보장', () => { const f = sanitizeWikiFileName('회의록 a/b:c*d?eg|h 2026-07-03'); expect(f).not.toMatch(/[\\/:*?"<>|]/); expect(f.endsWith('.md')).toBe(true); expect(f).toContain('회의록'); }); test('빈 제목 → untitled, 120자 캡', () => { expect(sanitizeWikiFileName('')).toMatch(/^untitled_\d+\.md$/); expect(sanitizeWikiFileName('가'.repeat(300)).length).toBeLessThanOrEqual(124); }); test('.md 중복 방지', () => { expect(sanitizeWikiFileName('문서.md')).toBe('문서.md'); }); }); describe('pickWikiDir — 저장 폴더 우선순위', () => { const abs = path.resolve('E:/커스텀/위키'); test('① 설정 절대경로 최우선', () => { const r = pickWikiDir(abs, 'E:/brain', 'E:/ws'); expect(r).toEqual({ dir: abs, label: '설정 폴더' }); }); test('② 설정 없으면 두뇌/Datacollect_Wiki', () => { const r = pickWikiDir('', 'E:/brain', 'E:/ws'); expect(r!.label).toBe('두뇌'); expect(r!.dir).toBe(path.join('E:/brain', 'Datacollect_Wiki')); }); test('③ 두뇌 없으면 워크스페이스/.astra/wiki', () => { const r = pickWikiDir('', '', 'E:/ws'); expect(r!.label).toBe('워크스페이스'); expect(r!.dir).toBe(path.join('E:/ws', '.astra', 'wiki')); }); test('[v2.2.304] 상대경로 설정은 두뇌 루트 기준으로 해석 (이식성)', () => { const r = pickWikiDir('상대/경로', '/brain', null); expect(r!.label).toBe('설정 폴더(두뇌 기준)'); expect(r!.dir.replace(/\\/g, '/')).toContain('/brain/상대/경로'); }); test('[v2.2.304] ../ 상대경로로 두뇌 밖 형제 폴더도 지정 가능', () => { const r = pickWikiDir('../../Premium/자료', '/Wiki/10_Wiki/Topics', null); expect(r!.dir.replace(/\\/g, '/')).toBe('/Wiki/Premium/자료'); }); test('상대경로인데 두뇌도 없으면 다음 후보(워크스페이스)로', () => { const r = pickWikiDir('상대/경로', '', '/ws'); expect(r!.label).toBe('워크스페이스'); }); test('④ 전부 없으면 null', () => { expect(pickWikiDir('', '', null)).toBeNull(); }); }); describe('pickWikiDir — 이메일 지식 문서 별도 관리 (kind=email)', () => { test('기본 폴더가 Email_Wiki 로 분리 — 일반(Datacollect_Wiki)과 다름', () => { const email = pickWikiDir('', 'E:/brain', 'E:/ws', 'email'); const general = pickWikiDir('', 'E:/brain', 'E:/ws', 'general'); expect(email!.dir).toBe(path.join('E:/brain', 'Email_Wiki')); expect(general!.dir).toBe(path.join('E:/brain', 'Datacollect_Wiki')); expect(email!.dir).not.toBe(general!.dir); }); test('이메일 전용 설정 경로가 최우선', () => { const abs = path.resolve('E:/이메일위키'); const r = pickWikiDir(abs, 'E:/brain', 'E:/ws', 'email'); expect(r).toEqual({ dir: abs, label: '설정 폴더' }); }); test('두뇌 없으면 워크스페이스 .astra/wiki/email', () => { const r = pickWikiDir('', '', 'E:/ws', 'email'); expect(r!.dir).toBe(path.join('E:/ws', '.astra', 'wiki', 'email')); }); });