/** * Schedule Conflict Check (Self-Evolving OS Track 6-2/6-3) 테스트. */ import { findScheduleConflicts, formatConflictReport, CachedCalEvent } from '../src/features/calendar/conflictCheck'; import { _parseCalEventAttrs } from '../src/agent/attrParsers'; // 로컬 ISO (timezone 없음) — 실제 캐시도 로컬 자정 기준 all-day 를 담으므로 // 테스트를 실행 머신 timezone 과 무관하게 만든다. const EXISTING: CachedCalEvent[] = [ { summary: '주간회의', startIso: '2026-06-12T14:00:00', endIso: '2026-06-12T15:00:00', allDay: false, location: '회의실 A' }, { summary: '워크숍', startIso: '2026-06-13T00:00:00', allDay: true }, ]; describe('findScheduleConflicts', () => { it('구간이 겹치면 충돌', () => { const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-12T14:30:00', durationMinutes: 60 }); expect(c.length).toBe(1); expect(c[0].summary).toBe('주간회의'); }); it('경계 접촉(끝=시작)은 충돌 아님', () => { const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-12T15:00:00', durationMinutes: 60 }); expect(c.length).toBe(0); }); it('endIso 없으면 기본 60분으로 판정', () => { const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-12T13:30:00' }); expect(c.length).toBe(1); // 13:30~14:30 vs 14:00~15:00 }); it('종일 일정과 그 날짜의 시간 일정은 충돌', () => { const c = findScheduleConflicts(EXISTING, { startIso: '2026-06-13T10:00:00', durationMinutes: 30 }); expect(c.some((e) => e.summary === '워크숍')).toBe(true); }); it('잘못된 날짜 입력은 보수적으로 충돌 없음 (생성 단계에서 실패)', () => { expect(findScheduleConflicts(EXISTING, { startIso: 'not-a-date' })).toEqual([]); expect(findScheduleConflicts([{ summary: 'x', startIso: 'broken', allDay: false }], { startIso: '2026-06-12T14:00:00' })).toEqual([]); }); it('빈 캐시면 충돌 없음', () => { expect(findScheduleConflicts([], { startIso: '2026-06-12T14:00:00' })).toEqual([]); }); }); describe('formatConflictReport', () => { it('충돌 목록 + force 안내 포함', () => { const msg = formatConflictReport([EXISTING[0]]); expect(msg).toContain('주간회의'); expect(msg).toContain('force="true"'); expect(msg).toContain('보류'); }); }); describe('_parseCalEventAttrs force 속성', () => { it('force="true" 파싱', () => { const attrs = _parseCalEventAttrs(' title="미팅" start="2026-06-12T14:00" force="true"'); expect(attrs.force).toBe(true); }); it('미지정이면 undefined (기본 차단 동작)', () => { const attrs = _parseCalEventAttrs(' title="미팅" start="2026-06-12T14:00"'); expect(attrs.force).toBeUndefined(); }); });