/** * URL 컨텍스트 + wikify 정본 포맷 — 순수 로직 테스트. */ import { extractUrlFromPrompt } from '../src/lib/contextBuilders/urlContext'; import { buildWikifyPrompt, type CanonicalWikiFormat } from '../src/features/datacollect/prompts/wikifyPrompt'; describe('extractUrlFromPrompt', () => { test('URL 추출 + 끝 구두점 제거', () => { expect(extractUrlFromPrompt('이 글 요약해줘 https://example.com/post.')).toBe('https://example.com/post'); expect(extractUrlFromPrompt('https://a.io/x?q=1 내용 확인')).toBe('https://a.io/x?q=1'); }); test('슬래시 명령은 제외 (/wikify 가 자체 처리)', () => { expect(extractUrlFromPrompt('/wikify https://example.com')).toBeNull(); }); test('URL 없으면 null', () => { expect(extractUrlFromPrompt('오늘 일정 알려줘')).toBeNull(); expect(extractUrlFromPrompt('')).toBeNull(); }); }); describe('buildWikifyPrompt — 정본/fallback 포맷', () => { const extracted = { url: 'https://ex.com/doc', title: '문서', text: '본문 내용입니다. '.repeat(10), headings: ['h1'] }; test('정본 주입 시 placeholder 가 채워진다', () => { const canonical: CanonicalWikiFormat = { version: '9.9', commonRules: '\n7. 규칙 루트={{ROOT}}', frontmatter: '---\nid: {{ID}}\ntitle: "{{TITLE}}"\ntags: [{{TAGS}}]\nraw_sources: {{SOURCES}}\n---', sections: '# [[{{TOPIC}}]]\n- {{TODAY}}: {{ORIGIN}}', }; const p = buildWikifyPrompt(extracted, '테스트 주제', canonical); expect(p).toContain('P-Reinforce v9.9'); expect(p).toContain('규칙 루트=테스트 주제'); expect(p).toContain('title: "테스트 주제"'); expect(p).toContain('raw_sources: ["https://ex.com/doc"]'); expect(p).not.toContain('{{'); // placeholder 잔존 금지 }); test('정본 없으면 내장 사본 — 현대화 항목 포함', () => { const p = buildWikifyPrompt(extracted, '주제', null); expect(p).toContain('category는 폴더경로 말고 논리 도메인'); // 물리 경로 버그 수정 expect(p).toContain("aliases'에 동의어"); // 별칭 강제 expect(p).toContain('지식 충돌 시 우선순위 판단'); // 동적 신뢰도 — 충돌 권고 입력 expect(p).toContain('## 🔗 지식 그래프'); // 섹션명 통일 (구 "관련 문서 링크" 대체) expect(p).not.toContain('category: "10_Wiki/Topics"'); expect(p).not.toContain('{{'); }); });