/** * 섹터 분류·해석 (네이버 업종 코드 기반) — 순수 로직 테스트. */ import { resolveSectorQuery, listSectorKeys, SECTOR_GROUPS, NAVER_INDUSTRY_NAMES } from '../src/features/stocks/stockSectors'; describe('resolveSectorQuery', () => { test('친화 키 직접 입력', () => { expect(resolveSectorQuery('반도체')?.key).toBe('반도체'); expect(resolveSectorQuery('2차전지')?.key).toBe('2차전지'); expect(resolveSectorQuery('금융')?.key).toBe('금융'); }); test('영문/대체 별칭', () => { expect(resolveSectorQuery('semiconductor')?.key).toBe('반도체'); expect(resolveSectorQuery('battery')?.key).toBe('2차전지'); expect(resolveSectorQuery('배터리')?.key).toBe('2차전지'); expect(resolveSectorQuery('bio')?.key).toBe('바이오/제약'); }); test('네이버 업종명 직접 입력 → 그 코드를 가진 그룹', () => { expect(resolveSectorQuery('제약')?.key).toBe('바이오/제약'); expect(resolveSectorQuery('은행')?.key).toBe('금융'); expect(resolveSectorQuery('조선')?.key).toBe('조선/기계'); }); test('대소문자 무시', () => { expect(resolveSectorQuery('SEMICON')?.key).toBe('반도체'); }); test('미지원 입력 → null', () => { expect(resolveSectorQuery('zzzqqq')).toBeNull(); expect(resolveSectorQuery('')).toBeNull(); }); }); describe('SECTOR_GROUPS 무결성', () => { test('모든 그룹이 유효한 네이버 업종 코드를 가진다', () => { for (const g of SECTOR_GROUPS) { expect(g.codes.length).toBeGreaterThan(0); for (const c of g.codes) { expect(NAVER_INDUSTRY_NAMES[c]).toBeDefined(); // 코드가 실제 업종명에 존재 } } }); test('핵심 섹터가 올바른 대표 코드를 가진다', () => { const semi = SECTOR_GROUPS.find(g => g.key === '반도체')!; expect(semi.codes).toContain(278); // 반도체와반도체장비 const batt = SECTOR_GROUPS.find(g => g.key === '2차전지')!; expect(batt.codes).toContain(283); // 전기제품(2차전지) }); test('listSectorKeys 는 모든 그룹 키', () => { expect(listSectorKeys()).toEqual(SECTOR_GROUPS.map(g => g.key)); expect(listSectorKeys().length).toBeGreaterThanOrEqual(15); }); });