import { buildLayoutSkeleton, classifyWidget } from '../src/features/datacollect/prompts/layoutSkeleton'; const SCAN = { structure: { sections: [ { role: 'header', depth: 0, text: '메뉴', btns: 1, links: 8, imgs: 1, hint: 'site-header' }, { role: 'section', depth: 1, text: '최신 글', btns: 0, links: 12, imgs: 10, hint: 'swiper-container hero-slider' }, { role: 'section', depth: 1, text: '카테고리 글 목록', btns: 2, links: 20, imgs: 30, hint: 'post-grid archive' }, { role: 'footer', depth: 0, text: '저작권', btns: 0, links: 4, imgs: 0, hint: 'site-footer' }, ], }, sitemap: { pages: [ { url: 'https://koritips.com/', role: 'other', primaryContentType: 'list-article', sectionRoles: [] }, { url: 'https://koritips.com/about', role: 'about', primaryContentType: 'list-card', sectionRoles: [ { tag: 'header', hint: 'gnb', preview: '메뉴' }, { tag: 'main', hint: 'about-content', preview: '소개 본문' }, { tag: 'form', hint: 'newsletter-signup', preview: '구독하기' }, ], }, ], }, }; describe('classifyWidget — class/id 신호 위젯 판별', () => { test('캐러셀 계열 class 를 롤링 배너로 감지', () => { expect(classifyWidget('swiper-container hero-slider')).toContain('캐러셀'); expect(classifyWidget('slick-track')).toContain('캐러셀'); }); test('내비/푸터/구독 신호 판별', () => { expect(classifyWidget('site-header gnb')).toContain('내비게이션'); expect(classifyWidget('newsletter-signup')).toContain('구독'); }); test('신호 없으면 null', () => { expect(classifyWidget('random-xyz')).toBeNull(); expect(classifyWidget('')).toBeNull(); }); }); describe('buildLayoutSkeleton — 결정론 골격 리포트', () => { const md = buildLayoutSkeleton(SCAN); test('홈의 위→아래 블록 순서를 그린다 (헤더→캐러셀→그리드→푸터)', () => { const iHeader = md.indexOf('내비게이션'); const iCarousel = md.indexOf('캐러셀'); const iGrid = md.indexOf('카드/리스트 그리드'); const iFooter = md.indexOf('푸터'); expect(iHeader).toBeGreaterThan(-1); expect(iHeader).toBeLessThan(iCarousel); expect(iCarousel).toBeLessThan(iGrid); expect(iGrid).toBeLessThan(iFooter); }); test('롤링 배너 유무에 즉답한다', () => { expect(md).toContain('롤링 배너/캐러셀: **있음**'); }); test('하위 페이지 골격도 포함한다', () => { expect(md).toContain('`/about`'); expect(md).toContain('구독/CTA'); }); test('버튼/이미지/링크 수를 표기한다', () => { expect(md).toContain('이미지 10'); expect(md).toContain('링크 8'); }); test('캐러셀 신호가 없으면 "신호 없음 + 실사이트 확인 권장"으로 정직하게', () => { const noCarousel = buildLayoutSkeleton({ structure: { sections: [{ role: 'header', hint: 'site-header', text: '' }] }, sitemap: { pages: [] }, }); expect(noCarousel).toContain('신호 없음'); expect(noCarousel).toContain('실사이트 확인 권장'); }); test('빈 스캔에도 깨지지 않는다', () => { expect(buildLayoutSkeleton({})).toContain('섹션 데이터가 스캔에 없습니다'); }); });