/** * DC-167: default-namespace multistatus parsing (Radicale compatibility). * Judge-lesson class: the parser required a namespace prefix on , * which Radicale (default DAV ns, bare ) never emits — result was * a silent zero events, ok:true. Real-server XML style is now covered. */ 'use strict'; const { extractCalendarsAndEvents } = require('../../src/calendar/caldav-client'); const BARE = '' + '/sami7777/calendar/a.ics' + '"aa"' + 'BEGIN:VCALENDAR END:VCALENDAR' + '' + '/sami7777/calendar/b.ics' + '"bb"' + 'BEGIN:VCALENDAR' + ''; const PREFIXED = BARE .replace(//g, '') .replace(/<\/response>/g, '') .replace('', ''); describe('DC-167 default-namespace multistatus (Radicale)', () => { test('bare entries are extracted (Radicale style)', () => { const out = extractCalendarsAndEvents(BARE); expect(out).toHaveLength(2); expect(out[0].href).toBe('/sami7777/calendar/a.ics'); expect(out[0].calendarData).toContain('BEGIN:VCALENDAR'); expect(out[1].href).toBe('/sami7777/calendar/b.ics'); }); test('prefixed entries still extract (back-compat)', () => { const out = extractCalendarsAndEvents(PREFIXED); expect(out).toHaveLength(2); expect(out[0].href).toBe('/sami7777/calendar/a.ics'); expect(out[0].calendarData).toContain('BEGIN:VCALENDAR'); }); test('mixed styles in one document do not double-count or drop', () => { const mixed = BARE.replace('', ''); const out = extractCalendarsAndEvents(mixed); expect(out.length).toBeGreaterThanOrEqual(1); expect(out.some(e => e.href === '/sami7777/calendar/a.ics')).toBe(true); }); test('empty multistatus yields zero entries (no throw)', () => { const out = extractCalendarsAndEvents(""); expect(out).toEqual([]); }); });