calendar-plugin/fixture/http_trace.log

1165 lines
1.9 MiB

{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 43446\r\n\r\n<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Calendar</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, sans-serif; margin: 0; background: #f7f7f5; color: #1f2937; }\n header { background: #0f766e; color: #fff; padding: 14px 18px; }\n header a { color: #fff; margin-right: 10px; }\n main { max-width: 1100px; margin: 18px auto; padding: 0 12px; }\n .card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 12px; margin-bottom: 12px; }\n input, select, textarea, button { font: inherit; }\n button { padding: 7px 10px; border: 1px solid #d1d5db; border-radius: 8px; background: #fff; cursor: pointer; }\n button:disabled { opacity: 0.45; cursor: not-allowed; }\n table { width: 100%; border-collapse: collapse; }\n th, td { border-bottom: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top; }\n .row { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 8px; }\n .muted { color: #6b7280; font-size: 0.9rem; }\n .ok { color: #065f46; }\n .err { color: #991b1b; }\n .grid3 { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:8px; }\n .grid4 { display:grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap:8px; }\n .field { position: relative; margin: 14px 0; }\n .field > label { position:absolute; top:-0.62rem; left:0.6rem; font-size:0.72rem; line-height:1; background:#fff; padding:0 0.25rem; color:#4b5563; letter-spacing:0.01em; }\n .field > input, .field > select, .field > textarea {\n width: 100%; box-sizing: border-box; padding: 0.78rem 0.65rem 0.5rem 0.65rem;\n border: 1px solid #cbd5e1; border-radius: 8px; background: #fff;\n }\n .field-with-suffix > input { padding-right: 5.5rem; }\n .input-suffix {\n position: absolute; right: 0.7rem; top: 56%;\n transform: translateY(-50%); color: #374151; font-size: 0.84rem; pointer-events: none;\n }\n .toolbar { display:flex; gap:8px; flex-wrap: wrap; align-items: end; }\n #topControls { align-items: center; }\n .topbar { display:flex; justify-content:space-between; gap:10px; align-items:flex-start; flex-wrap:wrap; }\n .topbar-right { margin-left:auto; text-align:right; min-width: 220px; }\n .topbar-right a { display:block; margin-bottom:4px; }\n .toggle-wrap { display:flex; align-items:center; padding: 0 2px; min-height: 38px; }\n .toggle-wrap label { position: static; font-size: 0.9rem; background: transparent; padding: 0; }\n .modal { position: fixed; inset: 0; background: rgba(15,23,42,0.45); display: none; align-items: center; justify-content: center; z-index: 1000; }\n .modal.open { display:flex; }\n .modal-card { width: min(900px, 92vw); max-height: 92vh; overflow: auto; background: #fff; border-radius: 10px; padding: 12px; }\n .week-grid { display:grid; grid-template-columns: 56px repeat(7, 1fr); gap:8px; }\n .time-scale { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .time-scale .week-head { text-align:center; }\n .time-scale .time-lane { font-size:0.68rem; color:#6b7280; }\n .time-label { position:absolute; left:4px; transform: translateY(-50%); }\n .week-day { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .week-head { padding:6px; border-bottom:1px solid #e5e7eb; font-size:0.85rem; font-weight:600; }\n .all-day-list { min-height:24px; padding:4px; border-bottom:1px dashed #e5e7eb; font-size:0.75rem; }\n .time-lane { position:relative; height: 960px; background:\n repeating-linear-gradient(to bottom, #f8fafc 0, #f8fafc 39px, #eef2f7 39px, #eef2f7 40px); }\n .week-event { position:absolute; background:#dcfce7; border:1px solid #86efac; border-radius:6px; font-size:0.72rem; padding:2px 4px; overflow:hidden; cursor:pointer; box-shadow: 0 1px 2px rgba(0,0,0,0.08); }\n .week-event:hover { filter: brightness(0.97); transform: translateY(-1px); }\n .month-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; }\n .month-dow-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; margin-bottom: 6px; }\n .month-dow { font-size: 0.78rem; font-weight: 700; color: #4b5563; text-align: center; }\n .month-cell { min-height:130px; border:1px solid #e5e7eb; border-radius:8px; background:#fff; padding:5px; }\n .month-cell.blank { background:#f3f4f6; }\n .day-num { font-size:0.82rem; font-weight:700; }\n .mini-evt { font-size:0.72rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid var(--accent, #34d399); background: color-mix(in srgb, var(--accent, #34d399) 12%, white); padding:2px 4px; margin-top:3px; cursor:pointer; border-radius:4px; }\n .mini-evt:hover { filter: brightness(0.97); }\n .year-grid { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:10px; }\n .year-month { border:1px solid #e5e7eb; border-radius:8px; padding:6px; background:#fff; }\n .year-month h4 { margin: 3px 0 6px; font-size:0.9rem; }\n .year-days { display:grid; grid-template-columns: repeat(7, 1fr); gap:3px; }\n .year-day { font-size:0.7rem; border:1px solid #edf2f7; border-radius:4px; min-height:22px; text-align:center; line-height:22px; }\n .year-day.has-event { font-weight: 700; background: #ecfeff; border-color: #67e8f9; }\n .legend { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }\n .legend .chip { border:1px solid #e5e7eb; border-left: 4px solid var(--accent,#34d399); border-radius: 6px; padding: 3px 8px; font-size: 0.75rem; background:#fff; }\n #occurrenceGrid .year-grid { grid-template-columns: repeat(3, minmax(220px, 1fr)); gap: 10px; align-items: start; }\n #occurrenceGrid .month-grid { gap: 4px; }\n #occurrenceGrid .month-cell { min-height: 24px; padding: 3px; }\n #occurrenceGrid .day-num { font-size: 0.76rem; line-height: 1.1; text-align: center; }\n #occurrenceGrid .month-cell.active { background: #ecfeff; border-color: #67e8f9; }\n #loginModal .field > label {\n position: static;\n display: inline-block;\n margin: 0 0 0.2rem;\n font-size: 0.8rem;\n background: transparent;\n padding: 0;\n color: #4b5563;\n }\n #loginModal .field > input {\n padding: 0.6rem 0.65rem;\n }\n </style>\n</head>\n<body>\n\n<header><strong>Calendar Fixture</strong> <span class=\"muted\">Public Calendar UI</span></header>\n<main>\n <div class=\"card\">\n <div class=\"topbar\">\n <div class=\"toolbar\" id=\"topControls\">\n <div class=\"field\"><label>View</label>\n <select id=\"view\">\n <option value=\"list\">List</option>\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\" selected>Month</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n <div class=\"field\"><label>Date</label><input id=\"anchor\" type=\"date\" /></div>\n <div id=\"futureOnlyWrap\" class=\"toggle-wrap\"><label><input id=\"futureOnly\" type=\"checkbox\" checked /> Future Only</label></div>\n <button id=\"prevBtn\" title=\"Previous\">&#8592;</button>\n <button id=\"todayBtn\" title=\"Today\">&#128197;</button>\n <button id=\"nextBtn\" title=\"Next\">&#8594;</button>\n <button id=\"newEventBtn\">Create Event</button>\n <button id=\"loginBtn\">Login</button>\n </div>\n <div class=\"topbar-right\">\n <a href=\"/calendar.ics\" target=\"_blank\">ICS Link</a>\n <a href=\"/caldav/\" target=\"_blank\">CalDAV</a>\n <div id=\"status\" class=\"muted\"></div>\n <div id=\"authState\" class=\"muted\"></div>\n <button id=\"logoutBtn\" style=\"display:none\">Logout</button>\n </div>\n </div>\n </div>\n <div id=\"events\"></div>\n <div id=\"loginModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Account Login</h3>\n <div id=\"loginFeedback\" class=\"muted\"></div>\n <div class=\"row\">\n <div class=\"field\"><label>Email</label><input id=\"loginEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password</label><input id=\"loginPassword\" type=\"password\" /></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"doLoginBtn\" disabled>Login</button>\n <button id=\"closeLoginBtn\">Close</button>\n </div>\n <div class=\"card\">\n <h4>Register</h4>\n <div class=\"field\"><label>Email</label><input id=\"regEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password (8+ chars)</label><input id=\"regPw\" type=\"password\" /></div>\n <div class=\"toolbar\"><button id=\"regBtn\" disabled>Register</button></div>\n <div class=\"field\"><label>Verify Token</label><input id=\"verifyToken\" /></div>\n <div class=\"toolbar\"><button id=\"verifyBtn\" disabled>Verify Email</button></div>\n </div>\n <div class=\"card\">\n <h4>Password Recovery</h4>\n <div class=\"field\"><label>Email</label><input id=\"forgotEmail\" type=\"email\" /></div>\n <button id=\"forgotBtn\" disabled>Send Reset Token</button>\n <div class=\"field\"><label>Reset Token</label><input id=\"resetToken\" /></div>\n <div class=\"field\"><label>New Password</label><input id=\"resetPw\" type=\"password\" /></div>\n <button id=\"resetBtn\" disabled>Reset Password</button>\n </div>\n </div>\n </div>\n <div id=\"detailModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Event Details</h3>\n <div class=\"field\"><label>Title</label><input id=\"detailTitle\" readonly /></div>\n <div class=\"field\"><label>Category</label><input id=\"detailCategory\" readonly /></div>\n <div class=\"field\"><label>Description</label><textarea id=\"detailDescription\" rows=\"5\" readonly></textarea></div>\n <div class=\"toolbar\"><button id=\"closeDetailBtn\">Close</button></div>\n </div>\n </div>\n <div id=\"modal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3 id=\"modalTitle\">Event</h3>\n <input id=\"eventId\" type=\"hidden\" />\n <div class=\"field\"><label>Title</label><input id=\"title\" /></div>\n <div class=\"row\">\n <div class=\"field\"><label>Location</label><input id=\"location\" /></div>\n <div class=\"field\"><label>Category</label><input id=\"category\" /></div>\n </div>\n <div class=\"field\"><label>Description</label><textarea id=\"description\" rows=\"3\"></textarea></div>\n <div class=\"toggle-wrap\"><label><input id=\"allDay\" type=\"checkbox\" /> All Day Event</label></div>\n <div class=\"grid4\">\n <div class=\"field\"><label>Start Date</label><input id=\"startDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"startTimeWrap\"><label>Start Time</label><input id=\"startTime\" type=\"time\" /></div>\n <div class=\"field\"><label>End Date</label><input id=\"endDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"endTimeWrap\"><label>End Time</label><input id=\"endTime\" type=\"time\" /></div>\n </div>\n <div class=\"row\">\n <div class=\"field\"><label>Repeat Type</label>\n <select id=\"repeatType\">\n <option value=\"none\">none</option>\n <option value=\"daily\">daily</option>\n <option value=\"weekly\">weekly</option>\n <option value=\"monthly\">monthly</option>\n <option value=\"yearly\">yearly</option>\n <option value=\"custom\">custom</option>\n </select>\n </div>\n <div class=\"field field-with-suffix\" id=\"repeatIntervalWrap\"><label>Every</label><input id=\"repeatInterval\" type=\"number\" min=\"1\" value=\"1\" /><span id=\"repeatIntervalText\" class=\"input-suffix\"></span></div>\n </div>\n <div class=\"row\" id=\"modeUntilRow\">\n <div class=\"field\"><label>Mode</label>\n <select id=\"rangeMode\">\n <option value=\"none\">none</option>\n <option value=\"no_end\">no_end</option>\n <option value=\"count\">count</option>\n <option value=\"until\">until</option>\n </select>\n </div>\n <div class=\"field\" id=\"repeatUntilWrap\"><label>Repeat Until</label><input id=\"repeatUntil\" type=\"date\" /></div>\n </div>\n <div class=\"row\" id=\"rangeWrap\">\n <div class=\"field\" id=\"repeatCountWrap\"><label>Repeat Count</label><input id=\"repeatCount\" type=\"number\" min=\"1\" /></div>\n </div>\n <div class=\"row\" id=\"monthlyNthWrap\">\n <div class=\"field\"><label>Monthly Pattern</label>\n <select id=\"monthlyNthMode\">\n <option value=\"\">from start date</option>\n <option value=\"day_of_month\">nth day of month</option>\n <option value=\"weekday_of_month\">nth weekday of month</option>\n </select>\n </div>\n <div class=\"field\" id=\"nthDayWrap\"><label>Day Number</label><input id=\"nthDay\" type=\"number\" min=\"1\" max=\"31\" /></div>\n </div>\n <div class=\"row\" id=\"nthWeekdayWrap\">\n <div class=\"field\"><label>Nth</label><select id=\"nthPos\"><option value=\"1\">1st</option><option value=\"2\">2nd</option><option value=\"3\">3rd</option><option value=\"4\">4th</option><option value=\"5\">5th</option><option value=\"-1\">last</option></select></div>\n <div class=\"field\"><label>Weekday</label><select id=\"nthWeekday\"><option value=\"0\">Sunday</option><option value=\"1\">Monday</option><option value=\"2\">Tuesday</option><option value=\"3\">Wednesday</option><option value=\"4\">Thursday</option><option value=\"5\">Friday</option><option value=\"6\">Saturday</option></select></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"saveCreateBtn\">Create</button>\n <button id=\"saveUpdateBtn\">Update</button>\n <button id=\"saveDeleteBtn\">Delete</button>\n <button id=\"toggleSingleOccurrenceBtn\">Delete a Single Occurrence</button>\n <button id=\"closeModalBtn\">Close</button>\n </div>\n <div class=\"card\" id=\"singleOccurrencePanel\" style=\"display:none\">\n <h4>Delete Single Occurrence (Exception)</h4>\n <div class=\"toolbar\">\n <button id=\"occPrevBtn\">&#8592;</button>\n <button id=\"occNextBtn\">&#8594;</button>\n </div>\n <div id=\"occurrenceGrid\" class=\"month-grid\"></div>\n <input id=\"occKey\" type=\"hidden\" />\n <div class=\"field\"><label>Occurrence</label><input id=\"occKeyDisplay\" readonly placeholder=\"Select an occurrence from the calendar above\" /></div>\n <button id=\"deleteOccurrenceBtn\">Delete Occurrence</button>\n </div>\n </div>\n </div>\n</main>\n<script>\nconst statusEl = document.getElementById('status');\nconst authStateEl = document.getElementById('authState');\nconst loginFeedbackEl = document.getElementById('loginFeedback');\nconst eventsEl = document.getElementById('events');\nconst viewEl = document.getElementById('view');\nconst anchorEl = document.getElementById('anchor');\nconst futureOnlyWrapEl = document.getElementById('futureOnlyWrap');\nconst futureOnlyEl = document.getElementById('futureOnly');\nconst modalEl = document.getElementById('modal');\nconst loginModalEl = document.getElementById('loginModal');\nconst detailModalEl = document.getElementById('detailModal');\nconst loginBtnEl = document.getElementById('loginBtn');\nconst logoutBtnEl = document.getElementById('logoutBtn');\nconst newEventBtnEl = document.getElementById('newEventBtn');\nconst ROOT = \"\";\nlet session = { email:'', password:'', user:null, canWrite:false };\nviewEl.value = 'month';\nfunction pad2(n){ return String(n).padStart(2,'0'); }\nfunction ymdLocal(d){ return `${d.getFullYear()}-${pad2(d.getMonth()+1)}-${pad2(d.getDate())}`; }\nfunction parseYmd(s){ const p=(s||'').split('-'); if(p.length!==3) return new Date(); return new Date(Number(p[0]), Number(p[1])-1, Number(p[2])); }\nanchorEl.value = ymdLocal(new Date());\nfunction rootPath(path){ return ROOT + path; }\nfunction apiUrl(path) { return rootPath(path); }\nfunction authHeaders(){ return session.email && session.password ? { Authorization: 'Basic ' + btoa(session.email + ':' + session.password) } : {}; }\nfunction isEmail(v){ return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((v||'').trim()); }\nfunction showLoginFeedback(msg, ok){\n loginFeedbackEl.textContent = msg || '';\n loginFeedbackEl.className = ok ? 'ok' : (msg ? 'err' : 'muted');\n}\nfunction updateAuthButtonStates(){\n const loginEmail = document.getElementById('loginEmail').value || '';\n const loginPw = document.getElementById('loginPassword').value || '';\n const regEmail = document.getElementById('regEmail').value || '';\n const regPw = document.getElementById('regPw').value || '';\n const verifyToken = document.getElementById('verifyToken').value || '';\n const forgotEmail = document.getElementById('forgotEmail').value || '';\n const resetToken = document.getElementById('resetToken').value || '';\n const resetPw = document.getElementById('resetPw').value || '';\n document.getElementById('doLoginBtn').disabled = !(isEmail(loginEmail) && loginPw.length >= 8);\n document.getElementById('regBtn').disabled = !(isEmail(regEmail) && regPw.length >= 8);\n document.getElementById('verifyBtn').disabled = !verifyToken.trim();\n document.getElementById('forgotBtn').disabled = !isEmail(forgotEmail);\n document.getElementById('resetBtn').disabled = !(resetToken.trim() && resetPw.length >= 8);\n}\nfunction refreshAuthUi(){\n const logged = !!session.user;\n loginBtnEl.style.display = logged ? 'none' : '';\n logoutBtnEl.style.display = logged ? '' : 'none';\n newEventBtnEl.style.display = session.canWrite ? '' : 'none';\n authStateEl.textContent = logged\n ? `Logged in as ${session.user.email}`\n : 'Public mode: read-only';\n updateEventButtons();\n}\nfunction splitIsoToInputs(iso) { if (!iso) return {d:'',t:''}; if (!iso.includes('T')) return {d:iso.slice(0,10),t:''}; return {d:iso.slice(0,10),t:iso.slice(11,16)}; }\nfunction toIso(d,t,allDay){ if(!d) return ''; if(allDay) return d; return `${d}T${(t||'00:00')}:00+01:00`; }\nfunction formatOccurrenceKey(iso){\n if (!iso) return '';\n const dt = new Date(iso);\n if (Number.isNaN(dt.getTime())) return iso;\n return dt.toLocaleString('en-GB', { year:'numeric', month:'short', day:'2-digit', hour:'2-digit', minute:'2-digit' });\n}\nfunction applyAllDayVisibility(){\n const allDay = !!document.getElementById('allDay').checked;\n document.getElementById('startTimeWrap').style.display = allDay ? 'none' : '';\n document.getElementById('endTimeWrap').style.display = allDay ? 'none' : '';\n}\nlet occCursor = new Date();\nfunction everyText(){\n const n = Number(document.getElementById('repeatInterval').value || 1);\n const rt = document.getElementById('repeatType').value;\n const unit = rt === 'daily' ? 'day' : rt === 'weekly' ? 'week' : rt === 'monthly' ? 'month' : rt === 'yearly' ? 'year' : rt === 'custom' ? 'week' : '';\n document.getElementById('repeatIntervalText').textContent = unit ? `${unit}${n===1?'':'s'}` : '';\n}\nfunction applyRecurrenceVisibility(){ const rt=document.getElementById('repeatType').value; const rm=document.getElementById('rangeMode').value; const show=rt!=='none';\n document.getElementById('repeatIntervalWrap').style.display=show?'':'none';\n document.getElementById('modeUntilRow').style.display=show?'':'none';\n document.getElementById('rangeWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatCountWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatUntilWrap').style.display=(show&&rm==='until')?'':'none';\n document.getElementById('monthlyNthWrap').style.display=(rt==='monthly')?'':'none';\n const m = document.getElementById('monthlyNthMode').value;\n document.getElementById('nthDayWrap').style.display=(rt==='monthly' && m==='day_of_month')?'':'none';\n document.getElementById('nthWeekdayWrap').style.display=(rt==='monthly' && m==='weekday_of_month')?'':'none';\n document.getElementById('toggleSingleOccurrenceBtn').style.display=show?'':'none';\n if (!show) document.getElementById('singleOccurrencePanel').style.display='none';\n everyText();\n updateEventButtons();\n}\nfunction openModal(mode,evt){ if(!evt) evt={}; const sd=splitIsoToInputs(evt.start_datetime), ed=splitIsoToInputs(evt.end_datetime);\n if (!session.canWrite) return;\n document.getElementById('modalTitle').textContent=mode==='create'?'Create Event':'Edit Event';\n document.getElementById('eventId').value=evt.id||''; document.getElementById('title').value=evt.title||''; document.getElementById('location').value=evt.location||'';\n document.getElementById('category').value=evt.category||''; document.getElementById('description').value=evt.description||'';\n document.getElementById('allDay').checked=!!evt.all_day_event; document.getElementById('startDate').value=sd.d||''; document.getElementById('startTime').value=sd.t||'';\n document.getElementById('endDate').value=ed.d||''; document.getElementById('endTime').value=ed.t||''; document.getElementById('repeatType').value=evt.repeat_type||'none';\n document.getElementById('repeatInterval').value=evt.repeat_interval||1; document.getElementById('rangeMode').value=evt.repeat_range_mode||'none';\n document.getElementById('repeatCount').value=evt.repeat_count||''; document.getElementById('repeatUntil').value=evt.repeat_until||'';\n document.getElementById('monthlyNthMode').value=evt.repeat_nth_mode||'';\n document.getElementById('nthDay').value=evt.repeat_nth_day||'';\n document.getElementById('nthPos').value=evt.repeat_nth_pos||'1';\n document.getElementById('nthWeekday').value=evt.repeat_nth_weekday===null||evt.repeat_nth_weekday===undefined?'0':String(evt.repeat_nth_weekday);\n document.getElementById('singleOccurrencePanel').style.display='none';\n document.getElementById('occKey').value = '';\n document.getElementById('occKeyDisplay').value = '';\n occCursor = new Date((evt.start_datetime||new Date().toISOString()).slice(0,10) + 'T00:00:00');\n document.getElementById('toggleSingleOccurrenceBtn').style.display = mode==='edit' ? '' : 'none';\n document.getElementById('saveCreateBtn').style.display=mode==='create'?'':'none'; document.getElementById('saveUpdateBtn').style.display=mode==='edit'?'':'none';\n document.getElementById('saveDeleteBtn').style.display=mode==='edit'?'':'none'; applyRecurrenceVisibility(); modalEl.classList.add('open');\n applyAllDayVisibility();\n updateEventButtons();\n}\nfunction closeModal(){ modalEl.classList.remove('open'); }\nfunction openDetail(item){\n document.getElementById('detailTitle').value = item?.title || '';\n document.getElementById('detailCategory').value = item?.category || '';\n document.getElementById('detailDescription').value = item?.description || '';\n detailModalEl.classList.add('open');\n}\nfunction closeDetail(){ detailModalEl.classList.remove('open'); }\nfunction updateEventButtons(){\n const titleOk = !!(document.getElementById('title').value || '').trim();\n const startDate = (document.getElementById('startDate').value || '').trim();\n const endDateRaw = (document.getElementById('endDate').value || '').trim();\n const endDate = endDateRaw || startDate;\n const allDay = !!document.getElementById('allDay').checked;\n const startTime = (document.getElementById('startTime').value || '').trim();\n const endTime = (document.getElementById('endTime').value || '').trim();\n let validDateTime = false;\n if (startDate && endDate && endDate >= startDate){\n if (allDay){\n validDateTime = true;\n } else if (startTime && endTime){\n validDateTime = endDate > startDate || endTime >= startTime;\n }\n }\n const hasCore = titleOk && validDateTime;\n const hasId = !!(document.getElementById('eventId').value || '').trim();\n document.getElementById('saveCreateBtn').disabled = !(session.canWrite && hasCore && !hasId);\n document.getElementById('saveUpdateBtn').disabled = !(session.canWrite && hasCore && hasId);\n document.getElementById('saveDeleteBtn').disabled = !(session.canWrite && hasId);\n document.getElementById('toggleSingleOccurrenceBtn').disabled = !(session.canWrite && hasId && document.getElementById('repeatType').value !== 'none');\n document.getElementById('deleteOccurrenceBtn').disabled = !(session.canWrite && hasId && (document.getElementById('occKey').value || '').trim());\n}\nfunction eventPayload(){ const ad=document.getElementById('allDay').checked; return {\n title:document.getElementById('title').value, location:document.getElementById('location').value, category:document.getElementById('category').value,\n description:document.getElementById('description').value, all_day_event:ad,\n start_datetime:toIso(document.getElementById('startDate').value,document.getElementById('startTime').value,ad),\n end_datetime:toIso((document.getElementById('endDate').value || document.getElementById('startDate').value),document.getElementById('endTime').value,ad),\n repeat_type:document.getElementById('repeatType').value, repeat_interval:Number(document.getElementById('repeatInterval').value||1),\n repeat_nth_mode:document.getElementById('monthlyNthMode').value,\n repeat_nth_day:document.getElementById('nthDay').value?Number(document.getElementById('nthDay').value):null,\n repeat_nth_pos:document.getElementById('nthPos').value?Number(document.getElementById('nthPos').value):null,\n repeat_nth_weekday:document.getElementById('nthWeekday').value === '' ? null : Number(document.getElementById('nthWeekday').value),\n repeat_range_mode:document.getElementById('rangeMode').value, repeat_count:document.getElementById('repeatCount').value?Number(document.getElementById('repeatCount').value):null,\n repeat_until:document.getElementById('repeatUntil').value||null\n};}\nasync function loadOccurrenceChooser(){\n const id = document.getElementById('eventId').value;\n if (!id) return;\n const from = new Date(occCursor.getFullYear(), occCursor.getMonth(), 1);\n const fromS = ymdLocal(from);\n const r = await fetch(apiUrl('/wp-json/calendar/v1/events/' + id + '/occurrences?from=' + fromS + '&months=3'), {headers:authHeaders()});\n const p = await r.json();\n const list = p.data || [];\n const dayToKey = new Map();\n list.forEach(x => {\n const d = (x.occurrence_start || '').slice(0,10);\n if (d && !dayToKey.has(d)) dayToKey.set(d, x.occurrence_start);\n });\n const cells = [];\n for(let m=0;m<3;m++){\n const d = new Date(from.getFullYear(), from.getMonth()+m, 1);\n const y=d.getFullYear(), mo=d.getMonth();\n const first=new Date(y,mo,1), off=(first.getDay()+6)%7, dim=new Date(y,mo+1,0).getDate();\n let monthCells=''; for(let i=0;i<off;i++) monthCells += '<div class=\"month-cell blank\"></div>';\n for(let day=1; day<=dim; day++){\n const dt=new Date(y,mo,day); const k=ymdLocal(dt); const has=dayToKey.has(k);\n monthCells += `<div class=\"month-cell ${has?'active':'blank'}\"><div class=\"day-num\" data-occ-date=\"${k}\" style=\"cursor:${has?'pointer':'default'}\">${day}</div></div>`;\n }\n cells.push(`<div class=\"year-month\"><h4>${d.toLocaleString('en-GB',{month:'short',year:'numeric'})}</h4><div class=\"month-grid\">${monthCells}</div></div>`);\n }\n document.getElementById('occurrenceGrid').innerHTML = `<div class=\"year-grid\">${cells.join('')}</div>`;\n document.querySelectorAll('[data-occ-date]').forEach(el=>el.addEventListener('click',()=>{\n const k=el.getAttribute('data-occ-date'); if(!dayToKey.has(k)) return;\n const iso = dayToKey.get(k) || '';\n document.getElementById('occKey').value = iso;\n document.getElementById('occKeyDisplay').value = formatOccurrenceKey(iso);\n updateEventButtons();\n }));\n}\nfunction startMinutes(iso){ if(!iso||!iso.includes('T')) return 0; return Number(iso.slice(11,13))*60+Number(iso.slice(14,16)); }\nfunction categoryColor(category){\n const base = (category || 'general').toLowerCase();\n let h = 0; for (let i = 0; i < base.length; i++) h = (h * 31 + base.charCodeAt(i)) % 360;\n return `hsl(${h} 70% 45%)`;\n}\nfunction eventChip(e, cls='mini-evt'){ return `<div class=\"${cls}\" data-edit=\"${e.event_id}\" style=\"--accent:${categoryColor(e.category)}\">${e.title}</div>`; }\nfunction collectLegend(items){\n const map = new Map();\n items.forEach(e => { const c = e.category || 'Uncategorised'; if (!map.has(c)) map.set(c, categoryColor(c)); });\n return `<div class=\"legend\">${Array.from(map.entries()).map(([k,v]) => `<div class=\"chip\" style=\"--accent:${v}\">${k}</div>`).join('')}</div>`;\n}\nfunction renderList(items){\n const fmt = (e) => {\n const sd = (e.occurrence_start||'').slice(0,10);\n const st = e.all_day_event ? 'All-day' : (e.occurrence_start||'').slice(11,16);\n const et = e.all_day_event ? 'All-day' : (e.occurrence_end||'').slice(11,16);\n const desc = (e.description || '').trim() || e.title || '';\n return `${sd} ${st}--${et} ${desc}`;\n };\n eventsEl.innerHTML=(items.map(e=>`<div class=\"card\">${fmt(e)}</div>`).join('')||'<div class=\"card\">No events in this window.</div>');\n}\nfunction layoutTimedEvents(dayItems){\n const events = dayItems.slice().sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n let i = 0; const out = [];\n while (i < events.length){\n let clusterEnd = startMinutes(events[i].occurrence_end);\n const cluster = [events[i]];\n let j = i + 1;\n while (j < events.length && startMinutes(events[j].occurrence_start) < clusterEnd){\n cluster.push(events[j]); clusterEnd = Math.max(clusterEnd, startMinutes(events[j].occurrence_end)); j++;\n }\n const active = []; let maxCols = 0;\n const placed = cluster.map(e => {\n const start = startMinutes(e.occurrence_start), end = startMinutes(e.occurrence_end);\n for (let k = active.length - 1; k >= 0; k--) if (active[k].end <= start) active.splice(k,1);\n const used = new Set(active.map(a => a.col));\n let col = 0; while (used.has(col)) col++;\n active.push({ end, col }); maxCols = Math.max(maxCols, col + 1);\n return { e, start, end, col };\n });\n placed.forEach(p => out.push({ ...p, span: maxCols }));\n i = j;\n }\n return out;\n}\nfunction renderWeek(items,anchor){\n const d=new Date(anchor+'T00:00:00'); const diff=(d.getDay()+6)%7; d.setDate(d.getDate()-diff);\n const days=Array.from({length:7},(_,i)=>new Date(d.getFullYear(),d.getMonth(),d.getDate()+i)); const by=Object.fromEntries(days.map(x=>[ymdLocal(x),[]]));\n items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); if(by[k]) by[k].push(e);});\n const scaleLabels = Array.from({length:24}, (_,h)=>`<div class=\"time-label\" style=\"top:${h*40}px\">${String(h).padStart(2,'0')}:00</div>`).join('');\n const cols=days.map(dt=>{\n const k=ymdLocal(dt); const day=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n const ad=day.filter(x=>x.all_day_event), td=day.filter(x=>!x.all_day_event);\n const blocks=layoutTimedEvents(td).map(p=>{\n const top=Math.max(0,p.start/1.5), h=Math.max(24,(p.end-p.start)/1.5);\n const widthPct=100/p.span; const left=`calc(${p.col*widthPct}% + 2px)`; const width=`calc(${widthPct}% - 4px)`;\n const st = (p.e.occurrence_start||'').slice(11,16);\n return `<div class=\"week-event\" data-edit=\"${p.e.event_id}\" style=\"top:${top}px;height:${h}px;left:${left};width:${width};--accent:${categoryColor(p.e.category)};border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, white);\">${st} ${p.e.title}</div>`;\n }).join('');\n return `<div class=\"week-day\"><div class=\"week-head\">${dt.toDateString().slice(0,10)}</div><div class=\"all-day-list\">${ad.map(e=>eventChip(e)).join('')}</div><div class=\"time-lane\">${blocks}</div></div>`;\n }).join('');\n const scaleCol = `<div class=\"time-scale\"><div class=\"week-head\">Time</div><div class=\"time-lane\">${scaleLabels}</div></div>`;\n eventsEl.innerHTML=`<div class=\"week-grid\">${scaleCol}${cols}</div>${collectLegend(items)}`;\n}\nfunction renderMonth(items,anchor){\n const b=new Date(anchor+'T00:00:00'); const y=b.getFullYear(),m=b.getMonth(); const first=new Date(y,m,1); const off=(first.getDay()+6)%7; const dim=new Date(y,m+1,0).getDate();\n const by={}; items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); (by[k]=by[k]||[]).push(e);});\n const dow = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];\n const headers = dow.map(d=>`<div class=\"month-dow\">${d}</div>`).join('');\n let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"month-cell blank\"></div>';\n for(let d=1; d<=dim; d++){\n const dt=new Date(y,m,d), k=ymdLocal(dt);\n const evs=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n cells+=`<div class=\"month-cell\"><div class=\"day-num\">${d}</div>${evs.map(e=>{ const t=e.all_day_event?'All-day':(e.occurrence_start||'').slice(11,16); return eventChip({...e, title:`${t} ${e.title}`}); }).join('')}</div>`;\n }\n eventsEl.innerHTML=`<div class=\"month-dow-grid\">${headers}</div><div class=\"month-grid\">${cells}</div>${collectLegend(items)}`;\n}\nfunction renderYear(items,anchor){\n const y=new Date(anchor+'T00:00:00').getFullYear(); const set=new Set(items.map(e=>(e.occurrence_start||'').slice(0,10))); const n=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n const blocks=Array.from({length:12},(_,m)=>{const f=new Date(y,m,1),off=(f.getDay()+6)%7,dim=new Date(y,m+1,0).getDate(); let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"year-day\"></div>';\n for(let d=1; d<=dim; d++){ const k=ymdLocal(new Date(y,m,d)); cells+=`<div class=\"${set.has(k)?'year-day has-event':'year-day'}\" data-year-date=\"${k}\">${d}</div>`; }\n return `<div class=\"year-month\"><h4>${n[m]}</h4><div class=\"year-days\">${cells}</div></div>`; }).join('');\n eventsEl.innerHTML=`<div class=\"year-grid\">${blocks}</div>`;\n}\nfunction startOfViewPeriod(d, view){\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n if (view === 'week'){ const diff = (x.getDay()+6)%7; x.setDate(x.getDate()-diff); return x; }\n if (view === 'month'){ return new Date(x.getFullYear(), x.getMonth(), 1); }\n if (view === 'year'){ return new Date(x.getFullYear(), 0, 1); }\n return x;\n}\nasync function loadEvents(){ statusEl.textContent='Loading...'; const qs=new URLSearchParams({view:viewEl.value,date:anchorEl.value}); const resp=await fetch(rootPath('/wp-json/calendar/v1/public/events?'+qs.toString())); const payload=await resp.json();\n if(!resp.ok){ statusEl.textContent=payload?.error?.message||'Error'; statusEl.className='err'; return; } let items=payload.data||[];\n futureOnlyWrapEl.style.display = viewEl.value === 'list' ? '' : 'none';\n if(viewEl.value==='list' && futureOnlyEl.checked){ const td=ymdLocal(new Date()); items=items.filter(i=>(i.occurrence_start||'').slice(0,10)>=td); }\n statusEl.textContent=`Loaded ${items.length} item(s)`; statusEl.className='ok';\n if(viewEl.value==='week') renderWeek(items,anchorEl.value); else if(viewEl.value==='month') renderMonth(items,anchorEl.value); else if(viewEl.value==='year') renderYear(items,anchorEl.value); else renderList(items);\n eventsEl.querySelectorAll('[data-edit]').forEach(el=>el.addEventListener('click',async()=>{\n const id=el.getAttribute('data-edit');\n if (session.canWrite) {\n const r=await fetch(apiUrl('/wp-json/calendar/v1/events/'+id),{headers:authHeaders()}); const p=await r.json(); if(p?.data) openModal('edit',p.data);\n return;\n }\n const hit = items.find(i => String(i.event_id) === String(id));\n if (hit) openDetail(hit);\n }));\n eventsEl.querySelectorAll('[data-year-date]').forEach(el=>el.addEventListener('click',()=>{ viewEl.value='week'; anchorEl.value=el.getAttribute('data-year-date'); loadEvents(); }));\n}\nasync function apiWrite(path,method,bodyObj){ const resp=await fetch(apiUrl(path),{method,headers:{'Content-Type':'application/json',...authHeaders()},body:bodyObj?JSON.stringify(bodyObj):undefined}); statusEl.textContent=`${method} ${path} -> ${resp.status}`; statusEl.className=resp.ok?'ok':'err'; return resp; }\nnewEventBtnEl.addEventListener('click',()=>openModal('create',{}));\ndocument.getElementById('closeModalBtn').addEventListener('click',closeModal);\ndocument.getElementById('saveCreateBtn').addEventListener('click',async()=>{await apiWrite('/wp-json/calendar/v1/events','POST',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveUpdateBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'PATCH',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveDeleteBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'DELETE'); closeModal(); loadEvents();});\ndocument.getElementById('toggleSingleOccurrenceBtn').addEventListener('click',async()=>{ const p=document.getElementById('singleOccurrencePanel'); p.style.display = p.style.display==='none'?'':'none'; if(p.style.display!=='none') await loadOccurrenceChooser(); });\ndocument.getElementById('occPrevBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()-1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('occNextBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()+1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('deleteOccurrenceBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; const key=encodeURIComponent(document.getElementById('occKey').value); if(!id||!key) return; await apiWrite('/wp-json/calendar/v1/events/'+id+'/occurrences/'+key,'DELETE'); await loadOccurrenceChooser(); loadEvents();});\ndocument.getElementById('repeatType').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('rangeMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('monthlyNthMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('repeatInterval').addEventListener('input',everyText);\ndocument.getElementById('allDay').addEventListener('change', ()=>{{ applyAllDayVisibility(); updateEventButtons(); }});\n['title','startDate','endDate','startTime','endTime','repeatType','occKey'].forEach(id=>document.getElementById(id).addEventListener('input',updateEventButtons));\nfunction shiftAnchor(dir){\n const d = parseYmd(anchorEl.value);\n const v = viewEl.value;\n const s = startOfViewPeriod(d, v);\n if (v === 'day' || v === 'list') s.setDate(s.getDate() + dir);\n else if (v === 'week') s.setDate(s.getDate() + (7*dir));\n else if (v === 'month') s.setMonth(s.getMonth() + dir);\n else if (v === 'year') s.setFullYear(s.getFullYear() + dir);\n anchorEl.value = ymdLocal(startOfViewPeriod(s, v));\n}\ndocument.getElementById('prevBtn').addEventListener('click',()=>{ shiftAnchor(-1); loadEvents(); });\ndocument.getElementById('nextBtn').addEventListener('click',()=>{ shiftAnchor(1); loadEvents(); });\ndocument.getElementById('todayBtn').addEventListener('click',()=>{ const t = startOfViewPeriod(new Date(), viewEl.value); anchorEl.value = ymdLocal(t); loadEvents(); });\nloginBtnEl.addEventListener('click', ()=> loginModalEl.classList.add('open'));\ndocument.getElementById('closeLoginBtn').addEventListener('click', ()=>{ loginModalEl.classList.remove('open'); showLoginFeedback('', true); });\ndocument.getElementById('closeDetailBtn').addEventListener('click', closeDetail);\nlogoutBtnEl.addEventListener('click', ()=>{ session = { email:'', password:'', user:null, canWrite:false }; refreshAuthUi(); closeModal(); loadEvents(); });\ndocument.getElementById('doLoginBtn').addEventListener('click', async ()=>{\n const email = (document.getElementById('loginEmail').value || '').trim().toLowerCase();\n const password = document.getElementById('loginPassword').value || '';\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/me'), { headers: { Authorization: 'Basic ' + btoa(email + ':' + password) } });\n const payload = await resp.json();\n if (!resp.ok || !payload?.data){\n const msg = 'Login failure';\n statusEl.textContent = msg; statusEl.className='err';\n showLoginFeedback(msg, false);\n return;\n }\n session.email = email;\n session.password = password;\n session.user = payload.data;\n session.canWrite = payload.data.account_status === 'active';\n refreshAuthUi();\n showLoginFeedback('Login succeeded.', true);\n loginModalEl.classList.remove('open');\n loadEvents();\n});\ndocument.getElementById('regBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('regEmail').value || '').trim().toLowerCase(), password: document.getElementById('regPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/register'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Registered. Check your email for a verification link or token.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('verifyBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('verifyToken').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/verify'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = resp.ok\n ? 'An admin will review your request and notify you if approved.'\n : (payload?.error?.message || 'Verify failed');\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('forgotBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('forgotEmail').value || '').trim().toLowerCase() };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/forgot-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'If the account exists, a reset token has been sent by email.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('resetBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('resetToken').value || '', new_password: document.getElementById('resetPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/reset-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Password reset complete';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\nviewEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nanchorEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nfutureOnlyEl.addEventListener('change',loadEvents);\n['loginEmail','loginPassword','regEmail','regPw','verifyToken','forgotEmail','resetToken','resetPw'].forEach(id=>{ const el=document.getElementById(id); el.addEventListener('input', updateAuthButtonStates); });\nupdateAuthButtonStates();\nshowLoginFeedback('', true);\nrefreshAuthUi();\napplyAllDayVisibility();\nupdateEventButtons();\nloadEvents();\n</script>\n\n</body>\n</html>", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 6585\r\n\r\n{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"b2246c0ba36be704\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"97ffb830a549901c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"start_datetime\": \"2026-04-06T09:00:00+01:00\", \"end_datetime\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 10, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0f947e3952fcf681\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"start_datetime\": \"2026-04-08T12:30:00+01:00\", \"end_datetime\": \"2026-04-08T13:30:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4f06e2ef4d6d8e38\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-30T17:00:00+01:00\", \"end_datetime\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-08-31\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"927953eb5c8dd26c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 6, \"uid\": \"fixture-ce-006@calendar-wp-plugin\", \"title\": \"Annual Conference\", \"description\": \"Annual community conference.\", \"location\": \"Main Hall\", \"category\": \"Events\", \"all_day_event\": false, \"start_datetime\": \"2026-06-15T10:00:00+01:00\", \"end_datetime\": \"2026-06-15T17:00:00+01:00\", \"repeat_type\": \"yearly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"93cf1bad962c75f4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"start_datetime\": \"2026-04-07T15:00:00+01:00\", \"end_datetime\": \"2026-04-07T16:00:00+01:00\", \"repeat_type\": \"custom\", \"repeat_interval\": 2, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-07-31\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7201c1345f1b2573\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 8, \"uid\": \"fixture-ce-008@calendar-wp-plugin\", \"title\": \"DST Validation Event\", \"description\": \"Validates DST transition rendering.\", \"location\": \"Lab\", \"category\": \"QA\", \"all_day_event\": false, \"start_datetime\": \"2026-10-25T00:30:00+01:00\", \"end_datetime\": \"2026-10-25T02:30:00+00:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a81452cded01c6a1\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 9, \"uid\": \"fixture-ce-009@calendar-wp-plugin\", \"title\": \"Leap Day Marker\", \"description\": \"Leap day recurrence behavior.\", \"location\": \"Calendar\", \"category\": \"QA\", \"all_day_event\": false, \"start_datetime\": \"2028-02-29T09:00:00+00:00\", \"end_datetime\": \"2028-02-29T10:00:00+00:00\", \"repeat_type\": \"yearly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"978f53232a5bb40f\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}, {\"id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"start_datetime\": \"2026-04-03T14:00:00+01:00\", \"end_datetime\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 8, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"aff80ba990836966\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:53+00:00\"}], \"meta\": {\"count\": 10}}", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c070ea0768ce7e3b\"", "Content-Length": "3132"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"c070ea0768ce7e3b\"\r\nContent-Length: 3132\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b2246c0ba36be704\"", "Content-Length": "364"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"b2246c0ba36be704\"\r\nContent-Length: 364\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "ETag": "\"864b421e254e30ac\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nETag: \"864b421e254e30ac\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"864b421e254e30ac\"", "Content-Length": "288"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"864b421e254e30ac\"\r\nContent-Length: 288\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "ETag": "\"44d2d2c64b2e5412\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nETag: \"44d2d2c64b2e5412\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"44d2d2c64b2e5412\"", "Content-Length": "319"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"44d2d2c64b2e5412\"\r\nContent-Length: 319\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "ETag": "\"fa7dfc8cbf381fc0\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nETag: \"fa7dfc8cbf381fc0\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"fa7dfc8cbf381fc0\"", "Content-Length": "327"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"fa7dfc8cbf381fc0\"\r\nContent-Length: 327\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "ETag": "\"3f65af9c5527a154\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nETag: \"3f65af9c5527a154\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3f65af9c5527a154\"", "Content-Length": "322"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"3f65af9c5527a154\"\r\nContent-Length: 322\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 673\r\n\r\n{\"data\": {\"id\": 15, \"uid\": \"98fd8f149a14e2dddeb7@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"530723cfffec98c3\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:54+00:00\"}}", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"006c790da9929803\"", "Content-Length": "420"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"006c790da9929803\"\r\nContent-Length: 420\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:98fd8f149a14e2dddeb7@calendar-wp-plugin\r\nDTSTAMP:20260330T140854Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 655\r\n\r\n{\"data\": {\"id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"5eeeb56da7d6ae79\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:08:54+00:00\"}}", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 5212\r\n\r\n{\"data\": [{\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-06T10:00:00+00:00\", \"occurrence_end\": \"2026-03-06T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-07T10:00:00+00:00\", \"occurrence_end\": \"2026-03-07T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-08T10:00:00+00:00\", \"occurrence_end\": \"2026-03-08T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-09T10:00:00+00:00\", \"occurrence_end\": \"2026-03-09T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-10T10:00:00+00:00\", \"occurrence_end\": \"2026-03-10T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-12T10:00:00+00:00\", \"occurrence_end\": \"2026-03-12T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-13T10:00:00+00:00\", \"occurrence_end\": \"2026-03-13T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-14T10:00:00+00:00\", \"occurrence_end\": \"2026-03-14T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-15T10:00:00+00:00\", \"occurrence_end\": \"2026-03-15T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-16T10:00:00+00:00\", \"occurrence_end\": \"2026-03-16T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-17T10:00:00+00:00\", \"occurrence_end\": \"2026-03-17T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-18T10:00:00+00:00\", \"occurrence_end\": \"2026-03-18T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-19T10:00:00+00:00\", \"occurrence_end\": \"2026-03-19T11:00:00+00:00\", \"repeat_type\": \"daily\"}]}", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 4906\r\n\r\n{\"data\": [{\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-06T10:00:00+00:00\", \"occurrence_end\": \"2026-03-06T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-07T10:00:00+00:00\", \"occurrence_end\": \"2026-03-07T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-08T10:00:00+00:00\", \"occurrence_end\": \"2026-03-08T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-09T10:00:00+00:00\", \"occurrence_end\": \"2026-03-09T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-12T10:00:00+00:00\", \"occurrence_end\": \"2026-03-12T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-13T10:00:00+00:00\", \"occurrence_end\": \"2026-03-13T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-14T10:00:00+00:00\", \"occurrence_end\": \"2026-03-14T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-15T10:00:00+00:00\", \"occurrence_end\": \"2026-03-15T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-16T10:00:00+00:00\", \"occurrence_end\": \"2026-03-16T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-17T10:00:00+00:00\", \"occurrence_end\": \"2026-03-17T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-18T10:00:00+00:00\", \"occurrence_end\": \"2026-03-18T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ddec804fa982f5df9ed5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-19T10:00:00+00:00\", \"occurrence_end\": \"2026-03-19T11:00:00+00:00\", \"repeat_type\": \"daily\"}]}", "body_truncated": false}}
{"ts": "2026-03-30T14:08:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:08:54 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:08:54 GMT\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 43446\r\n\r\n<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Calendar</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, sans-serif; margin: 0; background: #f7f7f5; color: #1f2937; }\n header { background: #0f766e; color: #fff; padding: 14px 18px; }\n header a { color: #fff; margin-right: 10px; }\n main { max-width: 1100px; margin: 18px auto; padding: 0 12px; }\n .card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 12px; margin-bottom: 12px; }\n input, select, textarea, button { font: inherit; }\n button { padding: 7px 10px; border: 1px solid #d1d5db; border-radius: 8px; background: #fff; cursor: pointer; }\n button:disabled { opacity: 0.45; cursor: not-allowed; }\n table { width: 100%; border-collapse: collapse; }\n th, td { border-bottom: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top; }\n .row { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 8px; }\n .muted { color: #6b7280; font-size: 0.9rem; }\n .ok { color: #065f46; }\n .err { color: #991b1b; }\n .grid3 { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:8px; }\n .grid4 { display:grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap:8px; }\n .field { position: relative; margin: 14px 0; }\n .field > label { position:absolute; top:-0.62rem; left:0.6rem; font-size:0.72rem; line-height:1; background:#fff; padding:0 0.25rem; color:#4b5563; letter-spacing:0.01em; }\n .field > input, .field > select, .field > textarea {\n width: 100%; box-sizing: border-box; padding: 0.78rem 0.65rem 0.5rem 0.65rem;\n border: 1px solid #cbd5e1; border-radius: 8px; background: #fff;\n }\n .field-with-suffix > input { padding-right: 5.5rem; }\n .input-suffix {\n position: absolute; right: 0.7rem; top: 56%;\n transform: translateY(-50%); color: #374151; font-size: 0.84rem; pointer-events: none;\n }\n .toolbar { display:flex; gap:8px; flex-wrap: wrap; align-items: end; }\n #topControls { align-items: center; }\n .topbar { display:flex; justify-content:space-between; gap:10px; align-items:flex-start; flex-wrap:wrap; }\n .topbar-right { margin-left:auto; text-align:right; min-width: 220px; }\n .topbar-right a { display:block; margin-bottom:4px; }\n .toggle-wrap { display:flex; align-items:center; padding: 0 2px; min-height: 38px; }\n .toggle-wrap label { position: static; font-size: 0.9rem; background: transparent; padding: 0; }\n .modal { position: fixed; inset: 0; background: rgba(15,23,42,0.45); display: none; align-items: center; justify-content: center; z-index: 1000; }\n .modal.open { display:flex; }\n .modal-card { width: min(900px, 92vw); max-height: 92vh; overflow: auto; background: #fff; border-radius: 10px; padding: 12px; }\n .week-grid { display:grid; grid-template-columns: 56px repeat(7, 1fr); gap:8px; }\n .time-scale { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .time-scale .week-head { text-align:center; }\n .time-scale .time-lane { font-size:0.68rem; color:#6b7280; }\n .time-label { position:absolute; left:4px; transform: translateY(-50%); }\n .week-day { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .week-head { padding:6px; border-bottom:1px solid #e5e7eb; font-size:0.85rem; font-weight:600; }\n .all-day-list { min-height:24px; padding:4px; border-bottom:1px dashed #e5e7eb; font-size:0.75rem; }\n .time-lane { position:relative; height: 960px; background:\n repeating-linear-gradient(to bottom, #f8fafc 0, #f8fafc 39px, #eef2f7 39px, #eef2f7 40px); }\n .week-event { position:absolute; background:#dcfce7; border:1px solid #86efac; border-radius:6px; font-size:0.72rem; padding:2px 4px; overflow:hidden; cursor:pointer; box-shadow: 0 1px 2px rgba(0,0,0,0.08); }\n .week-event:hover { filter: brightness(0.97); transform: translateY(-1px); }\n .month-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; }\n .month-dow-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; margin-bottom: 6px; }\n .month-dow { font-size: 0.78rem; font-weight: 700; color: #4b5563; text-align: center; }\n .month-cell { min-height:130px; border:1px solid #e5e7eb; border-radius:8px; background:#fff; padding:5px; }\n .month-cell.blank { background:#f3f4f6; }\n .day-num { font-size:0.82rem; font-weight:700; }\n .mini-evt { font-size:0.72rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid var(--accent, #34d399); background: color-mix(in srgb, var(--accent, #34d399) 12%, white); padding:2px 4px; margin-top:3px; cursor:pointer; border-radius:4px; }\n .mini-evt:hover { filter: brightness(0.97); }\n .year-grid { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:10px; }\n .year-month { border:1px solid #e5e7eb; border-radius:8px; padding:6px; background:#fff; }\n .year-month h4 { margin: 3px 0 6px; font-size:0.9rem; }\n .year-days { display:grid; grid-template-columns: repeat(7, 1fr); gap:3px; }\n .year-day { font-size:0.7rem; border:1px solid #edf2f7; border-radius:4px; min-height:22px; text-align:center; line-height:22px; }\n .year-day.has-event { font-weight: 700; background: #ecfeff; border-color: #67e8f9; }\n .legend { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }\n .legend .chip { border:1px solid #e5e7eb; border-left: 4px solid var(--accent,#34d399); border-radius: 6px; padding: 3px 8px; font-size: 0.75rem; background:#fff; }\n #occurrenceGrid .year-grid { grid-template-columns: repeat(3, minmax(220px, 1fr)); gap: 10px; align-items: start; }\n #occurrenceGrid .month-grid { gap: 4px; }\n #occurrenceGrid .month-cell { min-height: 24px; padding: 3px; }\n #occurrenceGrid .day-num { font-size: 0.76rem; line-height: 1.1; text-align: center; }\n #occurrenceGrid .month-cell.active { background: #ecfeff; border-color: #67e8f9; }\n #loginModal .field > label {\n position: static;\n display: inline-block;\n margin: 0 0 0.2rem;\n font-size: 0.8rem;\n background: transparent;\n padding: 0;\n color: #4b5563;\n }\n #loginModal .field > input {\n padding: 0.6rem 0.65rem;\n }\n </style>\n</head>\n<body>\n\n<header><strong>Calendar Fixture</strong> <span class=\"muted\">Public Calendar UI</span></header>\n<main>\n <div class=\"card\">\n <div class=\"topbar\">\n <div class=\"toolbar\" id=\"topControls\">\n <div class=\"field\"><label>View</label>\n <select id=\"view\">\n <option value=\"list\">List</option>\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\" selected>Month</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n <div class=\"field\"><label>Date</label><input id=\"anchor\" type=\"date\" /></div>\n <div id=\"futureOnlyWrap\" class=\"toggle-wrap\"><label><input id=\"futureOnly\" type=\"checkbox\" checked /> Future Only</label></div>\n <button id=\"prevBtn\" title=\"Previous\">&#8592;</button>\n <button id=\"todayBtn\" title=\"Today\">&#128197;</button>\n <button id=\"nextBtn\" title=\"Next\">&#8594;</button>\n <button id=\"newEventBtn\">Create Event</button>\n <button id=\"loginBtn\">Login</button>\n </div>\n <div class=\"topbar-right\">\n <a href=\"/calendar.ics\" target=\"_blank\">ICS Link</a>\n <a href=\"/caldav/\" target=\"_blank\">CalDAV</a>\n <div id=\"status\" class=\"muted\"></div>\n <div id=\"authState\" class=\"muted\"></div>\n <button id=\"logoutBtn\" style=\"display:none\">Logout</button>\n </div>\n </div>\n </div>\n <div id=\"events\"></div>\n <div id=\"loginModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Account Login</h3>\n <div id=\"loginFeedback\" class=\"muted\"></div>\n <div class=\"row\">\n <div class=\"field\"><label>Email</label><input id=\"loginEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password</label><input id=\"loginPassword\" type=\"password\" /></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"doLoginBtn\" disabled>Login</button>\n <button id=\"closeLoginBtn\">Close</button>\n </div>\n <div class=\"card\">\n <h4>Register</h4>\n <div class=\"field\"><label>Email</label><input id=\"regEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password (8+ chars)</label><input id=\"regPw\" type=\"password\" /></div>\n <div class=\"toolbar\"><button id=\"regBtn\" disabled>Register</button></div>\n <div class=\"field\"><label>Verify Token</label><input id=\"verifyToken\" /></div>\n <div class=\"toolbar\"><button id=\"verifyBtn\" disabled>Verify Email</button></div>\n </div>\n <div class=\"card\">\n <h4>Password Recovery</h4>\n <div class=\"field\"><label>Email</label><input id=\"forgotEmail\" type=\"email\" /></div>\n <button id=\"forgotBtn\" disabled>Send Reset Token</button>\n <div class=\"field\"><label>Reset Token</label><input id=\"resetToken\" /></div>\n <div class=\"field\"><label>New Password</label><input id=\"resetPw\" type=\"password\" /></div>\n <button id=\"resetBtn\" disabled>Reset Password</button>\n </div>\n </div>\n </div>\n <div id=\"detailModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Event Details</h3>\n <div class=\"field\"><label>Title</label><input id=\"detailTitle\" readonly /></div>\n <div class=\"field\"><label>Category</label><input id=\"detailCategory\" readonly /></div>\n <div class=\"field\"><label>Description</label><textarea id=\"detailDescription\" rows=\"5\" readonly></textarea></div>\n <div class=\"toolbar\"><button id=\"closeDetailBtn\">Close</button></div>\n </div>\n </div>\n <div id=\"modal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3 id=\"modalTitle\">Event</h3>\n <input id=\"eventId\" type=\"hidden\" />\n <div class=\"field\"><label>Title</label><input id=\"title\" /></div>\n <div class=\"row\">\n <div class=\"field\"><label>Location</label><input id=\"location\" /></div>\n <div class=\"field\"><label>Category</label><input id=\"category\" /></div>\n </div>\n <div class=\"field\"><label>Description</label><textarea id=\"description\" rows=\"3\"></textarea></div>\n <div class=\"toggle-wrap\"><label><input id=\"allDay\" type=\"checkbox\" /> All Day Event</label></div>\n <div class=\"grid4\">\n <div class=\"field\"><label>Start Date</label><input id=\"startDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"startTimeWrap\"><label>Start Time</label><input id=\"startTime\" type=\"time\" /></div>\n <div class=\"field\"><label>End Date</label><input id=\"endDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"endTimeWrap\"><label>End Time</label><input id=\"endTime\" type=\"time\" /></div>\n </div>\n <div class=\"row\">\n <div class=\"field\"><label>Repeat Type</label>\n <select id=\"repeatType\">\n <option value=\"none\">none</option>\n <option value=\"daily\">daily</option>\n <option value=\"weekly\">weekly</option>\n <option value=\"monthly\">monthly</option>\n <option value=\"yearly\">yearly</option>\n <option value=\"custom\">custom</option>\n </select>\n </div>\n <div class=\"field field-with-suffix\" id=\"repeatIntervalWrap\"><label>Every</label><input id=\"repeatInterval\" type=\"number\" min=\"1\" value=\"1\" /><span id=\"repeatIntervalText\" class=\"input-suffix\"></span></div>\n </div>\n <div class=\"row\" id=\"modeUntilRow\">\n <div class=\"field\"><label>Mode</label>\n <select id=\"rangeMode\">\n <option value=\"none\">none</option>\n <option value=\"no_end\">no_end</option>\n <option value=\"count\">count</option>\n <option value=\"until\">until</option>\n </select>\n </div>\n <div class=\"field\" id=\"repeatUntilWrap\"><label>Repeat Until</label><input id=\"repeatUntil\" type=\"date\" /></div>\n </div>\n <div class=\"row\" id=\"rangeWrap\">\n <div class=\"field\" id=\"repeatCountWrap\"><label>Repeat Count</label><input id=\"repeatCount\" type=\"number\" min=\"1\" /></div>\n </div>\n <div class=\"row\" id=\"monthlyNthWrap\">\n <div class=\"field\"><label>Monthly Pattern</label>\n <select id=\"monthlyNthMode\">\n <option value=\"\">from start date</option>\n <option value=\"day_of_month\">nth day of month</option>\n <option value=\"weekday_of_month\">nth weekday of month</option>\n </select>\n </div>\n <div class=\"field\" id=\"nthDayWrap\"><label>Day Number</label><input id=\"nthDay\" type=\"number\" min=\"1\" max=\"31\" /></div>\n </div>\n <div class=\"row\" id=\"nthWeekdayWrap\">\n <div class=\"field\"><label>Nth</label><select id=\"nthPos\"><option value=\"1\">1st</option><option value=\"2\">2nd</option><option value=\"3\">3rd</option><option value=\"4\">4th</option><option value=\"5\">5th</option><option value=\"-1\">last</option></select></div>\n <div class=\"field\"><label>Weekday</label><select id=\"nthWeekday\"><option value=\"0\">Sunday</option><option value=\"1\">Monday</option><option value=\"2\">Tuesday</option><option value=\"3\">Wednesday</option><option value=\"4\">Thursday</option><option value=\"5\">Friday</option><option value=\"6\">Saturday</option></select></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"saveCreateBtn\">Create</button>\n <button id=\"saveUpdateBtn\">Update</button>\n <button id=\"saveDeleteBtn\">Delete</button>\n <button id=\"toggleSingleOccurrenceBtn\">Delete a Single Occurrence</button>\n <button id=\"closeModalBtn\">Close</button>\n </div>\n <div class=\"card\" id=\"singleOccurrencePanel\" style=\"display:none\">\n <h4>Delete Single Occurrence (Exception)</h4>\n <div class=\"toolbar\">\n <button id=\"occPrevBtn\">&#8592;</button>\n <button id=\"occNextBtn\">&#8594;</button>\n </div>\n <div id=\"occurrenceGrid\" class=\"month-grid\"></div>\n <input id=\"occKey\" type=\"hidden\" />\n <div class=\"field\"><label>Occurrence</label><input id=\"occKeyDisplay\" readonly placeholder=\"Select an occurrence from the calendar above\" /></div>\n <button id=\"deleteOccurrenceBtn\">Delete Occurrence</button>\n </div>\n </div>\n </div>\n</main>\n<script>\nconst statusEl = document.getElementById('status');\nconst authStateEl = document.getElementById('authState');\nconst loginFeedbackEl = document.getElementById('loginFeedback');\nconst eventsEl = document.getElementById('events');\nconst viewEl = document.getElementById('view');\nconst anchorEl = document.getElementById('anchor');\nconst futureOnlyWrapEl = document.getElementById('futureOnlyWrap');\nconst futureOnlyEl = document.getElementById('futureOnly');\nconst modalEl = document.getElementById('modal');\nconst loginModalEl = document.getElementById('loginModal');\nconst detailModalEl = document.getElementById('detailModal');\nconst loginBtnEl = document.getElementById('loginBtn');\nconst logoutBtnEl = document.getElementById('logoutBtn');\nconst newEventBtnEl = document.getElementById('newEventBtn');\nconst ROOT = \"\";\nlet session = { email:'', password:'', user:null, canWrite:false };\nviewEl.value = 'month';\nfunction pad2(n){ return String(n).padStart(2,'0'); }\nfunction ymdLocal(d){ return `${d.getFullYear()}-${pad2(d.getMonth()+1)}-${pad2(d.getDate())}`; }\nfunction parseYmd(s){ const p=(s||'').split('-'); if(p.length!==3) return new Date(); return new Date(Number(p[0]), Number(p[1])-1, Number(p[2])); }\nanchorEl.value = ymdLocal(new Date());\nfunction rootPath(path){ return ROOT + path; }\nfunction apiUrl(path) { return rootPath(path); }\nfunction authHeaders(){ return session.email && session.password ? { Authorization: 'Basic ' + btoa(session.email + ':' + session.password) } : {}; }\nfunction isEmail(v){ return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((v||'').trim()); }\nfunction showLoginFeedback(msg, ok){\n loginFeedbackEl.textContent = msg || '';\n loginFeedbackEl.className = ok ? 'ok' : (msg ? 'err' : 'muted');\n}\nfunction updateAuthButtonStates(){\n const loginEmail = document.getElementById('loginEmail').value || '';\n const loginPw = document.getElementById('loginPassword').value || '';\n const regEmail = document.getElementById('regEmail').value || '';\n const regPw = document.getElementById('regPw').value || '';\n const verifyToken = document.getElementById('verifyToken').value || '';\n const forgotEmail = document.getElementById('forgotEmail').value || '';\n const resetToken = document.getElementById('resetToken').value || '';\n const resetPw = document.getElementById('resetPw').value || '';\n document.getElementById('doLoginBtn').disabled = !(isEmail(loginEmail) && loginPw.length >= 8);\n document.getElementById('regBtn').disabled = !(isEmail(regEmail) && regPw.length >= 8);\n document.getElementById('verifyBtn').disabled = !verifyToken.trim();\n document.getElementById('forgotBtn').disabled = !isEmail(forgotEmail);\n document.getElementById('resetBtn').disabled = !(resetToken.trim() && resetPw.length >= 8);\n}\nfunction refreshAuthUi(){\n const logged = !!session.user;\n loginBtnEl.style.display = logged ? 'none' : '';\n logoutBtnEl.style.display = logged ? '' : 'none';\n newEventBtnEl.style.display = session.canWrite ? '' : 'none';\n authStateEl.textContent = logged\n ? `Logged in as ${session.user.email}`\n : 'Public mode: read-only';\n updateEventButtons();\n}\nfunction splitIsoToInputs(iso) { if (!iso) return {d:'',t:''}; if (!iso.includes('T')) return {d:iso.slice(0,10),t:''}; return {d:iso.slice(0,10),t:iso.slice(11,16)}; }\nfunction toIso(d,t,allDay){ if(!d) return ''; if(allDay) return d; return `${d}T${(t||'00:00')}:00+01:00`; }\nfunction formatOccurrenceKey(iso){\n if (!iso) return '';\n const dt = new Date(iso);\n if (Number.isNaN(dt.getTime())) return iso;\n return dt.toLocaleString('en-GB', { year:'numeric', month:'short', day:'2-digit', hour:'2-digit', minute:'2-digit' });\n}\nfunction applyAllDayVisibility(){\n const allDay = !!document.getElementById('allDay').checked;\n document.getElementById('startTimeWrap').style.display = allDay ? 'none' : '';\n document.getElementById('endTimeWrap').style.display = allDay ? 'none' : '';\n}\nlet occCursor = new Date();\nfunction everyText(){\n const n = Number(document.getElementById('repeatInterval').value || 1);\n const rt = document.getElementById('repeatType').value;\n const unit = rt === 'daily' ? 'day' : rt === 'weekly' ? 'week' : rt === 'monthly' ? 'month' : rt === 'yearly' ? 'year' : rt === 'custom' ? 'week' : '';\n document.getElementById('repeatIntervalText').textContent = unit ? `${unit}${n===1?'':'s'}` : '';\n}\nfunction applyRecurrenceVisibility(){ const rt=document.getElementById('repeatType').value; const rm=document.getElementById('rangeMode').value; const show=rt!=='none';\n document.getElementById('repeatIntervalWrap').style.display=show?'':'none';\n document.getElementById('modeUntilRow').style.display=show?'':'none';\n document.getElementById('rangeWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatCountWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatUntilWrap').style.display=(show&&rm==='until')?'':'none';\n document.getElementById('monthlyNthWrap').style.display=(rt==='monthly')?'':'none';\n const m = document.getElementById('monthlyNthMode').value;\n document.getElementById('nthDayWrap').style.display=(rt==='monthly' && m==='day_of_month')?'':'none';\n document.getElementById('nthWeekdayWrap').style.display=(rt==='monthly' && m==='weekday_of_month')?'':'none';\n document.getElementById('toggleSingleOccurrenceBtn').style.display=show?'':'none';\n if (!show) document.getElementById('singleOccurrencePanel').style.display='none';\n everyText();\n updateEventButtons();\n}\nfunction openModal(mode,evt){ if(!evt) evt={}; const sd=splitIsoToInputs(evt.start_datetime), ed=splitIsoToInputs(evt.end_datetime);\n if (!session.canWrite) return;\n document.getElementById('modalTitle').textContent=mode==='create'?'Create Event':'Edit Event';\n document.getElementById('eventId').value=evt.id||''; document.getElementById('title').value=evt.title||''; document.getElementById('location').value=evt.location||'';\n document.getElementById('category').value=evt.category||''; document.getElementById('description').value=evt.description||'';\n document.getElementById('allDay').checked=!!evt.all_day_event; document.getElementById('startDate').value=sd.d||''; document.getElementById('startTime').value=sd.t||'';\n document.getElementById('endDate').value=ed.d||''; document.getElementById('endTime').value=ed.t||''; document.getElementById('repeatType').value=evt.repeat_type||'none';\n document.getElementById('repeatInterval').value=evt.repeat_interval||1; document.getElementById('rangeMode').value=evt.repeat_range_mode||'none';\n document.getElementById('repeatCount').value=evt.repeat_count||''; document.getElementById('repeatUntil').value=evt.repeat_until||'';\n document.getElementById('monthlyNthMode').value=evt.repeat_nth_mode||'';\n document.getElementById('nthDay').value=evt.repeat_nth_day||'';\n document.getElementById('nthPos').value=evt.repeat_nth_pos||'1';\n document.getElementById('nthWeekday').value=evt.repeat_nth_weekday===null||evt.repeat_nth_weekday===undefined?'0':String(evt.repeat_nth_weekday);\n document.getElementById('singleOccurrencePanel').style.display='none';\n document.getElementById('occKey').value = '';\n document.getElementById('occKeyDisplay').value = '';\n occCursor = new Date((evt.start_datetime||new Date().toISOString()).slice(0,10) + 'T00:00:00');\n document.getElementById('toggleSingleOccurrenceBtn').style.display = mode==='edit' ? '' : 'none';\n document.getElementById('saveCreateBtn').style.display=mode==='create'?'':'none'; document.getElementById('saveUpdateBtn').style.display=mode==='edit'?'':'none';\n document.getElementById('saveDeleteBtn').style.display=mode==='edit'?'':'none'; applyRecurrenceVisibility(); modalEl.classList.add('open');\n applyAllDayVisibility();\n updateEventButtons();\n}\nfunction closeModal(){ modalEl.classList.remove('open'); }\nfunction openDetail(item){\n document.getElementById('detailTitle').value = item?.title || '';\n document.getElementById('detailCategory').value = item?.category || '';\n document.getElementById('detailDescription').value = item?.description || '';\n detailModalEl.classList.add('open');\n}\nfunction closeDetail(){ detailModalEl.classList.remove('open'); }\nfunction updateEventButtons(){\n const titleOk = !!(document.getElementById('title').value || '').trim();\n const startDate = (document.getElementById('startDate').value || '').trim();\n const endDateRaw = (document.getElementById('endDate').value || '').trim();\n const endDate = endDateRaw || startDate;\n const allDay = !!document.getElementById('allDay').checked;\n const startTime = (document.getElementById('startTime').value || '').trim();\n const endTime = (document.getElementById('endTime').value || '').trim();\n let validDateTime = false;\n if (startDate && endDate && endDate >= startDate){\n if (allDay){\n validDateTime = true;\n } else if (startTime && endTime){\n validDateTime = endDate > startDate || endTime >= startTime;\n }\n }\n const hasCore = titleOk && validDateTime;\n const hasId = !!(document.getElementById('eventId').value || '').trim();\n document.getElementById('saveCreateBtn').disabled = !(session.canWrite && hasCore && !hasId);\n document.getElementById('saveUpdateBtn').disabled = !(session.canWrite && hasCore && hasId);\n document.getElementById('saveDeleteBtn').disabled = !(session.canWrite && hasId);\n document.getElementById('toggleSingleOccurrenceBtn').disabled = !(session.canWrite && hasId && document.getElementById('repeatType').value !== 'none');\n document.getElementById('deleteOccurrenceBtn').disabled = !(session.canWrite && hasId && (document.getElementById('occKey').value || '').trim());\n}\nfunction eventPayload(){ const ad=document.getElementById('allDay').checked; return {\n title:document.getElementById('title').value, location:document.getElementById('location').value, category:document.getElementById('category').value,\n description:document.getElementById('description').value, all_day_event:ad,\n start_datetime:toIso(document.getElementById('startDate').value,document.getElementById('startTime').value,ad),\n end_datetime:toIso((document.getElementById('endDate').value || document.getElementById('startDate').value),document.getElementById('endTime').value,ad),\n repeat_type:document.getElementById('repeatType').value, repeat_interval:Number(document.getElementById('repeatInterval').value||1),\n repeat_nth_mode:document.getElementById('monthlyNthMode').value,\n repeat_nth_day:document.getElementById('nthDay').value?Number(document.getElementById('nthDay').value):null,\n repeat_nth_pos:document.getElementById('nthPos').value?Number(document.getElementById('nthPos').value):null,\n repeat_nth_weekday:document.getElementById('nthWeekday').value === '' ? null : Number(document.getElementById('nthWeekday').value),\n repeat_range_mode:document.getElementById('rangeMode').value, repeat_count:document.getElementById('repeatCount').value?Number(document.getElementById('repeatCount').value):null,\n repeat_until:document.getElementById('repeatUntil').value||null\n};}\nasync function loadOccurrenceChooser(){\n const id = document.getElementById('eventId').value;\n if (!id) return;\n const from = new Date(occCursor.getFullYear(), occCursor.getMonth(), 1);\n const fromS = ymdLocal(from);\n const r = await fetch(apiUrl('/wp-json/calendar/v1/events/' + id + '/occurrences?from=' + fromS + '&months=3'), {headers:authHeaders()});\n const p = await r.json();\n const list = p.data || [];\n const dayToKey = new Map();\n list.forEach(x => {\n const d = (x.occurrence_start || '').slice(0,10);\n if (d && !dayToKey.has(d)) dayToKey.set(d, x.occurrence_start);\n });\n const cells = [];\n for(let m=0;m<3;m++){\n const d = new Date(from.getFullYear(), from.getMonth()+m, 1);\n const y=d.getFullYear(), mo=d.getMonth();\n const first=new Date(y,mo,1), off=(first.getDay()+6)%7, dim=new Date(y,mo+1,0).getDate();\n let monthCells=''; for(let i=0;i<off;i++) monthCells += '<div class=\"month-cell blank\"></div>';\n for(let day=1; day<=dim; day++){\n const dt=new Date(y,mo,day); const k=ymdLocal(dt); const has=dayToKey.has(k);\n monthCells += `<div class=\"month-cell ${has?'active':'blank'}\"><div class=\"day-num\" data-occ-date=\"${k}\" style=\"cursor:${has?'pointer':'default'}\">${day}</div></div>`;\n }\n cells.push(`<div class=\"year-month\"><h4>${d.toLocaleString('en-GB',{month:'short',year:'numeric'})}</h4><div class=\"month-grid\">${monthCells}</div></div>`);\n }\n document.getElementById('occurrenceGrid').innerHTML = `<div class=\"year-grid\">${cells.join('')}</div>`;\n document.querySelectorAll('[data-occ-date]').forEach(el=>el.addEventListener('click',()=>{\n const k=el.getAttribute('data-occ-date'); if(!dayToKey.has(k)) return;\n const iso = dayToKey.get(k) || '';\n document.getElementById('occKey').value = iso;\n document.getElementById('occKeyDisplay').value = formatOccurrenceKey(iso);\n updateEventButtons();\n }));\n}\nfunction startMinutes(iso){ if(!iso||!iso.includes('T')) return 0; return Number(iso.slice(11,13))*60+Number(iso.slice(14,16)); }\nfunction categoryColor(category){\n const base = (category || 'general').toLowerCase();\n let h = 0; for (let i = 0; i < base.length; i++) h = (h * 31 + base.charCodeAt(i)) % 360;\n return `hsl(${h} 70% 45%)`;\n}\nfunction eventChip(e, cls='mini-evt'){ return `<div class=\"${cls}\" data-edit=\"${e.event_id}\" style=\"--accent:${categoryColor(e.category)}\">${e.title}</div>`; }\nfunction collectLegend(items){\n const map = new Map();\n items.forEach(e => { const c = e.category || 'Uncategorised'; if (!map.has(c)) map.set(c, categoryColor(c)); });\n return `<div class=\"legend\">${Array.from(map.entries()).map(([k,v]) => `<div class=\"chip\" style=\"--accent:${v}\">${k}</div>`).join('')}</div>`;\n}\nfunction renderList(items){\n const fmt = (e) => {\n const sd = (e.occurrence_start||'').slice(0,10);\n const st = e.all_day_event ? 'All-day' : (e.occurrence_start||'').slice(11,16);\n const et = e.all_day_event ? 'All-day' : (e.occurrence_end||'').slice(11,16);\n const desc = (e.description || '').trim() || e.title || '';\n return `${sd} ${st}--${et} ${desc}`;\n };\n eventsEl.innerHTML=(items.map(e=>`<div class=\"card\">${fmt(e)}</div>`).join('')||'<div class=\"card\">No events in this window.</div>');\n}\nfunction layoutTimedEvents(dayItems){\n const events = dayItems.slice().sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n let i = 0; const out = [];\n while (i < events.length){\n let clusterEnd = startMinutes(events[i].occurrence_end);\n const cluster = [events[i]];\n let j = i + 1;\n while (j < events.length && startMinutes(events[j].occurrence_start) < clusterEnd){\n cluster.push(events[j]); clusterEnd = Math.max(clusterEnd, startMinutes(events[j].occurrence_end)); j++;\n }\n const active = []; let maxCols = 0;\n const placed = cluster.map(e => {\n const start = startMinutes(e.occurrence_start), end = startMinutes(e.occurrence_end);\n for (let k = active.length - 1; k >= 0; k--) if (active[k].end <= start) active.splice(k,1);\n const used = new Set(active.map(a => a.col));\n let col = 0; while (used.has(col)) col++;\n active.push({ end, col }); maxCols = Math.max(maxCols, col + 1);\n return { e, start, end, col };\n });\n placed.forEach(p => out.push({ ...p, span: maxCols }));\n i = j;\n }\n return out;\n}\nfunction renderWeek(items,anchor){\n const d=new Date(anchor+'T00:00:00'); const diff=(d.getDay()+6)%7; d.setDate(d.getDate()-diff);\n const days=Array.from({length:7},(_,i)=>new Date(d.getFullYear(),d.getMonth(),d.getDate()+i)); const by=Object.fromEntries(days.map(x=>[ymdLocal(x),[]]));\n items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); if(by[k]) by[k].push(e);});\n const scaleLabels = Array.from({length:24}, (_,h)=>`<div class=\"time-label\" style=\"top:${h*40}px\">${String(h).padStart(2,'0')}:00</div>`).join('');\n const cols=days.map(dt=>{\n const k=ymdLocal(dt); const day=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n const ad=day.filter(x=>x.all_day_event), td=day.filter(x=>!x.all_day_event);\n const blocks=layoutTimedEvents(td).map(p=>{\n const top=Math.max(0,p.start/1.5), h=Math.max(24,(p.end-p.start)/1.5);\n const widthPct=100/p.span; const left=`calc(${p.col*widthPct}% + 2px)`; const width=`calc(${widthPct}% - 4px)`;\n const st = (p.e.occurrence_start||'').slice(11,16);\n return `<div class=\"week-event\" data-edit=\"${p.e.event_id}\" style=\"top:${top}px;height:${h}px;left:${left};width:${width};--accent:${categoryColor(p.e.category)};border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, white);\">${st} ${p.e.title}</div>`;\n }).join('');\n return `<div class=\"week-day\"><div class=\"week-head\">${dt.toDateString().slice(0,10)}</div><div class=\"all-day-list\">${ad.map(e=>eventChip(e)).join('')}</div><div class=\"time-lane\">${blocks}</div></div>`;\n }).join('');\n const scaleCol = `<div class=\"time-scale\"><div class=\"week-head\">Time</div><div class=\"time-lane\">${scaleLabels}</div></div>`;\n eventsEl.innerHTML=`<div class=\"week-grid\">${scaleCol}${cols}</div>${collectLegend(items)}`;\n}\nfunction renderMonth(items,anchor){\n const b=new Date(anchor+'T00:00:00'); const y=b.getFullYear(),m=b.getMonth(); const first=new Date(y,m,1); const off=(first.getDay()+6)%7; const dim=new Date(y,m+1,0).getDate();\n const by={}; items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); (by[k]=by[k]||[]).push(e);});\n const dow = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];\n const headers = dow.map(d=>`<div class=\"month-dow\">${d}</div>`).join('');\n let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"month-cell blank\"></div>';\n for(let d=1; d<=dim; d++){\n const dt=new Date(y,m,d), k=ymdLocal(dt);\n const evs=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n cells+=`<div class=\"month-cell\"><div class=\"day-num\">${d}</div>${evs.map(e=>{ const t=e.all_day_event?'All-day':(e.occurrence_start||'').slice(11,16); return eventChip({...e, title:`${t} ${e.title}`}); }).join('')}</div>`;\n }\n eventsEl.innerHTML=`<div class=\"month-dow-grid\">${headers}</div><div class=\"month-grid\">${cells}</div>${collectLegend(items)}`;\n}\nfunction renderYear(items,anchor){\n const y=new Date(anchor+'T00:00:00').getFullYear(); const set=new Set(items.map(e=>(e.occurrence_start||'').slice(0,10))); const n=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n const blocks=Array.from({length:12},(_,m)=>{const f=new Date(y,m,1),off=(f.getDay()+6)%7,dim=new Date(y,m+1,0).getDate(); let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"year-day\"></div>';\n for(let d=1; d<=dim; d++){ const k=ymdLocal(new Date(y,m,d)); cells+=`<div class=\"${set.has(k)?'year-day has-event':'year-day'}\" data-year-date=\"${k}\">${d}</div>`; }\n return `<div class=\"year-month\"><h4>${n[m]}</h4><div class=\"year-days\">${cells}</div></div>`; }).join('');\n eventsEl.innerHTML=`<div class=\"year-grid\">${blocks}</div>`;\n}\nfunction startOfViewPeriod(d, view){\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n if (view === 'week'){ const diff = (x.getDay()+6)%7; x.setDate(x.getDate()-diff); return x; }\n if (view === 'month'){ return new Date(x.getFullYear(), x.getMonth(), 1); }\n if (view === 'year'){ return new Date(x.getFullYear(), 0, 1); }\n return x;\n}\nasync function loadEvents(){ statusEl.textContent='Loading...'; const qs=new URLSearchParams({view:viewEl.value,date:anchorEl.value}); const resp=await fetch(rootPath('/wp-json/calendar/v1/public/events?'+qs.toString())); const payload=await resp.json();\n if(!resp.ok){ statusEl.textContent=payload?.error?.message||'Error'; statusEl.className='err'; return; } let items=payload.data||[];\n futureOnlyWrapEl.style.display = viewEl.value === 'list' ? '' : 'none';\n if(viewEl.value==='list' && futureOnlyEl.checked){ const td=ymdLocal(new Date()); items=items.filter(i=>(i.occurrence_start||'').slice(0,10)>=td); }\n statusEl.textContent=`Loaded ${items.length} item(s)`; statusEl.className='ok';\n if(viewEl.value==='week') renderWeek(items,anchorEl.value); else if(viewEl.value==='month') renderMonth(items,anchorEl.value); else if(viewEl.value==='year') renderYear(items,anchorEl.value); else renderList(items);\n eventsEl.querySelectorAll('[data-edit]').forEach(el=>el.addEventListener('click',async()=>{\n const id=el.getAttribute('data-edit');\n if (session.canWrite) {\n const r=await fetch(apiUrl('/wp-json/calendar/v1/events/'+id),{headers:authHeaders()}); const p=await r.json(); if(p?.data) openModal('edit',p.data);\n return;\n }\n const hit = items.find(i => String(i.event_id) === String(id));\n if (hit) openDetail(hit);\n }));\n eventsEl.querySelectorAll('[data-year-date]').forEach(el=>el.addEventListener('click',()=>{ viewEl.value='week'; anchorEl.value=el.getAttribute('data-year-date'); loadEvents(); }));\n}\nasync function apiWrite(path,method,bodyObj){ const resp=await fetch(apiUrl(path),{method,headers:{'Content-Type':'application/json',...authHeaders()},body:bodyObj?JSON.stringify(bodyObj):undefined}); statusEl.textContent=`${method} ${path} -> ${resp.status}`; statusEl.className=resp.ok?'ok':'err'; return resp; }\nnewEventBtnEl.addEventListener('click',()=>openModal('create',{}));\ndocument.getElementById('closeModalBtn').addEventListener('click',closeModal);\ndocument.getElementById('saveCreateBtn').addEventListener('click',async()=>{await apiWrite('/wp-json/calendar/v1/events','POST',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveUpdateBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'PATCH',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveDeleteBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'DELETE'); closeModal(); loadEvents();});\ndocument.getElementById('toggleSingleOccurrenceBtn').addEventListener('click',async()=>{ const p=document.getElementById('singleOccurrencePanel'); p.style.display = p.style.display==='none'?'':'none'; if(p.style.display!=='none') await loadOccurrenceChooser(); });\ndocument.getElementById('occPrevBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()-1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('occNextBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()+1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('deleteOccurrenceBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; const key=encodeURIComponent(document.getElementById('occKey').value); if(!id||!key) return; await apiWrite('/wp-json/calendar/v1/events/'+id+'/occurrences/'+key,'DELETE'); await loadOccurrenceChooser(); loadEvents();});\ndocument.getElementById('repeatType').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('rangeMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('monthlyNthMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('repeatInterval').addEventListener('input',everyText);\ndocument.getElementById('allDay').addEventListener('change', ()=>{{ applyAllDayVisibility(); updateEventButtons(); }});\n['title','startDate','endDate','startTime','endTime','repeatType','occKey'].forEach(id=>document.getElementById(id).addEventListener('input',updateEventButtons));\nfunction shiftAnchor(dir){\n const d = parseYmd(anchorEl.value);\n const v = viewEl.value;\n const s = startOfViewPeriod(d, v);\n if (v === 'day' || v === 'list') s.setDate(s.getDate() + dir);\n else if (v === 'week') s.setDate(s.getDate() + (7*dir));\n else if (v === 'month') s.setMonth(s.getMonth() + dir);\n else if (v === 'year') s.setFullYear(s.getFullYear() + dir);\n anchorEl.value = ymdLocal(startOfViewPeriod(s, v));\n}\ndocument.getElementById('prevBtn').addEventListener('click',()=>{ shiftAnchor(-1); loadEvents(); });\ndocument.getElementById('nextBtn').addEventListener('click',()=>{ shiftAnchor(1); loadEvents(); });\ndocument.getElementById('todayBtn').addEventListener('click',()=>{ const t = startOfViewPeriod(new Date(), viewEl.value); anchorEl.value = ymdLocal(t); loadEvents(); });\nloginBtnEl.addEventListener('click', ()=> loginModalEl.classList.add('open'));\ndocument.getElementById('closeLoginBtn').addEventListener('click', ()=>{ loginModalEl.classList.remove('open'); showLoginFeedback('', true); });\ndocument.getElementById('closeDetailBtn').addEventListener('click', closeDetail);\nlogoutBtnEl.addEventListener('click', ()=>{ session = { email:'', password:'', user:null, canWrite:false }; refreshAuthUi(); closeModal(); loadEvents(); });\ndocument.getElementById('doLoginBtn').addEventListener('click', async ()=>{\n const email = (document.getElementById('loginEmail').value || '').trim().toLowerCase();\n const password = document.getElementById('loginPassword').value || '';\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/me'), { headers: { Authorization: 'Basic ' + btoa(email + ':' + password) } });\n const payload = await resp.json();\n if (!resp.ok || !payload?.data){\n const msg = 'Login failure';\n statusEl.textContent = msg; statusEl.className='err';\n showLoginFeedback(msg, false);\n return;\n }\n session.email = email;\n session.password = password;\n session.user = payload.data;\n session.canWrite = payload.data.account_status === 'active';\n refreshAuthUi();\n showLoginFeedback('Login succeeded.', true);\n loginModalEl.classList.remove('open');\n loadEvents();\n});\ndocument.getElementById('regBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('regEmail').value || '').trim().toLowerCase(), password: document.getElementById('regPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/register'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Registered. Check your email for a verification link or token.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('verifyBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('verifyToken').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/verify'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = resp.ok\n ? 'An admin will review your request and notify you if approved.'\n : (payload?.error?.message || 'Verify failed');\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('forgotBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('forgotEmail').value || '').trim().toLowerCase() };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/forgot-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'If the account exists, a reset token has been sent by email.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('resetBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('resetToken').value || '', new_password: document.getElementById('resetPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/reset-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Password reset complete';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\nviewEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nanchorEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nfutureOnlyEl.addEventListener('change',loadEvents);\n['loginEmail','loginPassword','regEmail','regPw','verifyToken','forgotEmail','resetToken','resetPw'].forEach(id=>{ const el=document.getElementById(id); el.addEventListener('input', updateAuthButtonStates); });\nupdateAuthButtonStates();\nshowLoginFeedback('', true);\nrefreshAuthUi();\napplyAllDayVisibility();\nupdateEventButtons();\nloadEvents();\n</script>\n\n</body>\n</html>", "body_truncated": false}}
{"ts": "2026-03-30T14:09:43+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14085", "If-Match": "\"b448b4adc3c325bc\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19190330T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19200328T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19201025T030000\r\nRDATE:19201025T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19210403T020000\r\nRDATE:19210403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19211003T030000\r\nRDATE:19211003T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19220326T020000\r\nRDATE:19220326T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19221008T030000\r\nRDATE:19221008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19230422T020000\r\nRDATE:19230422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19240413T020000\r\nRDATE:19240413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19230916T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=3SU;UNTIL=19240921T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19250419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19260418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19270410T020000\r\nRDATE:19270410T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19280422T020000\r\nRDATE:19280422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19290421T020000\r\nRDATE:19290421T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19300413T020000\r\nRDATE:19300413T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19310419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19320417T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19251004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19321002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19330409T020000\r\nRDATE:19330409T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19331008T030000\r\nRDATE:19331008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19340422T020000\r\nRDATE:19340422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19350414T020000\r\nRDATE:19350414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19360419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19370418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19380410T020000\r\nRDATE:19380410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19341007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19381002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19390416T020000\r\nRDATE:19390416T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19400225T020000\r\nRDATE:19400225T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410504T020000\r\nRDATE:19410504T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410810T030000\r\nRDATE:19410810T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420405T020000\r\nRDATE:19420405T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420809T030000\r\nRDATE:19420809T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430404T020000\r\nRDATE:19430404T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430815T030000\r\nRDATE:19430815T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440402T020000\r\nRDATE:19440402T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440917T030000\r\nRDATE:19440917T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450402T020000\r\nRDATE:19450402T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19391119T030000\r\nRDATE:19391119T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450715T030000\r\nRDATE:19450715T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19460414T020000\r\nRDATE:19460414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470316T020000\r\nRDATE:19470316T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470413T020000\r\nRDATE:19470413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19451007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19461006T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470810T030000\r\nRDATE:19470810T030000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19471102T030000\r\nRDATE:19471102T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19480314T020000\r\nRDATE:19480314T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19490403T020000\r\nRDATE:19490403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19481031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19491030T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19501022T030000\r\nRDATE:19501022T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19511021T030000\r\nRDATE:19511021T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19521026T030000\r\nRDATE:19521026T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19500416T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19530419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19540411T020000\r\nRDATE:19540411T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19550417T020000\r\nRDATE:19550417T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19560422T020000\r\nRDATE:19560422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19570414T020000\r\nRDATE:19570414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19580420T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19590419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19600410T020000\r\nRDATE:19600410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19531004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19601002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19610326T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19630331T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19640322T020000\r\nRDATE:19640322T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19611029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19641025T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19651024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19661023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19650321T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19670319T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19671029T030000\r\nRDATE:19671029T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19681027T000000\r\nRDATE:19681027T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19680218T020000\r\nRDATE:19680218T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19711031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19751026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19761024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19771023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19720319T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19800316T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19781029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19801026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19811025T020000\r\nRDATE:19811025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19821024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19831023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19841028T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19871025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19881023T020000\r\nRDATE:19881023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19891029T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19921025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19931024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19951022T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19810329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19960331T010000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19961027T020000\r\nRDATE:19961027T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:(DST)\r\nDTSTART:19970330T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:(STD)\r\nDTSTART:19971026T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nLAST-MODIFIED:20260330T140943Z\r\nDTSTAMP:20260330T140943Z\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nSUMMARY:test 8\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T160000\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nDESCRIPTION:Default Mozilla Description\r\nSEQUENCE:1\r\nX-MOZ-GENERATION:1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:09:43 GMT", "ETag": "\"075d4a0c8d56a83e\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:09:43 GMT\r\nETag: \"075d4a0c8d56a83e\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:09:43+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href></C:calendar-multiget>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:09:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "14799"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:09:43 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 14799\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b2246c0ba36be704\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"97ffb830a549901c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"0f947e3952fcf681\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"4f06e2ef4d6d8e38\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"927953eb5c8dd26c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"93cf1bad962c75f4\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7201c1345f1b2573\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a81452cded01c6a1\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"978f53232a5bb40f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b7eba5ab03b7f422\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"864b421e254e30ac\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"44d2d2c64b2e5412\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"fa7dfc8cbf381fc0\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"3f65af9c5527a154\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"006c790da9929803\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:98fd8f149a14e2dddeb7@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9d5b8db2124188a7\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ddec804fa982f5df9ed5@calendar-wp-plugin\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:Smoke Daily Exception TZ\r\nDESCRIPTION:tz-key\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"075d4a0c8d56a83e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nDTSTAMP:20260330T140943Z\r\nSUMMARY:test 8\r\nDESCRIPTION:Default Mozilla Description\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:09:49+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:09:49 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5816"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:09:49 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 5816\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"b2246c0ba36be704\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"97ffb830a549901c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"0f947e3952fcf681\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"4f06e2ef4d6d8e38\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"927953eb5c8dd26c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"93cf1bad962c75f4\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7201c1345f1b2573\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a81452cded01c6a1\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"978f53232a5bb40f\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"b7eba5ab03b7f422\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"864b421e254e30ac\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"44d2d2c64b2e5412\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"fa7dfc8cbf381fc0\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"3f65af9c5527a154\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"006c790da9929803\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"9d5b8db2124188a7\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"075d4a0c8d56a83e\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:09:49+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "232", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/15.ics</D:href></C:calendar-multiget>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:09:49 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "14799"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:09:49 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 14799\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b2246c0ba36be704\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"97ffb830a549901c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"0f947e3952fcf681\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"4f06e2ef4d6d8e38\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"927953eb5c8dd26c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"93cf1bad962c75f4\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7201c1345f1b2573\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a81452cded01c6a1\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"978f53232a5bb40f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b7eba5ab03b7f422\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"864b421e254e30ac\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"44d2d2c64b2e5412\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"fa7dfc8cbf381fc0\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"3f65af9c5527a154\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"006c790da9929803\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:98fd8f149a14e2dddeb7@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9d5b8db2124188a7\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ddec804fa982f5df9ed5@calendar-wp-plugin\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:Smoke Daily Exception TZ\r\nDESCRIPTION:tz-key\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"075d4a0c8d56a83e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nDTSTAMP:20260330T140949Z\r\nSUMMARY:test 8\r\nDESCRIPTION:Default Mozilla Description\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:12:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14085", "If-Match": "\"075d4a0c8d56a83e\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19190330T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19200328T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19201025T030000\r\nRDATE:19201025T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19210403T020000\r\nRDATE:19210403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19211003T030000\r\nRDATE:19211003T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19220326T020000\r\nRDATE:19220326T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19221008T030000\r\nRDATE:19221008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19230422T020000\r\nRDATE:19230422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19240413T020000\r\nRDATE:19240413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19230916T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=3SU;UNTIL=19240921T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19250419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19260418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19270410T020000\r\nRDATE:19270410T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19280422T020000\r\nRDATE:19280422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19290421T020000\r\nRDATE:19290421T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19300413T020000\r\nRDATE:19300413T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19310419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19320417T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19251004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19321002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19330409T020000\r\nRDATE:19330409T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19331008T030000\r\nRDATE:19331008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19340422T020000\r\nRDATE:19340422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19350414T020000\r\nRDATE:19350414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19360419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19370418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19380410T020000\r\nRDATE:19380410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19341007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19381002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19390416T020000\r\nRDATE:19390416T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19400225T020000\r\nRDATE:19400225T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410504T020000\r\nRDATE:19410504T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410810T030000\r\nRDATE:19410810T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420405T020000\r\nRDATE:19420405T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420809T030000\r\nRDATE:19420809T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430404T020000\r\nRDATE:19430404T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430815T030000\r\nRDATE:19430815T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440402T020000\r\nRDATE:19440402T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440917T030000\r\nRDATE:19440917T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450402T020000\r\nRDATE:19450402T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19391119T030000\r\nRDATE:19391119T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450715T030000\r\nRDATE:19450715T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19460414T020000\r\nRDATE:19460414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470316T020000\r\nRDATE:19470316T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470413T020000\r\nRDATE:19470413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19451007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19461006T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470810T030000\r\nRDATE:19470810T030000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19471102T030000\r\nRDATE:19471102T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19480314T020000\r\nRDATE:19480314T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19490403T020000\r\nRDATE:19490403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19481031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19491030T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19501022T030000\r\nRDATE:19501022T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19511021T030000\r\nRDATE:19511021T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19521026T030000\r\nRDATE:19521026T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19500416T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19530419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19540411T020000\r\nRDATE:19540411T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19550417T020000\r\nRDATE:19550417T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19560422T020000\r\nRDATE:19560422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19570414T020000\r\nRDATE:19570414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19580420T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19590419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19600410T020000\r\nRDATE:19600410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19531004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19601002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19610326T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19630331T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19640322T020000\r\nRDATE:19640322T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19611029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19641025T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19651024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19661023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19650321T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19670319T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19671029T030000\r\nRDATE:19671029T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19681027T000000\r\nRDATE:19681027T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19680218T020000\r\nRDATE:19680218T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19711031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19751026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19761024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19771023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19720319T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19800316T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19781029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19801026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19811025T020000\r\nRDATE:19811025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19821024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19831023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19841028T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19871025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19881023T020000\r\nRDATE:19881023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19891029T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19921025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19931024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19951022T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19810329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19960331T010000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19961027T020000\r\nRDATE:19961027T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:(DST)\r\nDTSTART:19970330T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:(STD)\r\nDTSTART:19971026T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nLAST-MODIFIED:20260330T141240Z\r\nDTSTAMP:20260330T141240Z\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nSUMMARY:test 8\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260312T160000\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nDESCRIPTION:Default Mozilla Description\r\nSEQUENCE:1\r\nX-MOZ-GENERATION:1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:12:40 GMT", "ETag": "\"4b22d7e9f955d2a5\""}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:12:40 GMT\r\nETag: \"4b22d7e9f955d2a5\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:12:40+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href></C:calendar-multiget>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:12:40 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "14799"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:12:40 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 14799\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b2246c0ba36be704\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"97ffb830a549901c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"0f947e3952fcf681\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"4f06e2ef4d6d8e38\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"927953eb5c8dd26c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"93cf1bad962c75f4\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7201c1345f1b2573\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a81452cded01c6a1\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"978f53232a5bb40f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b7eba5ab03b7f422\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"864b421e254e30ac\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"44d2d2c64b2e5412\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"fa7dfc8cbf381fc0\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"3f65af9c5527a154\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"006c790da9929803\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:98fd8f149a14e2dddeb7@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9d5b8db2124188a7\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ddec804fa982f5df9ed5@calendar-wp-plugin\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:Smoke Daily Exception TZ\r\nDESCRIPTION:tz-key\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"4b22d7e9f955d2a5\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nDTSTAMP:20260330T141240Z\r\nSUMMARY:test 8\r\nDESCRIPTION:Default Mozilla Description\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:12:45+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:12:45 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5816"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:12:45 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 5816\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"b2246c0ba36be704\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"97ffb830a549901c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"0f947e3952fcf681\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"4f06e2ef4d6d8e38\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"927953eb5c8dd26c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"93cf1bad962c75f4\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7201c1345f1b2573\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a81452cded01c6a1\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"978f53232a5bb40f\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"b7eba5ab03b7f422\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"864b421e254e30ac\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"44d2d2c64b2e5412\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"fa7dfc8cbf381fc0\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"3f65af9c5527a154\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"006c790da9929803\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"9d5b8db2124188a7\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"4b22d7e9f955d2a5\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 43446\r\n\r\n<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Calendar</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, sans-serif; margin: 0; background: #f7f7f5; color: #1f2937; }\n header { background: #0f766e; color: #fff; padding: 14px 18px; }\n header a { color: #fff; margin-right: 10px; }\n main { max-width: 1100px; margin: 18px auto; padding: 0 12px; }\n .card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 12px; margin-bottom: 12px; }\n input, select, textarea, button { font: inherit; }\n button { padding: 7px 10px; border: 1px solid #d1d5db; border-radius: 8px; background: #fff; cursor: pointer; }\n button:disabled { opacity: 0.45; cursor: not-allowed; }\n table { width: 100%; border-collapse: collapse; }\n th, td { border-bottom: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top; }\n .row { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 8px; }\n .muted { color: #6b7280; font-size: 0.9rem; }\n .ok { color: #065f46; }\n .err { color: #991b1b; }\n .grid3 { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:8px; }\n .grid4 { display:grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap:8px; }\n .field { position: relative; margin: 14px 0; }\n .field > label { position:absolute; top:-0.62rem; left:0.6rem; font-size:0.72rem; line-height:1; background:#fff; padding:0 0.25rem; color:#4b5563; letter-spacing:0.01em; }\n .field > input, .field > select, .field > textarea {\n width: 100%; box-sizing: border-box; padding: 0.78rem 0.65rem 0.5rem 0.65rem;\n border: 1px solid #cbd5e1; border-radius: 8px; background: #fff;\n }\n .field-with-suffix > input { padding-right: 5.5rem; }\n .input-suffix {\n position: absolute; right: 0.7rem; top: 56%;\n transform: translateY(-50%); color: #374151; font-size: 0.84rem; pointer-events: none;\n }\n .toolbar { display:flex; gap:8px; flex-wrap: wrap; align-items: end; }\n #topControls { align-items: center; }\n .topbar { display:flex; justify-content:space-between; gap:10px; align-items:flex-start; flex-wrap:wrap; }\n .topbar-right { margin-left:auto; text-align:right; min-width: 220px; }\n .topbar-right a { display:block; margin-bottom:4px; }\n .toggle-wrap { display:flex; align-items:center; padding: 0 2px; min-height: 38px; }\n .toggle-wrap label { position: static; font-size: 0.9rem; background: transparent; padding: 0; }\n .modal { position: fixed; inset: 0; background: rgba(15,23,42,0.45); display: none; align-items: center; justify-content: center; z-index: 1000; }\n .modal.open { display:flex; }\n .modal-card { width: min(900px, 92vw); max-height: 92vh; overflow: auto; background: #fff; border-radius: 10px; padding: 12px; }\n .week-grid { display:grid; grid-template-columns: 56px repeat(7, 1fr); gap:8px; }\n .time-scale { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .time-scale .week-head { text-align:center; }\n .time-scale .time-lane { font-size:0.68rem; color:#6b7280; }\n .time-label { position:absolute; left:4px; transform: translateY(-50%); }\n .week-day { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .week-head { padding:6px; border-bottom:1px solid #e5e7eb; font-size:0.85rem; font-weight:600; }\n .all-day-list { min-height:24px; padding:4px; border-bottom:1px dashed #e5e7eb; font-size:0.75rem; }\n .time-lane { position:relative; height: 960px; background:\n repeating-linear-gradient(to bottom, #f8fafc 0, #f8fafc 39px, #eef2f7 39px, #eef2f7 40px); }\n .week-event { position:absolute; background:#dcfce7; border:1px solid #86efac; border-radius:6px; font-size:0.72rem; padding:2px 4px; overflow:hidden; cursor:pointer; box-shadow: 0 1px 2px rgba(0,0,0,0.08); }\n .week-event:hover { filter: brightness(0.97); transform: translateY(-1px); }\n .month-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; }\n .month-dow-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; margin-bottom: 6px; }\n .month-dow { font-size: 0.78rem; font-weight: 700; color: #4b5563; text-align: center; }\n .month-cell { min-height:130px; border:1px solid #e5e7eb; border-radius:8px; background:#fff; padding:5px; }\n .month-cell.blank { background:#f3f4f6; }\n .day-num { font-size:0.82rem; font-weight:700; }\n .mini-evt { font-size:0.72rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid var(--accent, #34d399); background: color-mix(in srgb, var(--accent, #34d399) 12%, white); padding:2px 4px; margin-top:3px; cursor:pointer; border-radius:4px; }\n .mini-evt:hover { filter: brightness(0.97); }\n .year-grid { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:10px; }\n .year-month { border:1px solid #e5e7eb; border-radius:8px; padding:6px; background:#fff; }\n .year-month h4 { margin: 3px 0 6px; font-size:0.9rem; }\n .year-days { display:grid; grid-template-columns: repeat(7, 1fr); gap:3px; }\n .year-day { font-size:0.7rem; border:1px solid #edf2f7; border-radius:4px; min-height:22px; text-align:center; line-height:22px; }\n .year-day.has-event { font-weight: 700; background: #ecfeff; border-color: #67e8f9; }\n .legend { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }\n .legend .chip { border:1px solid #e5e7eb; border-left: 4px solid var(--accent,#34d399); border-radius: 6px; padding: 3px 8px; font-size: 0.75rem; background:#fff; }\n #occurrenceGrid .year-grid { grid-template-columns: repeat(3, minmax(220px, 1fr)); gap: 10px; align-items: start; }\n #occurrenceGrid .month-grid { gap: 4px; }\n #occurrenceGrid .month-cell { min-height: 24px; padding: 3px; }\n #occurrenceGrid .day-num { font-size: 0.76rem; line-height: 1.1; text-align: center; }\n #occurrenceGrid .month-cell.active { background: #ecfeff; border-color: #67e8f9; }\n #loginModal .field > label {\n position: static;\n display: inline-block;\n margin: 0 0 0.2rem;\n font-size: 0.8rem;\n background: transparent;\n padding: 0;\n color: #4b5563;\n }\n #loginModal .field > input {\n padding: 0.6rem 0.65rem;\n }\n </style>\n</head>\n<body>\n\n<header><strong>Calendar Fixture</strong> <span class=\"muted\">Public Calendar UI</span></header>\n<main>\n <div class=\"card\">\n <div class=\"topbar\">\n <div class=\"toolbar\" id=\"topControls\">\n <div class=\"field\"><label>View</label>\n <select id=\"view\">\n <option value=\"list\">List</option>\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\" selected>Month</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n <div class=\"field\"><label>Date</label><input id=\"anchor\" type=\"date\" /></div>\n <div id=\"futureOnlyWrap\" class=\"toggle-wrap\"><label><input id=\"futureOnly\" type=\"checkbox\" checked /> Future Only</label></div>\n <button id=\"prevBtn\" title=\"Previous\">&#8592;</button>\n <button id=\"todayBtn\" title=\"Today\">&#128197;</button>\n <button id=\"nextBtn\" title=\"Next\">&#8594;</button>\n <button id=\"newEventBtn\">Create Event</button>\n <button id=\"loginBtn\">Login</button>\n </div>\n <div class=\"topbar-right\">\n <a href=\"/calendar.ics\" target=\"_blank\">ICS Link</a>\n <a href=\"/caldav/\" target=\"_blank\">CalDAV</a>\n <div id=\"status\" class=\"muted\"></div>\n <div id=\"authState\" class=\"muted\"></div>\n <button id=\"logoutBtn\" style=\"display:none\">Logout</button>\n </div>\n </div>\n </div>\n <div id=\"events\"></div>\n <div id=\"loginModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Account Login</h3>\n <div id=\"loginFeedback\" class=\"muted\"></div>\n <div class=\"row\">\n <div class=\"field\"><label>Email</label><input id=\"loginEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password</label><input id=\"loginPassword\" type=\"password\" /></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"doLoginBtn\" disabled>Login</button>\n <button id=\"closeLoginBtn\">Close</button>\n </div>\n <div class=\"card\">\n <h4>Register</h4>\n <div class=\"field\"><label>Email</label><input id=\"regEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password (8+ chars)</label><input id=\"regPw\" type=\"password\" /></div>\n <div class=\"toolbar\"><button id=\"regBtn\" disabled>Register</button></div>\n <div class=\"field\"><label>Verify Token</label><input id=\"verifyToken\" /></div>\n <div class=\"toolbar\"><button id=\"verifyBtn\" disabled>Verify Email</button></div>\n </div>\n <div class=\"card\">\n <h4>Password Recovery</h4>\n <div class=\"field\"><label>Email</label><input id=\"forgotEmail\" type=\"email\" /></div>\n <button id=\"forgotBtn\" disabled>Send Reset Token</button>\n <div class=\"field\"><label>Reset Token</label><input id=\"resetToken\" /></div>\n <div class=\"field\"><label>New Password</label><input id=\"resetPw\" type=\"password\" /></div>\n <button id=\"resetBtn\" disabled>Reset Password</button>\n </div>\n </div>\n </div>\n <div id=\"detailModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Event Details</h3>\n <div class=\"field\"><label>Title</label><input id=\"detailTitle\" readonly /></div>\n <div class=\"field\"><label>Category</label><input id=\"detailCategory\" readonly /></div>\n <div class=\"field\"><label>Description</label><textarea id=\"detailDescription\" rows=\"5\" readonly></textarea></div>\n <div class=\"toolbar\"><button id=\"closeDetailBtn\">Close</button></div>\n </div>\n </div>\n <div id=\"modal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3 id=\"modalTitle\">Event</h3>\n <input id=\"eventId\" type=\"hidden\" />\n <div class=\"field\"><label>Title</label><input id=\"title\" /></div>\n <div class=\"row\">\n <div class=\"field\"><label>Location</label><input id=\"location\" /></div>\n <div class=\"field\"><label>Category</label><input id=\"category\" /></div>\n </div>\n <div class=\"field\"><label>Description</label><textarea id=\"description\" rows=\"3\"></textarea></div>\n <div class=\"toggle-wrap\"><label><input id=\"allDay\" type=\"checkbox\" /> All Day Event</label></div>\n <div class=\"grid4\">\n <div class=\"field\"><label>Start Date</label><input id=\"startDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"startTimeWrap\"><label>Start Time</label><input id=\"startTime\" type=\"time\" /></div>\n <div class=\"field\"><label>End Date</label><input id=\"endDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"endTimeWrap\"><label>End Time</label><input id=\"endTime\" type=\"time\" /></div>\n </div>\n <div class=\"row\">\n <div class=\"field\"><label>Repeat Type</label>\n <select id=\"repeatType\">\n <option value=\"none\">none</option>\n <option value=\"daily\">daily</option>\n <option value=\"weekly\">weekly</option>\n <option value=\"monthly\">monthly</option>\n <option value=\"yearly\">yearly</option>\n <option value=\"custom\">custom</option>\n </select>\n </div>\n <div class=\"field field-with-suffix\" id=\"repeatIntervalWrap\"><label>Every</label><input id=\"repeatInterval\" type=\"number\" min=\"1\" value=\"1\" /><span id=\"repeatIntervalText\" class=\"input-suffix\"></span></div>\n </div>\n <div class=\"row\" id=\"modeUntilRow\">\n <div class=\"field\"><label>Mode</label>\n <select id=\"rangeMode\">\n <option value=\"none\">none</option>\n <option value=\"no_end\">no_end</option>\n <option value=\"count\">count</option>\n <option value=\"until\">until</option>\n </select>\n </div>\n <div class=\"field\" id=\"repeatUntilWrap\"><label>Repeat Until</label><input id=\"repeatUntil\" type=\"date\" /></div>\n </div>\n <div class=\"row\" id=\"rangeWrap\">\n <div class=\"field\" id=\"repeatCountWrap\"><label>Repeat Count</label><input id=\"repeatCount\" type=\"number\" min=\"1\" /></div>\n </div>\n <div class=\"row\" id=\"monthlyNthWrap\">\n <div class=\"field\"><label>Monthly Pattern</label>\n <select id=\"monthlyNthMode\">\n <option value=\"\">from start date</option>\n <option value=\"day_of_month\">nth day of month</option>\n <option value=\"weekday_of_month\">nth weekday of month</option>\n </select>\n </div>\n <div class=\"field\" id=\"nthDayWrap\"><label>Day Number</label><input id=\"nthDay\" type=\"number\" min=\"1\" max=\"31\" /></div>\n </div>\n <div class=\"row\" id=\"nthWeekdayWrap\">\n <div class=\"field\"><label>Nth</label><select id=\"nthPos\"><option value=\"1\">1st</option><option value=\"2\">2nd</option><option value=\"3\">3rd</option><option value=\"4\">4th</option><option value=\"5\">5th</option><option value=\"-1\">last</option></select></div>\n <div class=\"field\"><label>Weekday</label><select id=\"nthWeekday\"><option value=\"0\">Sunday</option><option value=\"1\">Monday</option><option value=\"2\">Tuesday</option><option value=\"3\">Wednesday</option><option value=\"4\">Thursday</option><option value=\"5\">Friday</option><option value=\"6\">Saturday</option></select></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"saveCreateBtn\">Create</button>\n <button id=\"saveUpdateBtn\">Update</button>\n <button id=\"saveDeleteBtn\">Delete</button>\n <button id=\"toggleSingleOccurrenceBtn\">Delete a Single Occurrence</button>\n <button id=\"closeModalBtn\">Close</button>\n </div>\n <div class=\"card\" id=\"singleOccurrencePanel\" style=\"display:none\">\n <h4>Delete Single Occurrence (Exception)</h4>\n <div class=\"toolbar\">\n <button id=\"occPrevBtn\">&#8592;</button>\n <button id=\"occNextBtn\">&#8594;</button>\n </div>\n <div id=\"occurrenceGrid\" class=\"month-grid\"></div>\n <input id=\"occKey\" type=\"hidden\" />\n <div class=\"field\"><label>Occurrence</label><input id=\"occKeyDisplay\" readonly placeholder=\"Select an occurrence from the calendar above\" /></div>\n <button id=\"deleteOccurrenceBtn\">Delete Occurrence</button>\n </div>\n </div>\n </div>\n</main>\n<script>\nconst statusEl = document.getElementById('status');\nconst authStateEl = document.getElementById('authState');\nconst loginFeedbackEl = document.getElementById('loginFeedback');\nconst eventsEl = document.getElementById('events');\nconst viewEl = document.getElementById('view');\nconst anchorEl = document.getElementById('anchor');\nconst futureOnlyWrapEl = document.getElementById('futureOnlyWrap');\nconst futureOnlyEl = document.getElementById('futureOnly');\nconst modalEl = document.getElementById('modal');\nconst loginModalEl = document.getElementById('loginModal');\nconst detailModalEl = document.getElementById('detailModal');\nconst loginBtnEl = document.getElementById('loginBtn');\nconst logoutBtnEl = document.getElementById('logoutBtn');\nconst newEventBtnEl = document.getElementById('newEventBtn');\nconst ROOT = \"\";\nlet session = { email:'', password:'', user:null, canWrite:false };\nviewEl.value = 'month';\nfunction pad2(n){ return String(n).padStart(2,'0'); }\nfunction ymdLocal(d){ return `${d.getFullYear()}-${pad2(d.getMonth()+1)}-${pad2(d.getDate())}`; }\nfunction parseYmd(s){ const p=(s||'').split('-'); if(p.length!==3) return new Date(); return new Date(Number(p[0]), Number(p[1])-1, Number(p[2])); }\nanchorEl.value = ymdLocal(new Date());\nfunction rootPath(path){ return ROOT + path; }\nfunction apiUrl(path) { return rootPath(path); }\nfunction authHeaders(){ return session.email && session.password ? { Authorization: 'Basic ' + btoa(session.email + ':' + session.password) } : {}; }\nfunction isEmail(v){ return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((v||'').trim()); }\nfunction showLoginFeedback(msg, ok){\n loginFeedbackEl.textContent = msg || '';\n loginFeedbackEl.className = ok ? 'ok' : (msg ? 'err' : 'muted');\n}\nfunction updateAuthButtonStates(){\n const loginEmail = document.getElementById('loginEmail').value || '';\n const loginPw = document.getElementById('loginPassword').value || '';\n const regEmail = document.getElementById('regEmail').value || '';\n const regPw = document.getElementById('regPw').value || '';\n const verifyToken = document.getElementById('verifyToken').value || '';\n const forgotEmail = document.getElementById('forgotEmail').value || '';\n const resetToken = document.getElementById('resetToken').value || '';\n const resetPw = document.getElementById('resetPw').value || '';\n document.getElementById('doLoginBtn').disabled = !(isEmail(loginEmail) && loginPw.length >= 8);\n document.getElementById('regBtn').disabled = !(isEmail(regEmail) && regPw.length >= 8);\n document.getElementById('verifyBtn').disabled = !verifyToken.trim();\n document.getElementById('forgotBtn').disabled = !isEmail(forgotEmail);\n document.getElementById('resetBtn').disabled = !(resetToken.trim() && resetPw.length >= 8);\n}\nfunction refreshAuthUi(){\n const logged = !!session.user;\n loginBtnEl.style.display = logged ? 'none' : '';\n logoutBtnEl.style.display = logged ? '' : 'none';\n newEventBtnEl.style.display = session.canWrite ? '' : 'none';\n authStateEl.textContent = logged\n ? `Logged in as ${session.user.email}`\n : 'Public mode: read-only';\n updateEventButtons();\n}\nfunction splitIsoToInputs(iso) { if (!iso) return {d:'',t:''}; if (!iso.includes('T')) return {d:iso.slice(0,10),t:''}; return {d:iso.slice(0,10),t:iso.slice(11,16)}; }\nfunction toIso(d,t,allDay){ if(!d) return ''; if(allDay) return d; return `${d}T${(t||'00:00')}:00+01:00`; }\nfunction formatOccurrenceKey(iso){\n if (!iso) return '';\n const dt = new Date(iso);\n if (Number.isNaN(dt.getTime())) return iso;\n return dt.toLocaleString('en-GB', { year:'numeric', month:'short', day:'2-digit', hour:'2-digit', minute:'2-digit' });\n}\nfunction applyAllDayVisibility(){\n const allDay = !!document.getElementById('allDay').checked;\n document.getElementById('startTimeWrap').style.display = allDay ? 'none' : '';\n document.getElementById('endTimeWrap').style.display = allDay ? 'none' : '';\n}\nlet occCursor = new Date();\nfunction everyText(){\n const n = Number(document.getElementById('repeatInterval').value || 1);\n const rt = document.getElementById('repeatType').value;\n const unit = rt === 'daily' ? 'day' : rt === 'weekly' ? 'week' : rt === 'monthly' ? 'month' : rt === 'yearly' ? 'year' : rt === 'custom' ? 'week' : '';\n document.getElementById('repeatIntervalText').textContent = unit ? `${unit}${n===1?'':'s'}` : '';\n}\nfunction applyRecurrenceVisibility(){ const rt=document.getElementById('repeatType').value; const rm=document.getElementById('rangeMode').value; const show=rt!=='none';\n document.getElementById('repeatIntervalWrap').style.display=show?'':'none';\n document.getElementById('modeUntilRow').style.display=show?'':'none';\n document.getElementById('rangeWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatCountWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatUntilWrap').style.display=(show&&rm==='until')?'':'none';\n document.getElementById('monthlyNthWrap').style.display=(rt==='monthly')?'':'none';\n const m = document.getElementById('monthlyNthMode').value;\n document.getElementById('nthDayWrap').style.display=(rt==='monthly' && m==='day_of_month')?'':'none';\n document.getElementById('nthWeekdayWrap').style.display=(rt==='monthly' && m==='weekday_of_month')?'':'none';\n document.getElementById('toggleSingleOccurrenceBtn').style.display=show?'':'none';\n if (!show) document.getElementById('singleOccurrencePanel').style.display='none';\n everyText();\n updateEventButtons();\n}\nfunction openModal(mode,evt){ if(!evt) evt={}; const sd=splitIsoToInputs(evt.start_datetime), ed=splitIsoToInputs(evt.end_datetime);\n if (!session.canWrite) return;\n document.getElementById('modalTitle').textContent=mode==='create'?'Create Event':'Edit Event';\n document.getElementById('eventId').value=evt.id||''; document.getElementById('title').value=evt.title||''; document.getElementById('location').value=evt.location||'';\n document.getElementById('category').value=evt.category||''; document.getElementById('description').value=evt.description||'';\n document.getElementById('allDay').checked=!!evt.all_day_event; document.getElementById('startDate').value=sd.d||''; document.getElementById('startTime').value=sd.t||'';\n document.getElementById('endDate').value=ed.d||''; document.getElementById('endTime').value=ed.t||''; document.getElementById('repeatType').value=evt.repeat_type||'none';\n document.getElementById('repeatInterval').value=evt.repeat_interval||1; document.getElementById('rangeMode').value=evt.repeat_range_mode||'none';\n document.getElementById('repeatCount').value=evt.repeat_count||''; document.getElementById('repeatUntil').value=evt.repeat_until||'';\n document.getElementById('monthlyNthMode').value=evt.repeat_nth_mode||'';\n document.getElementById('nthDay').value=evt.repeat_nth_day||'';\n document.getElementById('nthPos').value=evt.repeat_nth_pos||'1';\n document.getElementById('nthWeekday').value=evt.repeat_nth_weekday===null||evt.repeat_nth_weekday===undefined?'0':String(evt.repeat_nth_weekday);\n document.getElementById('singleOccurrencePanel').style.display='none';\n document.getElementById('occKey').value = '';\n document.getElementById('occKeyDisplay').value = '';\n occCursor = new Date((evt.start_datetime||new Date().toISOString()).slice(0,10) + 'T00:00:00');\n document.getElementById('toggleSingleOccurrenceBtn').style.display = mode==='edit' ? '' : 'none';\n document.getElementById('saveCreateBtn').style.display=mode==='create'?'':'none'; document.getElementById('saveUpdateBtn').style.display=mode==='edit'?'':'none';\n document.getElementById('saveDeleteBtn').style.display=mode==='edit'?'':'none'; applyRecurrenceVisibility(); modalEl.classList.add('open');\n applyAllDayVisibility();\n updateEventButtons();\n}\nfunction closeModal(){ modalEl.classList.remove('open'); }\nfunction openDetail(item){\n document.getElementById('detailTitle').value = item?.title || '';\n document.getElementById('detailCategory').value = item?.category || '';\n document.getElementById('detailDescription').value = item?.description || '';\n detailModalEl.classList.add('open');\n}\nfunction closeDetail(){ detailModalEl.classList.remove('open'); }\nfunction updateEventButtons(){\n const titleOk = !!(document.getElementById('title').value || '').trim();\n const startDate = (document.getElementById('startDate').value || '').trim();\n const endDateRaw = (document.getElementById('endDate').value || '').trim();\n const endDate = endDateRaw || startDate;\n const allDay = !!document.getElementById('allDay').checked;\n const startTime = (document.getElementById('startTime').value || '').trim();\n const endTime = (document.getElementById('endTime').value || '').trim();\n let validDateTime = false;\n if (startDate && endDate && endDate >= startDate){\n if (allDay){\n validDateTime = true;\n } else if (startTime && endTime){\n validDateTime = endDate > startDate || endTime >= startTime;\n }\n }\n const hasCore = titleOk && validDateTime;\n const hasId = !!(document.getElementById('eventId').value || '').trim();\n document.getElementById('saveCreateBtn').disabled = !(session.canWrite && hasCore && !hasId);\n document.getElementById('saveUpdateBtn').disabled = !(session.canWrite && hasCore && hasId);\n document.getElementById('saveDeleteBtn').disabled = !(session.canWrite && hasId);\n document.getElementById('toggleSingleOccurrenceBtn').disabled = !(session.canWrite && hasId && document.getElementById('repeatType').value !== 'none');\n document.getElementById('deleteOccurrenceBtn').disabled = !(session.canWrite && hasId && (document.getElementById('occKey').value || '').trim());\n}\nfunction eventPayload(){ const ad=document.getElementById('allDay').checked; return {\n title:document.getElementById('title').value, location:document.getElementById('location').value, category:document.getElementById('category').value,\n description:document.getElementById('description').value, all_day_event:ad,\n start_datetime:toIso(document.getElementById('startDate').value,document.getElementById('startTime').value,ad),\n end_datetime:toIso((document.getElementById('endDate').value || document.getElementById('startDate').value),document.getElementById('endTime').value,ad),\n repeat_type:document.getElementById('repeatType').value, repeat_interval:Number(document.getElementById('repeatInterval').value||1),\n repeat_nth_mode:document.getElementById('monthlyNthMode').value,\n repeat_nth_day:document.getElementById('nthDay').value?Number(document.getElementById('nthDay').value):null,\n repeat_nth_pos:document.getElementById('nthPos').value?Number(document.getElementById('nthPos').value):null,\n repeat_nth_weekday:document.getElementById('nthWeekday').value === '' ? null : Number(document.getElementById('nthWeekday').value),\n repeat_range_mode:document.getElementById('rangeMode').value, repeat_count:document.getElementById('repeatCount').value?Number(document.getElementById('repeatCount').value):null,\n repeat_until:document.getElementById('repeatUntil').value||null\n};}\nasync function loadOccurrenceChooser(){\n const id = document.getElementById('eventId').value;\n if (!id) return;\n const from = new Date(occCursor.getFullYear(), occCursor.getMonth(), 1);\n const fromS = ymdLocal(from);\n const r = await fetch(apiUrl('/wp-json/calendar/v1/events/' + id + '/occurrences?from=' + fromS + '&months=3'), {headers:authHeaders()});\n const p = await r.json();\n const list = p.data || [];\n const dayToKey = new Map();\n list.forEach(x => {\n const d = (x.occurrence_start || '').slice(0,10);\n if (d && !dayToKey.has(d)) dayToKey.set(d, x.occurrence_start);\n });\n const cells = [];\n for(let m=0;m<3;m++){\n const d = new Date(from.getFullYear(), from.getMonth()+m, 1);\n const y=d.getFullYear(), mo=d.getMonth();\n const first=new Date(y,mo,1), off=(first.getDay()+6)%7, dim=new Date(y,mo+1,0).getDate();\n let monthCells=''; for(let i=0;i<off;i++) monthCells += '<div class=\"month-cell blank\"></div>';\n for(let day=1; day<=dim; day++){\n const dt=new Date(y,mo,day); const k=ymdLocal(dt); const has=dayToKey.has(k);\n monthCells += `<div class=\"month-cell ${has?'active':'blank'}\"><div class=\"day-num\" data-occ-date=\"${k}\" style=\"cursor:${has?'pointer':'default'}\">${day}</div></div>`;\n }\n cells.push(`<div class=\"year-month\"><h4>${d.toLocaleString('en-GB',{month:'short',year:'numeric'})}</h4><div class=\"month-grid\">${monthCells}</div></div>`);\n }\n document.getElementById('occurrenceGrid').innerHTML = `<div class=\"year-grid\">${cells.join('')}</div>`;\n document.querySelectorAll('[data-occ-date]').forEach(el=>el.addEventListener('click',()=>{\n const k=el.getAttribute('data-occ-date'); if(!dayToKey.has(k)) return;\n const iso = dayToKey.get(k) || '';\n document.getElementById('occKey').value = iso;\n document.getElementById('occKeyDisplay').value = formatOccurrenceKey(iso);\n updateEventButtons();\n }));\n}\nfunction startMinutes(iso){ if(!iso||!iso.includes('T')) return 0; return Number(iso.slice(11,13))*60+Number(iso.slice(14,16)); }\nfunction categoryColor(category){\n const base = (category || 'general').toLowerCase();\n let h = 0; for (let i = 0; i < base.length; i++) h = (h * 31 + base.charCodeAt(i)) % 360;\n return `hsl(${h} 70% 45%)`;\n}\nfunction eventChip(e, cls='mini-evt'){ return `<div class=\"${cls}\" data-edit=\"${e.event_id}\" style=\"--accent:${categoryColor(e.category)}\">${e.title}</div>`; }\nfunction collectLegend(items){\n const map = new Map();\n items.forEach(e => { const c = e.category || 'Uncategorised'; if (!map.has(c)) map.set(c, categoryColor(c)); });\n return `<div class=\"legend\">${Array.from(map.entries()).map(([k,v]) => `<div class=\"chip\" style=\"--accent:${v}\">${k}</div>`).join('')}</div>`;\n}\nfunction renderList(items){\n const fmt = (e) => {\n const sd = (e.occurrence_start||'').slice(0,10);\n const st = e.all_day_event ? 'All-day' : (e.occurrence_start||'').slice(11,16);\n const et = e.all_day_event ? 'All-day' : (e.occurrence_end||'').slice(11,16);\n const desc = (e.description || '').trim() || e.title || '';\n return `${sd} ${st}--${et} ${desc}`;\n };\n eventsEl.innerHTML=(items.map(e=>`<div class=\"card\">${fmt(e)}</div>`).join('')||'<div class=\"card\">No events in this window.</div>');\n}\nfunction layoutTimedEvents(dayItems){\n const events = dayItems.slice().sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n let i = 0; const out = [];\n while (i < events.length){\n let clusterEnd = startMinutes(events[i].occurrence_end);\n const cluster = [events[i]];\n let j = i + 1;\n while (j < events.length && startMinutes(events[j].occurrence_start) < clusterEnd){\n cluster.push(events[j]); clusterEnd = Math.max(clusterEnd, startMinutes(events[j].occurrence_end)); j++;\n }\n const active = []; let maxCols = 0;\n const placed = cluster.map(e => {\n const start = startMinutes(e.occurrence_start), end = startMinutes(e.occurrence_end);\n for (let k = active.length - 1; k >= 0; k--) if (active[k].end <= start) active.splice(k,1);\n const used = new Set(active.map(a => a.col));\n let col = 0; while (used.has(col)) col++;\n active.push({ end, col }); maxCols = Math.max(maxCols, col + 1);\n return { e, start, end, col };\n });\n placed.forEach(p => out.push({ ...p, span: maxCols }));\n i = j;\n }\n return out;\n}\nfunction renderWeek(items,anchor){\n const d=new Date(anchor+'T00:00:00'); const diff=(d.getDay()+6)%7; d.setDate(d.getDate()-diff);\n const days=Array.from({length:7},(_,i)=>new Date(d.getFullYear(),d.getMonth(),d.getDate()+i)); const by=Object.fromEntries(days.map(x=>[ymdLocal(x),[]]));\n items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); if(by[k]) by[k].push(e);});\n const scaleLabels = Array.from({length:24}, (_,h)=>`<div class=\"time-label\" style=\"top:${h*40}px\">${String(h).padStart(2,'0')}:00</div>`).join('');\n const cols=days.map(dt=>{\n const k=ymdLocal(dt); const day=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n const ad=day.filter(x=>x.all_day_event), td=day.filter(x=>!x.all_day_event);\n const blocks=layoutTimedEvents(td).map(p=>{\n const top=Math.max(0,p.start/1.5), h=Math.max(24,(p.end-p.start)/1.5);\n const widthPct=100/p.span; const left=`calc(${p.col*widthPct}% + 2px)`; const width=`calc(${widthPct}% - 4px)`;\n const st = (p.e.occurrence_start||'').slice(11,16);\n return `<div class=\"week-event\" data-edit=\"${p.e.event_id}\" style=\"top:${top}px;height:${h}px;left:${left};width:${width};--accent:${categoryColor(p.e.category)};border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, white);\">${st} ${p.e.title}</div>`;\n }).join('');\n return `<div class=\"week-day\"><div class=\"week-head\">${dt.toDateString().slice(0,10)}</div><div class=\"all-day-list\">${ad.map(e=>eventChip(e)).join('')}</div><div class=\"time-lane\">${blocks}</div></div>`;\n }).join('');\n const scaleCol = `<div class=\"time-scale\"><div class=\"week-head\">Time</div><div class=\"time-lane\">${scaleLabels}</div></div>`;\n eventsEl.innerHTML=`<div class=\"week-grid\">${scaleCol}${cols}</div>${collectLegend(items)}`;\n}\nfunction renderMonth(items,anchor){\n const b=new Date(anchor+'T00:00:00'); const y=b.getFullYear(),m=b.getMonth(); const first=new Date(y,m,1); const off=(first.getDay()+6)%7; const dim=new Date(y,m+1,0).getDate();\n const by={}; items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); (by[k]=by[k]||[]).push(e);});\n const dow = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];\n const headers = dow.map(d=>`<div class=\"month-dow\">${d}</div>`).join('');\n let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"month-cell blank\"></div>';\n for(let d=1; d<=dim; d++){\n const dt=new Date(y,m,d), k=ymdLocal(dt);\n const evs=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n cells+=`<div class=\"month-cell\"><div class=\"day-num\">${d}</div>${evs.map(e=>{ const t=e.all_day_event?'All-day':(e.occurrence_start||'').slice(11,16); return eventChip({...e, title:`${t} ${e.title}`}); }).join('')}</div>`;\n }\n eventsEl.innerHTML=`<div class=\"month-dow-grid\">${headers}</div><div class=\"month-grid\">${cells}</div>${collectLegend(items)}`;\n}\nfunction renderYear(items,anchor){\n const y=new Date(anchor+'T00:00:00').getFullYear(); const set=new Set(items.map(e=>(e.occurrence_start||'').slice(0,10))); const n=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n const blocks=Array.from({length:12},(_,m)=>{const f=new Date(y,m,1),off=(f.getDay()+6)%7,dim=new Date(y,m+1,0).getDate(); let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"year-day\"></div>';\n for(let d=1; d<=dim; d++){ const k=ymdLocal(new Date(y,m,d)); cells+=`<div class=\"${set.has(k)?'year-day has-event':'year-day'}\" data-year-date=\"${k}\">${d}</div>`; }\n return `<div class=\"year-month\"><h4>${n[m]}</h4><div class=\"year-days\">${cells}</div></div>`; }).join('');\n eventsEl.innerHTML=`<div class=\"year-grid\">${blocks}</div>`;\n}\nfunction startOfViewPeriod(d, view){\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n if (view === 'week'){ const diff = (x.getDay()+6)%7; x.setDate(x.getDate()-diff); return x; }\n if (view === 'month'){ return new Date(x.getFullYear(), x.getMonth(), 1); }\n if (view === 'year'){ return new Date(x.getFullYear(), 0, 1); }\n return x;\n}\nasync function loadEvents(){ statusEl.textContent='Loading...'; const qs=new URLSearchParams({view:viewEl.value,date:anchorEl.value}); const resp=await fetch(rootPath('/wp-json/calendar/v1/public/events?'+qs.toString())); const payload=await resp.json();\n if(!resp.ok){ statusEl.textContent=payload?.error?.message||'Error'; statusEl.className='err'; return; } let items=payload.data||[];\n futureOnlyWrapEl.style.display = viewEl.value === 'list' ? '' : 'none';\n if(viewEl.value==='list' && futureOnlyEl.checked){ const td=ymdLocal(new Date()); items=items.filter(i=>(i.occurrence_start||'').slice(0,10)>=td); }\n statusEl.textContent=`Loaded ${items.length} item(s)`; statusEl.className='ok';\n if(viewEl.value==='week') renderWeek(items,anchorEl.value); else if(viewEl.value==='month') renderMonth(items,anchorEl.value); else if(viewEl.value==='year') renderYear(items,anchorEl.value); else renderList(items);\n eventsEl.querySelectorAll('[data-edit]').forEach(el=>el.addEventListener('click',async()=>{\n const id=el.getAttribute('data-edit');\n if (session.canWrite) {\n const r=await fetch(apiUrl('/wp-json/calendar/v1/events/'+id),{headers:authHeaders()}); const p=await r.json(); if(p?.data) openModal('edit',p.data);\n return;\n }\n const hit = items.find(i => String(i.event_id) === String(id));\n if (hit) openDetail(hit);\n }));\n eventsEl.querySelectorAll('[data-year-date]').forEach(el=>el.addEventListener('click',()=>{ viewEl.value='week'; anchorEl.value=el.getAttribute('data-year-date'); loadEvents(); }));\n}\nasync function apiWrite(path,method,bodyObj){ const resp=await fetch(apiUrl(path),{method,headers:{'Content-Type':'application/json',...authHeaders()},body:bodyObj?JSON.stringify(bodyObj):undefined}); statusEl.textContent=`${method} ${path} -> ${resp.status}`; statusEl.className=resp.ok?'ok':'err'; return resp; }\nnewEventBtnEl.addEventListener('click',()=>openModal('create',{}));\ndocument.getElementById('closeModalBtn').addEventListener('click',closeModal);\ndocument.getElementById('saveCreateBtn').addEventListener('click',async()=>{await apiWrite('/wp-json/calendar/v1/events','POST',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveUpdateBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'PATCH',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveDeleteBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'DELETE'); closeModal(); loadEvents();});\ndocument.getElementById('toggleSingleOccurrenceBtn').addEventListener('click',async()=>{ const p=document.getElementById('singleOccurrencePanel'); p.style.display = p.style.display==='none'?'':'none'; if(p.style.display!=='none') await loadOccurrenceChooser(); });\ndocument.getElementById('occPrevBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()-1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('occNextBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()+1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('deleteOccurrenceBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; const key=encodeURIComponent(document.getElementById('occKey').value); if(!id||!key) return; await apiWrite('/wp-json/calendar/v1/events/'+id+'/occurrences/'+key,'DELETE'); await loadOccurrenceChooser(); loadEvents();});\ndocument.getElementById('repeatType').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('rangeMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('monthlyNthMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('repeatInterval').addEventListener('input',everyText);\ndocument.getElementById('allDay').addEventListener('change', ()=>{{ applyAllDayVisibility(); updateEventButtons(); }});\n['title','startDate','endDate','startTime','endTime','repeatType','occKey'].forEach(id=>document.getElementById(id).addEventListener('input',updateEventButtons));\nfunction shiftAnchor(dir){\n const d = parseYmd(anchorEl.value);\n const v = viewEl.value;\n const s = startOfViewPeriod(d, v);\n if (v === 'day' || v === 'list') s.setDate(s.getDate() + dir);\n else if (v === 'week') s.setDate(s.getDate() + (7*dir));\n else if (v === 'month') s.setMonth(s.getMonth() + dir);\n else if (v === 'year') s.setFullYear(s.getFullYear() + dir);\n anchorEl.value = ymdLocal(startOfViewPeriod(s, v));\n}\ndocument.getElementById('prevBtn').addEventListener('click',()=>{ shiftAnchor(-1); loadEvents(); });\ndocument.getElementById('nextBtn').addEventListener('click',()=>{ shiftAnchor(1); loadEvents(); });\ndocument.getElementById('todayBtn').addEventListener('click',()=>{ const t = startOfViewPeriod(new Date(), viewEl.value); anchorEl.value = ymdLocal(t); loadEvents(); });\nloginBtnEl.addEventListener('click', ()=> loginModalEl.classList.add('open'));\ndocument.getElementById('closeLoginBtn').addEventListener('click', ()=>{ loginModalEl.classList.remove('open'); showLoginFeedback('', true); });\ndocument.getElementById('closeDetailBtn').addEventListener('click', closeDetail);\nlogoutBtnEl.addEventListener('click', ()=>{ session = { email:'', password:'', user:null, canWrite:false }; refreshAuthUi(); closeModal(); loadEvents(); });\ndocument.getElementById('doLoginBtn').addEventListener('click', async ()=>{\n const email = (document.getElementById('loginEmail').value || '').trim().toLowerCase();\n const password = document.getElementById('loginPassword').value || '';\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/me'), { headers: { Authorization: 'Basic ' + btoa(email + ':' + password) } });\n const payload = await resp.json();\n if (!resp.ok || !payload?.data){\n const msg = 'Login failure';\n statusEl.textContent = msg; statusEl.className='err';\n showLoginFeedback(msg, false);\n return;\n }\n session.email = email;\n session.password = password;\n session.user = payload.data;\n session.canWrite = payload.data.account_status === 'active';\n refreshAuthUi();\n showLoginFeedback('Login succeeded.', true);\n loginModalEl.classList.remove('open');\n loadEvents();\n});\ndocument.getElementById('regBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('regEmail').value || '').trim().toLowerCase(), password: document.getElementById('regPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/register'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Registered. Check your email for a verification link or token.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('verifyBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('verifyToken').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/verify'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = resp.ok\n ? 'An admin will review your request and notify you if approved.'\n : (payload?.error?.message || 'Verify failed');\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('forgotBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('forgotEmail').value || '').trim().toLowerCase() };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/forgot-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'If the account exists, a reset token has been sent by email.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('resetBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('resetToken').value || '', new_password: document.getElementById('resetPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/reset-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Password reset complete';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\nviewEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nanchorEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nfutureOnlyEl.addEventListener('change',loadEvents);\n['loginEmail','loginPassword','regEmail','regPw','verifyToken','forgotEmail','resetToken','resetPw'].forEach(id=>{ const el=document.getElementById(id); el.addEventListener('input', updateAuthButtonStates); });\nupdateAuthButtonStates();\nshowLoginFeedback('', true);\nrefreshAuthUi();\napplyAllDayVisibility();\nupdateEventButtons();\nloadEvents();\n</script>\n\n</body>\n</html>", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 6585\r\n\r\n{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9e61840edd26b59c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"6f79e4a470012e8c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"start_datetime\": \"2026-04-06T09:00:00+01:00\", \"end_datetime\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 10, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7dd021ab4c51e62e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"start_datetime\": \"2026-04-08T12:30:00+01:00\", \"end_datetime\": \"2026-04-08T13:30:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"382b171c7e467f49\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-30T17:00:00+01:00\", \"end_datetime\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-08-31\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"6a0b1853010a3060\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 6, \"uid\": \"fixture-ce-006@calendar-wp-plugin\", \"title\": \"Annual Conference\", \"description\": \"Annual community conference.\", \"location\": \"Main Hall\", \"category\": \"Events\", \"all_day_event\": false, \"start_datetime\": \"2026-06-15T10:00:00+01:00\", \"end_datetime\": \"2026-06-15T17:00:00+01:00\", \"repeat_type\": \"yearly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0344b53653b1897e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"start_datetime\": \"2026-04-07T15:00:00+01:00\", \"end_datetime\": \"2026-04-07T16:00:00+01:00\", \"repeat_type\": \"custom\", \"repeat_interval\": 2, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-07-31\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f3727cb12d14614a\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 8, \"uid\": \"fixture-ce-008@calendar-wp-plugin\", \"title\": \"DST Validation Event\", \"description\": \"Validates DST transition rendering.\", \"location\": \"Lab\", \"category\": \"QA\", \"all_day_event\": false, \"start_datetime\": \"2026-10-25T00:30:00+01:00\", \"end_datetime\": \"2026-10-25T02:30:00+00:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"2200904959f9c5cd\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 9, \"uid\": \"fixture-ce-009@calendar-wp-plugin\", \"title\": \"Leap Day Marker\", \"description\": \"Leap day recurrence behavior.\", \"location\": \"Calendar\", \"category\": \"QA\", \"all_day_event\": false, \"start_datetime\": \"2028-02-29T09:00:00+00:00\", \"end_datetime\": \"2028-02-29T10:00:00+00:00\", \"repeat_type\": \"yearly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"028aa2cacadd930b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"start_datetime\": \"2026-04-03T14:00:00+01:00\", \"end_datetime\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 8, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"47a32ea36bccb6cf\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}], \"meta\": {\"count\": 10}}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b626877cd3d20036\"", "Content-Length": "3132"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"b626877cd3d20036\"\r\nContent-Length: 3132\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9e61840edd26b59c\"", "Content-Length": "364"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"9e61840edd26b59c\"\r\nContent-Length: 364\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "ETag": "\"e5984c98962fda96\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nETag: \"e5984c98962fda96\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e5984c98962fda96\"", "Content-Length": "288"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"e5984c98962fda96\"\r\nContent-Length: 288\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "ETag": "\"a4f11de675293164\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nETag: \"a4f11de675293164\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a4f11de675293164\"", "Content-Length": "319"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"a4f11de675293164\"\r\nContent-Length: 319\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "ETag": "\"db9706d0865b79d9\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nETag: \"db9706d0865b79d9\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"db9706d0865b79d9\"", "Content-Length": "327"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"db9706d0865b79d9\"\r\nContent-Length: 327\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "ETag": "\"9b7f63d5c08cc7c8\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nETag: \"9b7f63d5c08cc7c8\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9b7f63d5c08cc7c8\"", "Content-Length": "322"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"9b7f63d5c08cc7c8\"\r\nContent-Length: 322\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 673\r\n\r\n{\"data\": {\"id\": 15, \"uid\": \"4e9ee4c86911a55106b9@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0323ee6baedfc4b5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e6f09ba57238f931\"", "Content-Length": "420"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: text/calendar; charset=utf-8\r\nETag: \"e6f09ba57238f931\"\r\nContent-Length: 420\r\n\r\nBEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:4e9ee4c86911a55106b9@calendar-wp-plugin\r\nDTSTAMP:20260330T141436Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 655\r\n\r\n{\"data\": {\"id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"bbc40060424cca3d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 5212\r\n\r\n{\"data\": [{\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-06T10:00:00+00:00\", \"occurrence_end\": \"2026-03-06T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-07T10:00:00+00:00\", \"occurrence_end\": \"2026-03-07T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-08T10:00:00+00:00\", \"occurrence_end\": \"2026-03-08T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-09T10:00:00+00:00\", \"occurrence_end\": \"2026-03-09T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-10T10:00:00+00:00\", \"occurrence_end\": \"2026-03-10T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-12T10:00:00+00:00\", \"occurrence_end\": \"2026-03-12T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-13T10:00:00+00:00\", \"occurrence_end\": \"2026-03-13T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-14T10:00:00+00:00\", \"occurrence_end\": \"2026-03-14T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-15T10:00:00+00:00\", \"occurrence_end\": \"2026-03-15T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-16T10:00:00+00:00\", \"occurrence_end\": \"2026-03-16T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-17T10:00:00+00:00\", \"occurrence_end\": \"2026-03-17T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-18T10:00:00+00:00\", \"occurrence_end\": \"2026-03-18T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-19T10:00:00+00:00\", \"occurrence_end\": \"2026-03-19T11:00:00+00:00\", \"repeat_type\": \"daily\"}]}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT"}, "body": "HTTP/1.0 204 No Content\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:36 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 4906\r\n\r\n{\"data\": [{\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-06T10:00:00+00:00\", \"occurrence_end\": \"2026-03-06T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-07T10:00:00+00:00\", \"occurrence_end\": \"2026-03-07T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-08T10:00:00+00:00\", \"occurrence_end\": \"2026-03-08T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-09T10:00:00+00:00\", \"occurrence_end\": \"2026-03-09T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-12T10:00:00+00:00\", \"occurrence_end\": \"2026-03-12T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-13T10:00:00+00:00\", \"occurrence_end\": \"2026-03-13T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-14T10:00:00+00:00\", \"occurrence_end\": \"2026-03-14T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-15T10:00:00+00:00\", \"occurrence_end\": \"2026-03-15T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-16T10:00:00+00:00\", \"occurrence_end\": \"2026-03-16T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-17T10:00:00+00:00\", \"occurrence_end\": \"2026-03-17T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-18T10:00:00+00:00\", \"occurrence_end\": \"2026-03-18T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-19T10:00:00+00:00\", \"occurrence_end\": \"2026-03-19T11:00:00+00:00\", \"repeat_type\": \"daily\"}]}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:18080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:37 GMT", "ETag": "\"1c3e46425e90df29\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:37 GMT\r\nETag: \"1c3e46425e90df29\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:14:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:37 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 11006\r\n\r\n{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9e61840edd26b59c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"6f79e4a470012e8c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"start_datetime\": \"2026-04-06T09:00:00+01:00\", \"end_datetime\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 10, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7dd021ab4c51e62e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"start_datetime\": \"2026-04-08T12:30:00+01:00\", \"end_datetime\": \"2026-04-08T13:30:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"382b171c7e467f49\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-30T17:00:00+01:00\", \"end_datetime\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-08-31\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"6a0b1853010a3060\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 6, \"uid\": \"fixture-ce-006@calendar-wp-plugin\", \"title\": \"Annual Conference\", \"description\": \"Annual community conference.\", \"location\": \"Main Hall\", \"category\": \"Events\", \"all_day_event\": false, \"start_datetime\": \"2026-06-15T10:00:00+01:00\", \"end_datetime\": \"2026-06-15T17:00:00+01:00\", \"repeat_type\": \"yearly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0344b53653b1897e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"start_datetime\": \"2026-04-07T15:00:00+01:00\", \"end_datetime\": \"2026-04-07T16:00:00+01:00\", \"repeat_type\": \"custom\", \"repeat_interval\": 2, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-07-31\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f3727cb12d14614a\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 8, \"uid\": \"fixture-ce-008@calendar-wp-plugin\", \"title\": \"DST Validation Event\", \"description\": \"Validates DST transition rendering.\", \"location\": \"Lab\", \"category\": \"QA\", \"all_day_event\": false, \"start_datetime\": \"2026-10-25T00:30:00+01:00\", \"end_datetime\": \"2026-10-25T02:30:00+00:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"2200904959f9c5cd\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 9, \"uid\": \"fixture-ce-009@calendar-wp-plugin\", \"title\": \"Leap Day Marker\", \"description\": \"Leap day recurrence behavior.\", \"location\": \"Calendar\", \"category\": \"QA\", \"all_day_event\": false, \"start_datetime\": \"2028-02-29T09:00:00+00:00\", \"end_datetime\": \"2028-02-29T10:00:00+00:00\", \"repeat_type\": \"yearly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"028aa2cacadd930b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"start_datetime\": \"2026-04-03T14:00:00+01:00\", \"end_datetime\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 8, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1062edf9fc69e84f\\\"\", \"sync_version\": 2, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 11, \"uid\": \"smoke-vtimezone-parser-001\", \"title\": \"Smoke VTIMEZONE Parse\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-23T15:00:00+01:00\", \"end_datetime\": \"2026-04-23T16:00:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e5984c98962fda96\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 12, \"uid\": \"smoke-monthly-nth-001\", \"title\": \"Smoke Monthly Nth\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-26T15:00:00+01:00\", \"end_datetime\": \"2026-04-26T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a4f11de675293164\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 13, \"uid\": \"smoke-monthly-ordinal-001\", \"title\": \"Smoke Monthly Ordinal\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-11T15:00:00+01:00\", \"end_datetime\": \"2026-04-11T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 2, \"repeat_nth_weekday\": 6, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"db9706d0865b79d9\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 14, \"uid\": \"smoke-monthly-last-001\", \"title\": \"Smoke Monthly Last\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-25T15:00:00+01:00\", \"end_datetime\": \"2026-04-25T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": -1, \"repeat_nth_weekday\": 6, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9b7f63d5c08cc7c8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 15, \"uid\": \"4e9ee4c86911a55106b9@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e6f09ba57238f931\\\"\", \"sync_version\": 2, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 16, \"uid\": \"771bbfbfb45098265113@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"904acb970acebc29\\\"\", \"sync_version\": 3, \"updated_at\": \"2026-03-30T14:14:36+00:00\"}, {\"id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+01:00\", \"end_datetime\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1c3e46425e90df29\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:14:37+00:00\"}], \"meta\": {\"count\": 17}}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:37 GMT\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 4474\r\n\r\n{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-06T10:00:00+01:00\", \"occurrence_end\": \"2026-03-06T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-07T10:00:00+01:00\", \"occurrence_end\": \"2026-03-07T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-08T10:00:00+01:00\", \"occurrence_end\": \"2026-03-08T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-09T10:00:00+01:00\", \"occurrence_end\": \"2026-03-09T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-12T10:00:00+01:00\", \"occurrence_end\": \"2026-03-12T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-13T10:00:00+01:00\", \"occurrence_end\": \"2026-03-13T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-14T10:00:00+01:00\", \"occurrence_end\": \"2026-03-14T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-15T10:00:00+01:00\", \"occurrence_end\": \"2026-03-15T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-16T10:00:00+01:00\", \"occurrence_end\": \"2026-03-16T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-17T10:00:00+01:00\", \"occurrence_end\": \"2026-03-17T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-18T10:00:00+01:00\", \"occurrence_end\": \"2026-03-18T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-19T10:00:00+01:00\", \"occurrence_end\": \"2026-03-19T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_truncated": false}}
{"ts": "2026-03-30T14:14:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:18080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:14:37 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:14:37 GMT\r\nContent-Type: text/html; charset=utf-8\r\nContent-Length: 43446\r\n\r\n<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Calendar</title>\n <style>\n body { font-family: ui-sans-serif, system-ui, sans-serif; margin: 0; background: #f7f7f5; color: #1f2937; }\n header { background: #0f766e; color: #fff; padding: 14px 18px; }\n header a { color: #fff; margin-right: 10px; }\n main { max-width: 1100px; margin: 18px auto; padding: 0 12px; }\n .card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 12px; margin-bottom: 12px; }\n input, select, textarea, button { font: inherit; }\n button { padding: 7px 10px; border: 1px solid #d1d5db; border-radius: 8px; background: #fff; cursor: pointer; }\n button:disabled { opacity: 0.45; cursor: not-allowed; }\n table { width: 100%; border-collapse: collapse; }\n th, td { border-bottom: 1px solid #e5e7eb; padding: 8px; text-align: left; vertical-align: top; }\n .row { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 8px; }\n .muted { color: #6b7280; font-size: 0.9rem; }\n .ok { color: #065f46; }\n .err { color: #991b1b; }\n .grid3 { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:8px; }\n .grid4 { display:grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap:8px; }\n .field { position: relative; margin: 14px 0; }\n .field > label { position:absolute; top:-0.62rem; left:0.6rem; font-size:0.72rem; line-height:1; background:#fff; padding:0 0.25rem; color:#4b5563; letter-spacing:0.01em; }\n .field > input, .field > select, .field > textarea {\n width: 100%; box-sizing: border-box; padding: 0.78rem 0.65rem 0.5rem 0.65rem;\n border: 1px solid #cbd5e1; border-radius: 8px; background: #fff;\n }\n .field-with-suffix > input { padding-right: 5.5rem; }\n .input-suffix {\n position: absolute; right: 0.7rem; top: 56%;\n transform: translateY(-50%); color: #374151; font-size: 0.84rem; pointer-events: none;\n }\n .toolbar { display:flex; gap:8px; flex-wrap: wrap; align-items: end; }\n #topControls { align-items: center; }\n .topbar { display:flex; justify-content:space-between; gap:10px; align-items:flex-start; flex-wrap:wrap; }\n .topbar-right { margin-left:auto; text-align:right; min-width: 220px; }\n .topbar-right a { display:block; margin-bottom:4px; }\n .toggle-wrap { display:flex; align-items:center; padding: 0 2px; min-height: 38px; }\n .toggle-wrap label { position: static; font-size: 0.9rem; background: transparent; padding: 0; }\n .modal { position: fixed; inset: 0; background: rgba(15,23,42,0.45); display: none; align-items: center; justify-content: center; z-index: 1000; }\n .modal.open { display:flex; }\n .modal-card { width: min(900px, 92vw); max-height: 92vh; overflow: auto; background: #fff; border-radius: 10px; padding: 12px; }\n .week-grid { display:grid; grid-template-columns: 56px repeat(7, 1fr); gap:8px; }\n .time-scale { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .time-scale .week-head { text-align:center; }\n .time-scale .time-lane { font-size:0.68rem; color:#6b7280; }\n .time-label { position:absolute; left:4px; transform: translateY(-50%); }\n .week-day { border:1px solid #e5e7eb; border-radius:8px; background:#fff; overflow:hidden; }\n .week-head { padding:6px; border-bottom:1px solid #e5e7eb; font-size:0.85rem; font-weight:600; }\n .all-day-list { min-height:24px; padding:4px; border-bottom:1px dashed #e5e7eb; font-size:0.75rem; }\n .time-lane { position:relative; height: 960px; background:\n repeating-linear-gradient(to bottom, #f8fafc 0, #f8fafc 39px, #eef2f7 39px, #eef2f7 40px); }\n .week-event { position:absolute; background:#dcfce7; border:1px solid #86efac; border-radius:6px; font-size:0.72rem; padding:2px 4px; overflow:hidden; cursor:pointer; box-shadow: 0 1px 2px rgba(0,0,0,0.08); }\n .week-event:hover { filter: brightness(0.97); transform: translateY(-1px); }\n .month-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; }\n .month-dow-grid { display:grid; grid-template-columns: repeat(7, minmax(0,1fr)); gap:8px; margin-bottom: 6px; }\n .month-dow { font-size: 0.78rem; font-weight: 700; color: #4b5563; text-align: center; }\n .month-cell { min-height:130px; border:1px solid #e5e7eb; border-radius:8px; background:#fff; padding:5px; }\n .month-cell.blank { background:#f3f4f6; }\n .day-num { font-size:0.82rem; font-weight:700; }\n .mini-evt { font-size:0.72rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; border-left: 3px solid var(--accent, #34d399); background: color-mix(in srgb, var(--accent, #34d399) 12%, white); padding:2px 4px; margin-top:3px; cursor:pointer; border-radius:4px; }\n .mini-evt:hover { filter: brightness(0.97); }\n .year-grid { display:grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap:10px; }\n .year-month { border:1px solid #e5e7eb; border-radius:8px; padding:6px; background:#fff; }\n .year-month h4 { margin: 3px 0 6px; font-size:0.9rem; }\n .year-days { display:grid; grid-template-columns: repeat(7, 1fr); gap:3px; }\n .year-day { font-size:0.7rem; border:1px solid #edf2f7; border-radius:4px; min-height:22px; text-align:center; line-height:22px; }\n .year-day.has-event { font-weight: 700; background: #ecfeff; border-color: #67e8f9; }\n .legend { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }\n .legend .chip { border:1px solid #e5e7eb; border-left: 4px solid var(--accent,#34d399); border-radius: 6px; padding: 3px 8px; font-size: 0.75rem; background:#fff; }\n #occurrenceGrid .year-grid { grid-template-columns: repeat(3, minmax(220px, 1fr)); gap: 10px; align-items: start; }\n #occurrenceGrid .month-grid { gap: 4px; }\n #occurrenceGrid .month-cell { min-height: 24px; padding: 3px; }\n #occurrenceGrid .day-num { font-size: 0.76rem; line-height: 1.1; text-align: center; }\n #occurrenceGrid .month-cell.active { background: #ecfeff; border-color: #67e8f9; }\n #loginModal .field > label {\n position: static;\n display: inline-block;\n margin: 0 0 0.2rem;\n font-size: 0.8rem;\n background: transparent;\n padding: 0;\n color: #4b5563;\n }\n #loginModal .field > input {\n padding: 0.6rem 0.65rem;\n }\n </style>\n</head>\n<body>\n\n<header><strong>Calendar Fixture</strong> <span class=\"muted\">Public Calendar UI</span></header>\n<main>\n <div class=\"card\">\n <div class=\"topbar\">\n <div class=\"toolbar\" id=\"topControls\">\n <div class=\"field\"><label>View</label>\n <select id=\"view\">\n <option value=\"list\">List</option>\n <option value=\"day\">Day</option>\n <option value=\"week\">Week</option>\n <option value=\"month\" selected>Month</option>\n <option value=\"year\">Year</option>\n </select>\n </div>\n <div class=\"field\"><label>Date</label><input id=\"anchor\" type=\"date\" /></div>\n <div id=\"futureOnlyWrap\" class=\"toggle-wrap\"><label><input id=\"futureOnly\" type=\"checkbox\" checked /> Future Only</label></div>\n <button id=\"prevBtn\" title=\"Previous\">&#8592;</button>\n <button id=\"todayBtn\" title=\"Today\">&#128197;</button>\n <button id=\"nextBtn\" title=\"Next\">&#8594;</button>\n <button id=\"newEventBtn\">Create Event</button>\n <button id=\"loginBtn\">Login</button>\n </div>\n <div class=\"topbar-right\">\n <a href=\"/calendar.ics\" target=\"_blank\">ICS Link</a>\n <a href=\"/caldav/\" target=\"_blank\">CalDAV</a>\n <div id=\"status\" class=\"muted\"></div>\n <div id=\"authState\" class=\"muted\"></div>\n <button id=\"logoutBtn\" style=\"display:none\">Logout</button>\n </div>\n </div>\n </div>\n <div id=\"events\"></div>\n <div id=\"loginModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Account Login</h3>\n <div id=\"loginFeedback\" class=\"muted\"></div>\n <div class=\"row\">\n <div class=\"field\"><label>Email</label><input id=\"loginEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password</label><input id=\"loginPassword\" type=\"password\" /></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"doLoginBtn\" disabled>Login</button>\n <button id=\"closeLoginBtn\">Close</button>\n </div>\n <div class=\"card\">\n <h4>Register</h4>\n <div class=\"field\"><label>Email</label><input id=\"regEmail\" type=\"email\" /></div>\n <div class=\"field\"><label>Password (8+ chars)</label><input id=\"regPw\" type=\"password\" /></div>\n <div class=\"toolbar\"><button id=\"regBtn\" disabled>Register</button></div>\n <div class=\"field\"><label>Verify Token</label><input id=\"verifyToken\" /></div>\n <div class=\"toolbar\"><button id=\"verifyBtn\" disabled>Verify Email</button></div>\n </div>\n <div class=\"card\">\n <h4>Password Recovery</h4>\n <div class=\"field\"><label>Email</label><input id=\"forgotEmail\" type=\"email\" /></div>\n <button id=\"forgotBtn\" disabled>Send Reset Token</button>\n <div class=\"field\"><label>Reset Token</label><input id=\"resetToken\" /></div>\n <div class=\"field\"><label>New Password</label><input id=\"resetPw\" type=\"password\" /></div>\n <button id=\"resetBtn\" disabled>Reset Password</button>\n </div>\n </div>\n </div>\n <div id=\"detailModal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3>Event Details</h3>\n <div class=\"field\"><label>Title</label><input id=\"detailTitle\" readonly /></div>\n <div class=\"field\"><label>Category</label><input id=\"detailCategory\" readonly /></div>\n <div class=\"field\"><label>Description</label><textarea id=\"detailDescription\" rows=\"5\" readonly></textarea></div>\n <div class=\"toolbar\"><button id=\"closeDetailBtn\">Close</button></div>\n </div>\n </div>\n <div id=\"modal\" class=\"modal\">\n <div class=\"modal-card\">\n <h3 id=\"modalTitle\">Event</h3>\n <input id=\"eventId\" type=\"hidden\" />\n <div class=\"field\"><label>Title</label><input id=\"title\" /></div>\n <div class=\"row\">\n <div class=\"field\"><label>Location</label><input id=\"location\" /></div>\n <div class=\"field\"><label>Category</label><input id=\"category\" /></div>\n </div>\n <div class=\"field\"><label>Description</label><textarea id=\"description\" rows=\"3\"></textarea></div>\n <div class=\"toggle-wrap\"><label><input id=\"allDay\" type=\"checkbox\" /> All Day Event</label></div>\n <div class=\"grid4\">\n <div class=\"field\"><label>Start Date</label><input id=\"startDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"startTimeWrap\"><label>Start Time</label><input id=\"startTime\" type=\"time\" /></div>\n <div class=\"field\"><label>End Date</label><input id=\"endDate\" type=\"date\" /></div>\n <div class=\"field\" id=\"endTimeWrap\"><label>End Time</label><input id=\"endTime\" type=\"time\" /></div>\n </div>\n <div class=\"row\">\n <div class=\"field\"><label>Repeat Type</label>\n <select id=\"repeatType\">\n <option value=\"none\">none</option>\n <option value=\"daily\">daily</option>\n <option value=\"weekly\">weekly</option>\n <option value=\"monthly\">monthly</option>\n <option value=\"yearly\">yearly</option>\n <option value=\"custom\">custom</option>\n </select>\n </div>\n <div class=\"field field-with-suffix\" id=\"repeatIntervalWrap\"><label>Every</label><input id=\"repeatInterval\" type=\"number\" min=\"1\" value=\"1\" /><span id=\"repeatIntervalText\" class=\"input-suffix\"></span></div>\n </div>\n <div class=\"row\" id=\"modeUntilRow\">\n <div class=\"field\"><label>Mode</label>\n <select id=\"rangeMode\">\n <option value=\"none\">none</option>\n <option value=\"no_end\">no_end</option>\n <option value=\"count\">count</option>\n <option value=\"until\">until</option>\n </select>\n </div>\n <div class=\"field\" id=\"repeatUntilWrap\"><label>Repeat Until</label><input id=\"repeatUntil\" type=\"date\" /></div>\n </div>\n <div class=\"row\" id=\"rangeWrap\">\n <div class=\"field\" id=\"repeatCountWrap\"><label>Repeat Count</label><input id=\"repeatCount\" type=\"number\" min=\"1\" /></div>\n </div>\n <div class=\"row\" id=\"monthlyNthWrap\">\n <div class=\"field\"><label>Monthly Pattern</label>\n <select id=\"monthlyNthMode\">\n <option value=\"\">from start date</option>\n <option value=\"day_of_month\">nth day of month</option>\n <option value=\"weekday_of_month\">nth weekday of month</option>\n </select>\n </div>\n <div class=\"field\" id=\"nthDayWrap\"><label>Day Number</label><input id=\"nthDay\" type=\"number\" min=\"1\" max=\"31\" /></div>\n </div>\n <div class=\"row\" id=\"nthWeekdayWrap\">\n <div class=\"field\"><label>Nth</label><select id=\"nthPos\"><option value=\"1\">1st</option><option value=\"2\">2nd</option><option value=\"3\">3rd</option><option value=\"4\">4th</option><option value=\"5\">5th</option><option value=\"-1\">last</option></select></div>\n <div class=\"field\"><label>Weekday</label><select id=\"nthWeekday\"><option value=\"0\">Sunday</option><option value=\"1\">Monday</option><option value=\"2\">Tuesday</option><option value=\"3\">Wednesday</option><option value=\"4\">Thursday</option><option value=\"5\">Friday</option><option value=\"6\">Saturday</option></select></div>\n </div>\n <div class=\"toolbar\">\n <button id=\"saveCreateBtn\">Create</button>\n <button id=\"saveUpdateBtn\">Update</button>\n <button id=\"saveDeleteBtn\">Delete</button>\n <button id=\"toggleSingleOccurrenceBtn\">Delete a Single Occurrence</button>\n <button id=\"closeModalBtn\">Close</button>\n </div>\n <div class=\"card\" id=\"singleOccurrencePanel\" style=\"display:none\">\n <h4>Delete Single Occurrence (Exception)</h4>\n <div class=\"toolbar\">\n <button id=\"occPrevBtn\">&#8592;</button>\n <button id=\"occNextBtn\">&#8594;</button>\n </div>\n <div id=\"occurrenceGrid\" class=\"month-grid\"></div>\n <input id=\"occKey\" type=\"hidden\" />\n <div class=\"field\"><label>Occurrence</label><input id=\"occKeyDisplay\" readonly placeholder=\"Select an occurrence from the calendar above\" /></div>\n <button id=\"deleteOccurrenceBtn\">Delete Occurrence</button>\n </div>\n </div>\n </div>\n</main>\n<script>\nconst statusEl = document.getElementById('status');\nconst authStateEl = document.getElementById('authState');\nconst loginFeedbackEl = document.getElementById('loginFeedback');\nconst eventsEl = document.getElementById('events');\nconst viewEl = document.getElementById('view');\nconst anchorEl = document.getElementById('anchor');\nconst futureOnlyWrapEl = document.getElementById('futureOnlyWrap');\nconst futureOnlyEl = document.getElementById('futureOnly');\nconst modalEl = document.getElementById('modal');\nconst loginModalEl = document.getElementById('loginModal');\nconst detailModalEl = document.getElementById('detailModal');\nconst loginBtnEl = document.getElementById('loginBtn');\nconst logoutBtnEl = document.getElementById('logoutBtn');\nconst newEventBtnEl = document.getElementById('newEventBtn');\nconst ROOT = \"\";\nlet session = { email:'', password:'', user:null, canWrite:false };\nviewEl.value = 'month';\nfunction pad2(n){ return String(n).padStart(2,'0'); }\nfunction ymdLocal(d){ return `${d.getFullYear()}-${pad2(d.getMonth()+1)}-${pad2(d.getDate())}`; }\nfunction parseYmd(s){ const p=(s||'').split('-'); if(p.length!==3) return new Date(); return new Date(Number(p[0]), Number(p[1])-1, Number(p[2])); }\nanchorEl.value = ymdLocal(new Date());\nfunction rootPath(path){ return ROOT + path; }\nfunction apiUrl(path) { return rootPath(path); }\nfunction authHeaders(){ return session.email && session.password ? { Authorization: 'Basic ' + btoa(session.email + ':' + session.password) } : {}; }\nfunction isEmail(v){ return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test((v||'').trim()); }\nfunction showLoginFeedback(msg, ok){\n loginFeedbackEl.textContent = msg || '';\n loginFeedbackEl.className = ok ? 'ok' : (msg ? 'err' : 'muted');\n}\nfunction updateAuthButtonStates(){\n const loginEmail = document.getElementById('loginEmail').value || '';\n const loginPw = document.getElementById('loginPassword').value || '';\n const regEmail = document.getElementById('regEmail').value || '';\n const regPw = document.getElementById('regPw').value || '';\n const verifyToken = document.getElementById('verifyToken').value || '';\n const forgotEmail = document.getElementById('forgotEmail').value || '';\n const resetToken = document.getElementById('resetToken').value || '';\n const resetPw = document.getElementById('resetPw').value || '';\n document.getElementById('doLoginBtn').disabled = !(isEmail(loginEmail) && loginPw.length >= 8);\n document.getElementById('regBtn').disabled = !(isEmail(regEmail) && regPw.length >= 8);\n document.getElementById('verifyBtn').disabled = !verifyToken.trim();\n document.getElementById('forgotBtn').disabled = !isEmail(forgotEmail);\n document.getElementById('resetBtn').disabled = !(resetToken.trim() && resetPw.length >= 8);\n}\nfunction refreshAuthUi(){\n const logged = !!session.user;\n loginBtnEl.style.display = logged ? 'none' : '';\n logoutBtnEl.style.display = logged ? '' : 'none';\n newEventBtnEl.style.display = session.canWrite ? '' : 'none';\n authStateEl.textContent = logged\n ? `Logged in as ${session.user.email}`\n : 'Public mode: read-only';\n updateEventButtons();\n}\nfunction splitIsoToInputs(iso) { if (!iso) return {d:'',t:''}; if (!iso.includes('T')) return {d:iso.slice(0,10),t:''}; return {d:iso.slice(0,10),t:iso.slice(11,16)}; }\nfunction toIso(d,t,allDay){ if(!d) return ''; if(allDay) return d; return `${d}T${(t||'00:00')}:00+01:00`; }\nfunction formatOccurrenceKey(iso){\n if (!iso) return '';\n const dt = new Date(iso);\n if (Number.isNaN(dt.getTime())) return iso;\n return dt.toLocaleString('en-GB', { year:'numeric', month:'short', day:'2-digit', hour:'2-digit', minute:'2-digit' });\n}\nfunction applyAllDayVisibility(){\n const allDay = !!document.getElementById('allDay').checked;\n document.getElementById('startTimeWrap').style.display = allDay ? 'none' : '';\n document.getElementById('endTimeWrap').style.display = allDay ? 'none' : '';\n}\nlet occCursor = new Date();\nfunction everyText(){\n const n = Number(document.getElementById('repeatInterval').value || 1);\n const rt = document.getElementById('repeatType').value;\n const unit = rt === 'daily' ? 'day' : rt === 'weekly' ? 'week' : rt === 'monthly' ? 'month' : rt === 'yearly' ? 'year' : rt === 'custom' ? 'week' : '';\n document.getElementById('repeatIntervalText').textContent = unit ? `${unit}${n===1?'':'s'}` : '';\n}\nfunction applyRecurrenceVisibility(){ const rt=document.getElementById('repeatType').value; const rm=document.getElementById('rangeMode').value; const show=rt!=='none';\n document.getElementById('repeatIntervalWrap').style.display=show?'':'none';\n document.getElementById('modeUntilRow').style.display=show?'':'none';\n document.getElementById('rangeWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatCountWrap').style.display=(show&&rm==='count')?'':'none';\n document.getElementById('repeatUntilWrap').style.display=(show&&rm==='until')?'':'none';\n document.getElementById('monthlyNthWrap').style.display=(rt==='monthly')?'':'none';\n const m = document.getElementById('monthlyNthMode').value;\n document.getElementById('nthDayWrap').style.display=(rt==='monthly' && m==='day_of_month')?'':'none';\n document.getElementById('nthWeekdayWrap').style.display=(rt==='monthly' && m==='weekday_of_month')?'':'none';\n document.getElementById('toggleSingleOccurrenceBtn').style.display=show?'':'none';\n if (!show) document.getElementById('singleOccurrencePanel').style.display='none';\n everyText();\n updateEventButtons();\n}\nfunction openModal(mode,evt){ if(!evt) evt={}; const sd=splitIsoToInputs(evt.start_datetime), ed=splitIsoToInputs(evt.end_datetime);\n if (!session.canWrite) return;\n document.getElementById('modalTitle').textContent=mode==='create'?'Create Event':'Edit Event';\n document.getElementById('eventId').value=evt.id||''; document.getElementById('title').value=evt.title||''; document.getElementById('location').value=evt.location||'';\n document.getElementById('category').value=evt.category||''; document.getElementById('description').value=evt.description||'';\n document.getElementById('allDay').checked=!!evt.all_day_event; document.getElementById('startDate').value=sd.d||''; document.getElementById('startTime').value=sd.t||'';\n document.getElementById('endDate').value=ed.d||''; document.getElementById('endTime').value=ed.t||''; document.getElementById('repeatType').value=evt.repeat_type||'none';\n document.getElementById('repeatInterval').value=evt.repeat_interval||1; document.getElementById('rangeMode').value=evt.repeat_range_mode||'none';\n document.getElementById('repeatCount').value=evt.repeat_count||''; document.getElementById('repeatUntil').value=evt.repeat_until||'';\n document.getElementById('monthlyNthMode').value=evt.repeat_nth_mode||'';\n document.getElementById('nthDay').value=evt.repeat_nth_day||'';\n document.getElementById('nthPos').value=evt.repeat_nth_pos||'1';\n document.getElementById('nthWeekday').value=evt.repeat_nth_weekday===null||evt.repeat_nth_weekday===undefined?'0':String(evt.repeat_nth_weekday);\n document.getElementById('singleOccurrencePanel').style.display='none';\n document.getElementById('occKey').value = '';\n document.getElementById('occKeyDisplay').value = '';\n occCursor = new Date((evt.start_datetime||new Date().toISOString()).slice(0,10) + 'T00:00:00');\n document.getElementById('toggleSingleOccurrenceBtn').style.display = mode==='edit' ? '' : 'none';\n document.getElementById('saveCreateBtn').style.display=mode==='create'?'':'none'; document.getElementById('saveUpdateBtn').style.display=mode==='edit'?'':'none';\n document.getElementById('saveDeleteBtn').style.display=mode==='edit'?'':'none'; applyRecurrenceVisibility(); modalEl.classList.add('open');\n applyAllDayVisibility();\n updateEventButtons();\n}\nfunction closeModal(){ modalEl.classList.remove('open'); }\nfunction openDetail(item){\n document.getElementById('detailTitle').value = item?.title || '';\n document.getElementById('detailCategory').value = item?.category || '';\n document.getElementById('detailDescription').value = item?.description || '';\n detailModalEl.classList.add('open');\n}\nfunction closeDetail(){ detailModalEl.classList.remove('open'); }\nfunction updateEventButtons(){\n const titleOk = !!(document.getElementById('title').value || '').trim();\n const startDate = (document.getElementById('startDate').value || '').trim();\n const endDateRaw = (document.getElementById('endDate').value || '').trim();\n const endDate = endDateRaw || startDate;\n const allDay = !!document.getElementById('allDay').checked;\n const startTime = (document.getElementById('startTime').value || '').trim();\n const endTime = (document.getElementById('endTime').value || '').trim();\n let validDateTime = false;\n if (startDate && endDate && endDate >= startDate){\n if (allDay){\n validDateTime = true;\n } else if (startTime && endTime){\n validDateTime = endDate > startDate || endTime >= startTime;\n }\n }\n const hasCore = titleOk && validDateTime;\n const hasId = !!(document.getElementById('eventId').value || '').trim();\n document.getElementById('saveCreateBtn').disabled = !(session.canWrite && hasCore && !hasId);\n document.getElementById('saveUpdateBtn').disabled = !(session.canWrite && hasCore && hasId);\n document.getElementById('saveDeleteBtn').disabled = !(session.canWrite && hasId);\n document.getElementById('toggleSingleOccurrenceBtn').disabled = !(session.canWrite && hasId && document.getElementById('repeatType').value !== 'none');\n document.getElementById('deleteOccurrenceBtn').disabled = !(session.canWrite && hasId && (document.getElementById('occKey').value || '').trim());\n}\nfunction eventPayload(){ const ad=document.getElementById('allDay').checked; return {\n title:document.getElementById('title').value, location:document.getElementById('location').value, category:document.getElementById('category').value,\n description:document.getElementById('description').value, all_day_event:ad,\n start_datetime:toIso(document.getElementById('startDate').value,document.getElementById('startTime').value,ad),\n end_datetime:toIso((document.getElementById('endDate').value || document.getElementById('startDate').value),document.getElementById('endTime').value,ad),\n repeat_type:document.getElementById('repeatType').value, repeat_interval:Number(document.getElementById('repeatInterval').value||1),\n repeat_nth_mode:document.getElementById('monthlyNthMode').value,\n repeat_nth_day:document.getElementById('nthDay').value?Number(document.getElementById('nthDay').value):null,\n repeat_nth_pos:document.getElementById('nthPos').value?Number(document.getElementById('nthPos').value):null,\n repeat_nth_weekday:document.getElementById('nthWeekday').value === '' ? null : Number(document.getElementById('nthWeekday').value),\n repeat_range_mode:document.getElementById('rangeMode').value, repeat_count:document.getElementById('repeatCount').value?Number(document.getElementById('repeatCount').value):null,\n repeat_until:document.getElementById('repeatUntil').value||null\n};}\nasync function loadOccurrenceChooser(){\n const id = document.getElementById('eventId').value;\n if (!id) return;\n const from = new Date(occCursor.getFullYear(), occCursor.getMonth(), 1);\n const fromS = ymdLocal(from);\n const r = await fetch(apiUrl('/wp-json/calendar/v1/events/' + id + '/occurrences?from=' + fromS + '&months=3'), {headers:authHeaders()});\n const p = await r.json();\n const list = p.data || [];\n const dayToKey = new Map();\n list.forEach(x => {\n const d = (x.occurrence_start || '').slice(0,10);\n if (d && !dayToKey.has(d)) dayToKey.set(d, x.occurrence_start);\n });\n const cells = [];\n for(let m=0;m<3;m++){\n const d = new Date(from.getFullYear(), from.getMonth()+m, 1);\n const y=d.getFullYear(), mo=d.getMonth();\n const first=new Date(y,mo,1), off=(first.getDay()+6)%7, dim=new Date(y,mo+1,0).getDate();\n let monthCells=''; for(let i=0;i<off;i++) monthCells += '<div class=\"month-cell blank\"></div>';\n for(let day=1; day<=dim; day++){\n const dt=new Date(y,mo,day); const k=ymdLocal(dt); const has=dayToKey.has(k);\n monthCells += `<div class=\"month-cell ${has?'active':'blank'}\"><div class=\"day-num\" data-occ-date=\"${k}\" style=\"cursor:${has?'pointer':'default'}\">${day}</div></div>`;\n }\n cells.push(`<div class=\"year-month\"><h4>${d.toLocaleString('en-GB',{month:'short',year:'numeric'})}</h4><div class=\"month-grid\">${monthCells}</div></div>`);\n }\n document.getElementById('occurrenceGrid').innerHTML = `<div class=\"year-grid\">${cells.join('')}</div>`;\n document.querySelectorAll('[data-occ-date]').forEach(el=>el.addEventListener('click',()=>{\n const k=el.getAttribute('data-occ-date'); if(!dayToKey.has(k)) return;\n const iso = dayToKey.get(k) || '';\n document.getElementById('occKey').value = iso;\n document.getElementById('occKeyDisplay').value = formatOccurrenceKey(iso);\n updateEventButtons();\n }));\n}\nfunction startMinutes(iso){ if(!iso||!iso.includes('T')) return 0; return Number(iso.slice(11,13))*60+Number(iso.slice(14,16)); }\nfunction categoryColor(category){\n const base = (category || 'general').toLowerCase();\n let h = 0; for (let i = 0; i < base.length; i++) h = (h * 31 + base.charCodeAt(i)) % 360;\n return `hsl(${h} 70% 45%)`;\n}\nfunction eventChip(e, cls='mini-evt'){ return `<div class=\"${cls}\" data-edit=\"${e.event_id}\" style=\"--accent:${categoryColor(e.category)}\">${e.title}</div>`; }\nfunction collectLegend(items){\n const map = new Map();\n items.forEach(e => { const c = e.category || 'Uncategorised'; if (!map.has(c)) map.set(c, categoryColor(c)); });\n return `<div class=\"legend\">${Array.from(map.entries()).map(([k,v]) => `<div class=\"chip\" style=\"--accent:${v}\">${k}</div>`).join('')}</div>`;\n}\nfunction renderList(items){\n const fmt = (e) => {\n const sd = (e.occurrence_start||'').slice(0,10);\n const st = e.all_day_event ? 'All-day' : (e.occurrence_start||'').slice(11,16);\n const et = e.all_day_event ? 'All-day' : (e.occurrence_end||'').slice(11,16);\n const desc = (e.description || '').trim() || e.title || '';\n return `${sd} ${st}--${et} ${desc}`;\n };\n eventsEl.innerHTML=(items.map(e=>`<div class=\"card\">${fmt(e)}</div>`).join('')||'<div class=\"card\">No events in this window.</div>');\n}\nfunction layoutTimedEvents(dayItems){\n const events = dayItems.slice().sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n let i = 0; const out = [];\n while (i < events.length){\n let clusterEnd = startMinutes(events[i].occurrence_end);\n const cluster = [events[i]];\n let j = i + 1;\n while (j < events.length && startMinutes(events[j].occurrence_start) < clusterEnd){\n cluster.push(events[j]); clusterEnd = Math.max(clusterEnd, startMinutes(events[j].occurrence_end)); j++;\n }\n const active = []; let maxCols = 0;\n const placed = cluster.map(e => {\n const start = startMinutes(e.occurrence_start), end = startMinutes(e.occurrence_end);\n for (let k = active.length - 1; k >= 0; k--) if (active[k].end <= start) active.splice(k,1);\n const used = new Set(active.map(a => a.col));\n let col = 0; while (used.has(col)) col++;\n active.push({ end, col }); maxCols = Math.max(maxCols, col + 1);\n return { e, start, end, col };\n });\n placed.forEach(p => out.push({ ...p, span: maxCols }));\n i = j;\n }\n return out;\n}\nfunction renderWeek(items,anchor){\n const d=new Date(anchor+'T00:00:00'); const diff=(d.getDay()+6)%7; d.setDate(d.getDate()-diff);\n const days=Array.from({length:7},(_,i)=>new Date(d.getFullYear(),d.getMonth(),d.getDate()+i)); const by=Object.fromEntries(days.map(x=>[ymdLocal(x),[]]));\n items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); if(by[k]) by[k].push(e);});\n const scaleLabels = Array.from({length:24}, (_,h)=>`<div class=\"time-label\" style=\"top:${h*40}px\">${String(h).padStart(2,'0')}:00</div>`).join('');\n const cols=days.map(dt=>{\n const k=ymdLocal(dt); const day=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n const ad=day.filter(x=>x.all_day_event), td=day.filter(x=>!x.all_day_event);\n const blocks=layoutTimedEvents(td).map(p=>{\n const top=Math.max(0,p.start/1.5), h=Math.max(24,(p.end-p.start)/1.5);\n const widthPct=100/p.span; const left=`calc(${p.col*widthPct}% + 2px)`; const width=`calc(${widthPct}% - 4px)`;\n const st = (p.e.occurrence_start||'').slice(11,16);\n return `<div class=\"week-event\" data-edit=\"${p.e.event_id}\" style=\"top:${top}px;height:${h}px;left:${left};width:${width};--accent:${categoryColor(p.e.category)};border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, white);\">${st} ${p.e.title}</div>`;\n }).join('');\n return `<div class=\"week-day\"><div class=\"week-head\">${dt.toDateString().slice(0,10)}</div><div class=\"all-day-list\">${ad.map(e=>eventChip(e)).join('')}</div><div class=\"time-lane\">${blocks}</div></div>`;\n }).join('');\n const scaleCol = `<div class=\"time-scale\"><div class=\"week-head\">Time</div><div class=\"time-lane\">${scaleLabels}</div></div>`;\n eventsEl.innerHTML=`<div class=\"week-grid\">${scaleCol}${cols}</div>${collectLegend(items)}`;\n}\nfunction renderMonth(items,anchor){\n const b=new Date(anchor+'T00:00:00'); const y=b.getFullYear(),m=b.getMonth(); const first=new Date(y,m,1); const off=(first.getDay()+6)%7; const dim=new Date(y,m+1,0).getDate();\n const by={}; items.forEach(e=>{const k=(e.occurrence_start||'').slice(0,10); (by[k]=by[k]||[]).push(e);});\n const dow = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];\n const headers = dow.map(d=>`<div class=\"month-dow\">${d}</div>`).join('');\n let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"month-cell blank\"></div>';\n for(let d=1; d<=dim; d++){\n const dt=new Date(y,m,d), k=ymdLocal(dt);\n const evs=(by[k]||[]).sort((a,b)=>a.occurrence_start.localeCompare(b.occurrence_start));\n cells+=`<div class=\"month-cell\"><div class=\"day-num\">${d}</div>${evs.map(e=>{ const t=e.all_day_event?'All-day':(e.occurrence_start||'').slice(11,16); return eventChip({...e, title:`${t} ${e.title}`}); }).join('')}</div>`;\n }\n eventsEl.innerHTML=`<div class=\"month-dow-grid\">${headers}</div><div class=\"month-grid\">${cells}</div>${collectLegend(items)}`;\n}\nfunction renderYear(items,anchor){\n const y=new Date(anchor+'T00:00:00').getFullYear(); const set=new Set(items.map(e=>(e.occurrence_start||'').slice(0,10))); const n=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];\n const blocks=Array.from({length:12},(_,m)=>{const f=new Date(y,m,1),off=(f.getDay()+6)%7,dim=new Date(y,m+1,0).getDate(); let cells=''; for(let i=0;i<off;i++) cells+='<div class=\"year-day\"></div>';\n for(let d=1; d<=dim; d++){ const k=ymdLocal(new Date(y,m,d)); cells+=`<div class=\"${set.has(k)?'year-day has-event':'year-day'}\" data-year-date=\"${k}\">${d}</div>`; }\n return `<div class=\"year-month\"><h4>${n[m]}</h4><div class=\"year-days\">${cells}</div></div>`; }).join('');\n eventsEl.innerHTML=`<div class=\"year-grid\">${blocks}</div>`;\n}\nfunction startOfViewPeriod(d, view){\n const x = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n if (view === 'week'){ const diff = (x.getDay()+6)%7; x.setDate(x.getDate()-diff); return x; }\n if (view === 'month'){ return new Date(x.getFullYear(), x.getMonth(), 1); }\n if (view === 'year'){ return new Date(x.getFullYear(), 0, 1); }\n return x;\n}\nasync function loadEvents(){ statusEl.textContent='Loading...'; const qs=new URLSearchParams({view:viewEl.value,date:anchorEl.value}); const resp=await fetch(rootPath('/wp-json/calendar/v1/public/events?'+qs.toString())); const payload=await resp.json();\n if(!resp.ok){ statusEl.textContent=payload?.error?.message||'Error'; statusEl.className='err'; return; } let items=payload.data||[];\n futureOnlyWrapEl.style.display = viewEl.value === 'list' ? '' : 'none';\n if(viewEl.value==='list' && futureOnlyEl.checked){ const td=ymdLocal(new Date()); items=items.filter(i=>(i.occurrence_start||'').slice(0,10)>=td); }\n statusEl.textContent=`Loaded ${items.length} item(s)`; statusEl.className='ok';\n if(viewEl.value==='week') renderWeek(items,anchorEl.value); else if(viewEl.value==='month') renderMonth(items,anchorEl.value); else if(viewEl.value==='year') renderYear(items,anchorEl.value); else renderList(items);\n eventsEl.querySelectorAll('[data-edit]').forEach(el=>el.addEventListener('click',async()=>{\n const id=el.getAttribute('data-edit');\n if (session.canWrite) {\n const r=await fetch(apiUrl('/wp-json/calendar/v1/events/'+id),{headers:authHeaders()}); const p=await r.json(); if(p?.data) openModal('edit',p.data);\n return;\n }\n const hit = items.find(i => String(i.event_id) === String(id));\n if (hit) openDetail(hit);\n }));\n eventsEl.querySelectorAll('[data-year-date]').forEach(el=>el.addEventListener('click',()=>{ viewEl.value='week'; anchorEl.value=el.getAttribute('data-year-date'); loadEvents(); }));\n}\nasync function apiWrite(path,method,bodyObj){ const resp=await fetch(apiUrl(path),{method,headers:{'Content-Type':'application/json',...authHeaders()},body:bodyObj?JSON.stringify(bodyObj):undefined}); statusEl.textContent=`${method} ${path} -> ${resp.status}`; statusEl.className=resp.ok?'ok':'err'; return resp; }\nnewEventBtnEl.addEventListener('click',()=>openModal('create',{}));\ndocument.getElementById('closeModalBtn').addEventListener('click',closeModal);\ndocument.getElementById('saveCreateBtn').addEventListener('click',async()=>{await apiWrite('/wp-json/calendar/v1/events','POST',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveUpdateBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'PATCH',eventPayload()); closeModal(); loadEvents();});\ndocument.getElementById('saveDeleteBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; if(!id) return; await apiWrite('/wp-json/calendar/v1/events/'+id,'DELETE'); closeModal(); loadEvents();});\ndocument.getElementById('toggleSingleOccurrenceBtn').addEventListener('click',async()=>{ const p=document.getElementById('singleOccurrencePanel'); p.style.display = p.style.display==='none'?'':'none'; if(p.style.display!=='none') await loadOccurrenceChooser(); });\ndocument.getElementById('occPrevBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()-1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('occNextBtn').addEventListener('click',async()=>{ occCursor = new Date(occCursor.getFullYear(), occCursor.getMonth()+1, 1); await loadOccurrenceChooser(); });\ndocument.getElementById('deleteOccurrenceBtn').addEventListener('click',async()=>{const id=document.getElementById('eventId').value; const key=encodeURIComponent(document.getElementById('occKey').value); if(!id||!key) return; await apiWrite('/wp-json/calendar/v1/events/'+id+'/occurrences/'+key,'DELETE'); await loadOccurrenceChooser(); loadEvents();});\ndocument.getElementById('repeatType').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('rangeMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('monthlyNthMode').addEventListener('change',applyRecurrenceVisibility);\ndocument.getElementById('repeatInterval').addEventListener('input',everyText);\ndocument.getElementById('allDay').addEventListener('change', ()=>{{ applyAllDayVisibility(); updateEventButtons(); }});\n['title','startDate','endDate','startTime','endTime','repeatType','occKey'].forEach(id=>document.getElementById(id).addEventListener('input',updateEventButtons));\nfunction shiftAnchor(dir){\n const d = parseYmd(anchorEl.value);\n const v = viewEl.value;\n const s = startOfViewPeriod(d, v);\n if (v === 'day' || v === 'list') s.setDate(s.getDate() + dir);\n else if (v === 'week') s.setDate(s.getDate() + (7*dir));\n else if (v === 'month') s.setMonth(s.getMonth() + dir);\n else if (v === 'year') s.setFullYear(s.getFullYear() + dir);\n anchorEl.value = ymdLocal(startOfViewPeriod(s, v));\n}\ndocument.getElementById('prevBtn').addEventListener('click',()=>{ shiftAnchor(-1); loadEvents(); });\ndocument.getElementById('nextBtn').addEventListener('click',()=>{ shiftAnchor(1); loadEvents(); });\ndocument.getElementById('todayBtn').addEventListener('click',()=>{ const t = startOfViewPeriod(new Date(), viewEl.value); anchorEl.value = ymdLocal(t); loadEvents(); });\nloginBtnEl.addEventListener('click', ()=> loginModalEl.classList.add('open'));\ndocument.getElementById('closeLoginBtn').addEventListener('click', ()=>{ loginModalEl.classList.remove('open'); showLoginFeedback('', true); });\ndocument.getElementById('closeDetailBtn').addEventListener('click', closeDetail);\nlogoutBtnEl.addEventListener('click', ()=>{ session = { email:'', password:'', user:null, canWrite:false }; refreshAuthUi(); closeModal(); loadEvents(); });\ndocument.getElementById('doLoginBtn').addEventListener('click', async ()=>{\n const email = (document.getElementById('loginEmail').value || '').trim().toLowerCase();\n const password = document.getElementById('loginPassword').value || '';\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/me'), { headers: { Authorization: 'Basic ' + btoa(email + ':' + password) } });\n const payload = await resp.json();\n if (!resp.ok || !payload?.data){\n const msg = 'Login failure';\n statusEl.textContent = msg; statusEl.className='err';\n showLoginFeedback(msg, false);\n return;\n }\n session.email = email;\n session.password = password;\n session.user = payload.data;\n session.canWrite = payload.data.account_status === 'active';\n refreshAuthUi();\n showLoginFeedback('Login succeeded.', true);\n loginModalEl.classList.remove('open');\n loadEvents();\n});\ndocument.getElementById('regBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('regEmail').value || '').trim().toLowerCase(), password: document.getElementById('regPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/register'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Registered. Check your email for a verification link or token.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('verifyBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('verifyToken').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/verify'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = resp.ok\n ? 'An admin will review your request and notify you if approved.'\n : (payload?.error?.message || 'Verify failed');\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('forgotBtn').addEventListener('click', async ()=>{\n const body = { email: (document.getElementById('forgotEmail').value || '').trim().toLowerCase() };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/forgot-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'If the account exists, a reset token has been sent by email.';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\ndocument.getElementById('resetBtn').addEventListener('click', async ()=>{\n const body = { token: document.getElementById('resetToken').value || '', new_password: document.getElementById('resetPw').value || '' };\n const resp = await fetch(apiUrl('/wp-json/calendar/v1/users/reset-password'), { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify(body) });\n const payload = await resp.json();\n const msg = payload?.error?.message || 'Password reset complete';\n statusEl.textContent = msg; statusEl.className = resp.ok ? 'ok' : 'err';\n showLoginFeedback(msg, resp.ok);\n});\nviewEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nanchorEl.addEventListener('change',()=>{ const d = parseYmd(anchorEl.value); const s = startOfViewPeriod(d, viewEl.value); anchorEl.value = ymdLocal(s); loadEvents(); });\nfutureOnlyEl.addEventListener('change',loadEvents);\n['loginEmail','loginPassword','regEmail','regPw','verifyToken','forgotEmail','resetToken','resetPw'].forEach(id=>{ const el=document.getElementById(id); el.addEventListener('input', updateAuthButtonStates); });\nupdateAuthButtonStates();\nshowLoginFeedback('', true);\nrefreshAuthUi();\napplyAllDayVisibility();\nupdateEventButtons();\nloadEvents();\n</script>\n\n</body>\n</html>", "body_truncated": false}}
{"ts": "2026-03-30T14:15:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14085", "If-Match": "\"4b22d7e9f955d2a5\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19190330T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19200328T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19201025T030000\r\nRDATE:19201025T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19210403T020000\r\nRDATE:19210403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19211003T030000\r\nRDATE:19211003T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19220326T020000\r\nRDATE:19220326T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19221008T030000\r\nRDATE:19221008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19230422T020000\r\nRDATE:19230422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19240413T020000\r\nRDATE:19240413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19230916T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=3SU;UNTIL=19240921T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19250419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19260418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19270410T020000\r\nRDATE:19270410T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19280422T020000\r\nRDATE:19280422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19290421T020000\r\nRDATE:19290421T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19300413T020000\r\nRDATE:19300413T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19310419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19320417T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19251004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19321002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19330409T020000\r\nRDATE:19330409T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19331008T030000\r\nRDATE:19331008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19340422T020000\r\nRDATE:19340422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19350414T020000\r\nRDATE:19350414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19360419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19370418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19380410T020000\r\nRDATE:19380410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19341007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19381002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19390416T020000\r\nRDATE:19390416T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19400225T020000\r\nRDATE:19400225T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410504T020000\r\nRDATE:19410504T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410810T030000\r\nRDATE:19410810T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420405T020000\r\nRDATE:19420405T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420809T030000\r\nRDATE:19420809T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430404T020000\r\nRDATE:19430404T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430815T030000\r\nRDATE:19430815T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440402T020000\r\nRDATE:19440402T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440917T030000\r\nRDATE:19440917T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450402T020000\r\nRDATE:19450402T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19391119T030000\r\nRDATE:19391119T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450715T030000\r\nRDATE:19450715T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19460414T020000\r\nRDATE:19460414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470316T020000\r\nRDATE:19470316T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470413T020000\r\nRDATE:19470413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19451007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19461006T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470810T030000\r\nRDATE:19470810T030000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19471102T030000\r\nRDATE:19471102T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19480314T020000\r\nRDATE:19480314T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19490403T020000\r\nRDATE:19490403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19481031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19491030T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19501022T030000\r\nRDATE:19501022T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19511021T030000\r\nRDATE:19511021T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19521026T030000\r\nRDATE:19521026T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19500416T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19530419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19540411T020000\r\nRDATE:19540411T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19550417T020000\r\nRDATE:19550417T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19560422T020000\r\nRDATE:19560422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19570414T020000\r\nRDATE:19570414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19580420T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19590419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19600410T020000\r\nRDATE:19600410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19531004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19601002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19610326T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19630331T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19640322T020000\r\nRDATE:19640322T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19611029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19641025T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19651024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19661023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19650321T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19670319T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19671029T030000\r\nRDATE:19671029T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19681027T000000\r\nRDATE:19681027T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19680218T020000\r\nRDATE:19680218T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19711031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19751026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19761024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19771023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19720319T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19800316T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19781029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19801026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19811025T020000\r\nRDATE:19811025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19821024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19831023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19841028T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19871025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19881023T020000\r\nRDATE:19881023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19891029T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19921025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19931024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19951022T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19810329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19960331T010000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19961027T020000\r\nRDATE:19961027T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:(DST)\r\nDTSTART:19970330T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:(STD)\r\nDTSTART:19971026T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nLAST-MODIFIED:20260330T141507Z\r\nDTSTAMP:20260330T141507Z\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nSUMMARY:test 8\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260312T160000\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nDESCRIPTION:Default Mozilla Description\r\nSEQUENCE:1\r\nX-MOZ-GENERATION:1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:07 GMT", "ETag": "\"898b4e9c84b4dade\""}, "body": "HTTP/1.0 201 Created\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:07 GMT\r\nETag: \"898b4e9c84b4dade\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:15:07+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href></C:calendar-multiget>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:07 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "15724"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:07 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 15724\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9e61840edd26b59c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"6f79e4a470012e8c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7dd021ab4c51e62e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"382b171c7e467f49\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"6a0b1853010a3060\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"0344b53653b1897e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"f3727cb12d14614a\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"2200904959f9c5cd\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"028aa2cacadd930b\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1062edf9fc69e84f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e5984c98962fda96\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a4f11de675293164\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"db9706d0865b79d9\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9b7f63d5c08cc7c8\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e6f09ba57238f931\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:4e9ee4c86911a55106b9@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"904acb970acebc29\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:771bbfbfb45098265113@calendar-wp-plugin\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke Daily Exception TZ\r\nDESCRIPTION:tz-key\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1c3e46425e90df29\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-exdate-import-001\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:Smoke EXDATE Import\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"898b4e9c84b4dade\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nDTSTAMP:20260330T141507Z\r\nSUMMARY:test 8\r\nDESCRIPTION:Default Mozilla Description\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260312T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:15:13+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:13 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6140"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:13 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 6140\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"9e61840edd26b59c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"6f79e4a470012e8c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7dd021ab4c51e62e\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"382b171c7e467f49\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"6a0b1853010a3060\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"0344b53653b1897e\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"f3727cb12d14614a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"2200904959f9c5cd\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"028aa2cacadd930b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"1062edf9fc69e84f\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"e5984c98962fda96\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a4f11de675293164\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"db9706d0865b79d9\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"9b7f63d5c08cc7c8\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"e6f09ba57238f931\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"904acb970acebc29\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"1c3e46425e90df29\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"898b4e9c84b4dade\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:15:13+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "280", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/16.ics</D:href><D:href>/caldav/calendars/public/15.ics</D:href></C:calendar-multiget>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:13 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "15724"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:13 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 15724\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9e61840edd26b59c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"6f79e4a470012e8c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7dd021ab4c51e62e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"382b171c7e467f49\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"6a0b1853010a3060\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"0344b53653b1897e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"f3727cb12d14614a\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"2200904959f9c5cd\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"028aa2cacadd930b\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1062edf9fc69e84f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e5984c98962fda96\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a4f11de675293164\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"db9706d0865b79d9\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9b7f63d5c08cc7c8\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e6f09ba57238f931\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:4e9ee4c86911a55106b9@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"904acb970acebc29\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:771bbfbfb45098265113@calendar-wp-plugin\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke Daily Exception TZ\r\nDESCRIPTION:tz-key\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1c3e46425e90df29\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-exdate-import-001\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:Smoke EXDATE Import\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"898b4e9c84b4dade\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nDTSTAMP:20260330T141513Z\r\nSUMMARY:test 8\r\nDESCRIPTION:Default Mozilla Description\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260312T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:15:29+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14128", "If-Match": "\"898b4e9c84b4dade\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19190330T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19200328T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19201025T030000\r\nRDATE:19201025T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19210403T020000\r\nRDATE:19210403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19211003T030000\r\nRDATE:19211003T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19220326T020000\r\nRDATE:19220326T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19221008T030000\r\nRDATE:19221008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19230422T020000\r\nRDATE:19230422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19240413T020000\r\nRDATE:19240413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19230916T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=3SU;UNTIL=19240921T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19250419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19260418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19270410T020000\r\nRDATE:19270410T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19280422T020000\r\nRDATE:19280422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19290421T020000\r\nRDATE:19290421T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19300413T020000\r\nRDATE:19300413T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19310419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19320417T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19251004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19321002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19330409T020000\r\nRDATE:19330409T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19331008T030000\r\nRDATE:19331008T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19340422T020000\r\nRDATE:19340422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19350414T020000\r\nRDATE:19350414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19360419T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19370418T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19380410T020000\r\nRDATE:19380410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19341007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19381002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19390416T020000\r\nRDATE:19390416T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19400225T020000\r\nRDATE:19400225T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410504T020000\r\nRDATE:19410504T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19410810T030000\r\nRDATE:19410810T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420405T020000\r\nRDATE:19420405T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19420809T030000\r\nRDATE:19420809T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430404T020000\r\nRDATE:19430404T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19430815T030000\r\nRDATE:19430815T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440402T020000\r\nRDATE:19440402T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19440917T030000\r\nRDATE:19440917T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450402T020000\r\nRDATE:19450402T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19391119T030000\r\nRDATE:19391119T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19450715T030000\r\nRDATE:19450715T030000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19460414T020000\r\nRDATE:19460414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470316T020000\r\nRDATE:19470316T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+020000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470413T020000\r\nRDATE:19470413T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19451007T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19461006T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+020000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19470810T030000\r\nRDATE:19470810T030000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19471102T030000\r\nRDATE:19471102T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19480314T020000\r\nRDATE:19480314T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19490403T020000\r\nRDATE:19490403T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19481031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19491030T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19501022T030000\r\nRDATE:19501022T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19511021T030000\r\nRDATE:19511021T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19521026T030000\r\nRDATE:19521026T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19500416T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19530419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19540411T020000\r\nRDATE:19540411T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19550417T020000\r\nRDATE:19550417T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19560422T020000\r\nRDATE:19560422T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19570414T020000\r\nRDATE:19570414T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19580420T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=3SU;UNTIL=19590419T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19600410T020000\r\nRDATE:19600410T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19531004T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU;UNTIL=19601002T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19610326T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19630331T020000\r\nEND:DAYLIGHT\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19640322T020000\r\nRDATE:19640322T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19611029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19641025T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19651024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19661023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19650321T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19670319T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19671029T030000\r\nRDATE:19671029T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19681027T000000\r\nRDATE:19681027T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19680218T020000\r\nRDATE:19680218T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19711031T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19751026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19761024T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19771023T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19720319T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=3SU;UNTIL=19800316T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19781029T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19801026T030000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19811025T020000\r\nRDATE:19811025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19821024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19831023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19841028T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19871025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19881023T020000\r\nRDATE:19881023T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19891029T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=19921025T020000\r\nEND:STANDARD\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19931024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=4SU;UNTIL=19951022T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19810329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU;UNTIL=19960331T010000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19961027T020000\r\nRDATE:19961027T020000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:(DST)\r\nDTSTART:19970330T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:(STD)\r\nDTSTART:19971026T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nLAST-MODIFIED:20260330T141529Z\r\nDTSTAMP:20260330T141529Z\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nSUMMARY:test 8\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260312T160000\r\nEXDATE;TZID=Europe/London:20260313T160000\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nDESCRIPTION:Default Mozilla Description\r\nSEQUENCE:1\r\nX-MOZ-GENERATION:1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:29 GMT", "ETag": "\"548f92e38ae08226\""}, "body": "HTTP/1.0 200 OK\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:29 GMT\r\nETag: \"548f92e38ae08226\"\r\n\r\n", "body_truncated": false}}
{"ts": "2026-03-30T14:15:29+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href></C:calendar-multiget>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:29 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "15740"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:29 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 15740\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9e61840edd26b59c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"6f79e4a470012e8c\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7dd021ab4c51e62e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"382b171c7e467f49\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"6a0b1853010a3060\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-005@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Finance Close\r\nDESCRIPTION:Month-end close process.\r\nLOCATION:Finance Office\r\nCATEGORIES:Finance\r\nDTSTART;TZID=Europe/London:20260430T170000\r\nDTEND;TZID=Europe/London:20260430T180000\r\nRRULE:FREQ=MONTHLY;UNTIL=20260831T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"0344b53653b1897e\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-006@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Annual Conference\r\nDESCRIPTION:Annual community conference.\r\nLOCATION:Main Hall\r\nCATEGORIES:Events\r\nDTSTART;TZID=Europe/London:20260615T100000\r\nDTEND;TZID=Europe/London:20260615T170000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"f3727cb12d14614a\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"2200904959f9c5cd\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-008@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:DST Validation Event\r\nDESCRIPTION:Validates DST transition rendering.\r\nLOCATION:Lab\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20261025T003000\r\nDTEND;TZID=Europe/London:20261025T023000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"028aa2cacadd930b\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-009@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Leap Day Marker\r\nDESCRIPTION:Leap day recurrence behavior.\r\nLOCATION:Calendar\r\nCATEGORIES:QA\r\nDTSTART;TZID=Europe/London:20280229T090000\r\nDTEND;TZID=Europe/London:20280229T100000\r\nRRULE:FREQ=YEARLY;COUNT=3\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1062edf9fc69e84f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e5984c98962fda96\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a4f11de675293164\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"db9706d0865b79d9\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"9b7f63d5c08cc7c8\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e6f09ba57238f931\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:4e9ee4c86911a55106b9@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"904acb970acebc29\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:771bbfbfb45098265113@calendar-wp-plugin\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke Daily Exception TZ\r\nDESCRIPTION:tz-key\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1c3e46425e90df29\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-exdate-import-001\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:Smoke EXDATE Import\r\nDTSTART;TZID=Europe/London:20260302T100000\r\nDTEND;TZID=Europe/London:20260302T110000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"548f92e38ae08226\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:ed617bc7-66c1-474d-a467-86565e680820\r\nDTSTAMP:20260330T141529Z\r\nSUMMARY:test 8\r\nDESCRIPTION:Default Mozilla Description\r\nDTSTART;TZID=Europe/London:20260302T160000\r\nDTEND;TZID=Europe/London:20260302T170000\r\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\r\nEXDATE;TZID=Europe/London:20260312T160000,20260313T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:15:35+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:15:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6140"}, "body": "HTTP/1.0 207 Multi-Status\r\nServer: CalendarFixture/0.1 Python/3.13.5\r\nDate: Mon, 30 Mar 2026 14:15:35 GMT\r\nContent-Type: application/xml; charset=utf-8\r\nContent-Length: 6140\r\n\r\n<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"9e61840edd26b59c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"6f79e4a470012e8c\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7dd021ab4c51e62e\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"382b171c7e467f49\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/5.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"6a0b1853010a3060\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/6.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"0344b53653b1897e\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"f3727cb12d14614a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/8.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"2200904959f9c5cd\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/9.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"028aa2cacadd930b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"1062edf9fc69e84f\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"e5984c98962fda96\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a4f11de675293164\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"db9706d0865b79d9\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"9b7f63d5c08cc7c8\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/15.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"e6f09ba57238f931\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"904acb970acebc29\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"1c3e46425e90df29\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/ed617bc7-66c1-474d-a467-86565e680820.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"548f92e38ae08226\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_truncated": false}}
{"ts": "2026-03-30T14:20:15+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:15 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"34af04b9ccbadb9d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:16:53+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a33ed", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:20:15+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:15 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"138a8bec591c96d2\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142015Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T142015Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T142015Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T142015Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T14:20:15+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:15 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"34af04b9ccbadb9d\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142015Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T14:20:15+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:15 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:15+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:15 GMT", "ETag": "\"e13f867894f5d240\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e13f867894f5d240\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T142016Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "ETag": "\"3a6ba02a67b14874\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3a6ba02a67b14874\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T142016Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "ETag": "\"1710ae19fe56d567\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1710ae19fe56d567\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T142016Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "ETag": "\"98bbc37be6ca6788\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"98bbc37be6ca6788\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T142016Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 15, \"uid\": \"809b5d43371ed23850b0@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1f3f52be73f1461b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:20:16+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"190e382546a84122\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:809b5d43371ed23850b0@calendar-wp-plugin\r\nDTSTAMP:20260330T142016Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"bc3799c352e91742\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:20:16+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"8483fc55d1de7d7606fc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "ETag": "\"d037ce8fd6055b51\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"34af04b9ccbadb9d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:16:53+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a33ed", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:20:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:16 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:20:26+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/admin/diagnostics?limit=2&as=admin", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:20:26 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "2521"}, "body": "{\"data\": [{\"ts\": \"2026-03-30T14:20:16+00:00\", \"client\": \"127.0.0.1\", \"method\": \"GET\", \"path\": \"/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1\", \"request\": {\"headers\": {\"Host\": \"127.0.0.1:8080\", \"User-Agent\": \"curl/8.14.1\", \"Accept\": \"*/*\", \"X-WP-User\": \"admin\"}, \"body\": \"\", \"body_bytes\": 0, \"body_truncated\": false}, \"response\": {\"status\": 200, \"headers\": {\"Server\": \"CalendarFixture/0.1 Python/3.13.5\", \"Date\": \"Mon, 30 Mar 2026 14:20:16 GMT\", \"Content-Type\": \"application/json; charset=utf-8\", \"Content-Length\": \"4474\"}, \"body\": \"{\\\"data\\\": [{\\\"event_id\\\": 17, \\\"uid\\\": \\\"smoke-exdate-import-001\\\", \\\"title\\\": \\\"Smoke EXDATE Import\\\", \\\"description\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"category\\\": \\\"\\\", \\\"all_day_event\\\": false, \\\"occurrence_start\\\": \\\"2026-03-02T10:00:00+01:00\\\", \\\"occurrence_end\\\": \\\"2026-03-02T11:00:00+01:00\\\", \\\"repeat_type\\\": \\\"daily\\\"}, {\\\"event_id\\\": 17, \\\"uid\\\": \\\"smoke-exdate-import-001\\\", \\\"title\\\": \\\"Smoke EXDATE Import\\\", \\\"description\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"category\\\": \\\"\\\", \\\"all_day_event\\\": false, \\\"occurrence_start\\\": \\\"2026-03-03T10:00:00+01:00\\\", \\\"occurrence_end\\\": \\\"2026-03-03T11:00:00+01:00\\\", \\\"repeat_type\\\": \\\"daily\\\"}, {\\\"e ...(truncated)", "body_bytes": 2521, "body_truncated": false}}
{"ts": "2026-03-30T14:22:19+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:22:19 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5799"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:22:20+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "1071", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href><D:href>/caldav/calendars/public/16.ics</D:href><D:href>/caldav/calendars/public/15.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href><D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/calendars/public/1.ics</D:href></C:calendar-multiget>", "body_bytes": 1071, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:22:20 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "14800"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142220Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:22:44+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "If-Match": "\"d037ce8fd6055b51\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:22:44 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:22:49+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "If-Match": "\"d2a6091e74fce26b\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:22:49 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:23:21+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14110", "If-None-Match": "*", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:21 GMT", "ETag": "\"5e4c0898488797e4\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:23:21+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics</D:href></C:calendar-multiget>", "body_bytes": 266, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:21 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13893"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142321Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:23:23+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:23 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:23:31+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14085", "If-Match": "\"5e4c0898488797e4\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:31 GMT", "ETag": "\"6638686e8b73b19c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:23:31+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics</D:href></C:calendar-multiget>", "body_bytes": 266, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:31 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13936"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142331Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:23:33+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:33 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:23:44+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14128", "If-Match": "\"6638686e8b73b19c\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:44 GMT", "ETag": "\"fc290607cac191f8\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:23:44+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics</D:href></C:calendar-multiget>", "body_bytes": 266, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:44 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13952"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142344Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:23:46+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:46 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:23:50+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/caldav/calendars/public/267d03e6-66cc-458b-aaf2-400f5b0e2108.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "If-Match": "\"fc290607cac191f8\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:23:50 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:24:33+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14116", "If-None-Match": "*", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:24:33 GMT", "ETag": "\"32987e446d88f0f9\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:24:33+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics</D:href></C:calendar-multiget>", "body_bytes": 266, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:24:33 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13902"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142433Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:24:36+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:24:36 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:24:53+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14094", "If-Match": "\"32987e446d88f0f9\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:24:53 GMT", "ETag": "\"05a6e14b3e8da6a4\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:24:53+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics</D:href></C:calendar-multiget>", "body_bytes": 266, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:24:53 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13945"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142453Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:25:01+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:25:01 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:25:26+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14137", "If-Match": "\"05a6e14b3e8da6a4\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:25:26 GMT", "ETag": "\"92da99cdae305c8c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:25:26+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "266", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics</D:href></C:calendar-multiget>", "body_bytes": 266, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:25:26 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13961"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142526Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:25:35+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:25:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:25:46+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/caldav/calendars/public/ce2caf8e-6197-40a3-9c7b-e6eae7041903.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "If-Match": "\"92da99cdae305c8c\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:25:46 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:26:01+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/7.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14137", "If-Match": "\"279b10d3b419d6e8\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:01 GMT", "ETag": "\"37b3e390499adf51\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:26:01+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/7.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:01 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13055"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142601Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:26:11+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:11 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5168"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:26:23+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:23 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5168"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:26:38+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/4.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14108", "If-Match": "\"f4b1379e60ebbe47\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:38 GMT", "ETag": "\"13292670bde364d3\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:26:38+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/4.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:38 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "13098"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T142638Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:26:58+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:26:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5168"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:27:17+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:27:17 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5168"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:27:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:27:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "7885"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:27:41+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:27:41 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4227"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"al", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:27:57+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:27:57 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "5168"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"34af04b9ccbadb9d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a33ed4025fd8b61d\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:34:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:34:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9739"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"34af04b9ccbadb9d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:16:53+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a33ed", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:34:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:34:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3db8720849bf27c9\"", "Content-Length": "4502"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143454Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T143454Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T143454Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T143454Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T14:34:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:34:54 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"34af04b9ccbadb9d\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143454Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T14:34:54+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 409, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:34:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "84"}, "body": "{\"error\": {\"code\": \"conflict_error\", \"message\": \"occurrence already has exception\"}}", "body_bytes": 84, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4b16804fb6cdace4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:34:59+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"2bc41", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b06c8be2295443df\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4b16804fb6cdace4\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "ETag": "\"f7e38a114c5f0aa1\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f7e38a114c5f0aa1\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "ETag": "\"afd42f662e664a70\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"afd42f662e664a70\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "ETag": "\"ff1619de2d36d47d\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ff1619de2d36d47d\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "ETag": "\"3c34ae5dcf09bc94\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3c34ae5dcf09bc94\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 15, \"uid\": \"671dfedc5209e0cbc285@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"318e71f9de064c57\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:35:07+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5a4321ef70dcf8c4\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:671dfedc5209e0cbc285@calendar-wp-plugin\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"da0528511b5553ab\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:35:07+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "ETag": "\"17595aec3f430fad\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4b16804fb6cdace4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:34:59+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"2bc41", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "ETag": "\"9ad47bc1cfbe571b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:35:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:07 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9ad47bc1cfbe571b\"", "Content-Length": "316"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T143507Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 316, "body_truncated": false}}
{"ts": "2026-03-30T14:35:44+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=week&date=2026-04-27", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:44 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "1345"}, "body": "{\"data\": [{\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-29T12:30:00+01:00\", \"occurrence_end\": \"2026-04-29T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-29T12:30:00+01:00\", \"occurrence_end\": \"2026-04-29T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-30T17:00:00+01:00\", \"occurrence_end\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_sta ...(truncated)", "body_bytes": 1345, "body_truncated": false}}
{"ts": "2026-03-30T14:35:54+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-27", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:54 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:35:57+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-28", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:57 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:35:57+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-29", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:57 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "667"}, "body": "{\"data\": [{\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-29T12:30:00+01:00\", \"occurrence_end\": \"2026-04-29T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-29T12:30:00+01:00\", \"occurrence_end\": \"2026-04-29T13:30:00+01:00\", \"repeat_type\": \"weekly\"}], \"meta\": {\"count\": 2, \"view\": \"day\"}}", "body_bytes": 667, "body_truncated": false}}
{"ts": "2026-03-30T14:35:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "376"}, "body": "{\"data\": [{\"event_id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-30T17:00:00+01:00\", \"occurrence_end\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 376, "body_truncated": false}}
{"ts": "2026-03-30T14:35:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:35:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "395"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 395, "body_truncated": false}}
{"ts": "2026-03-30T14:36:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-05-02", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "395"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 395, "body_truncated": false}}
{"ts": "2026-03-30T14:36:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "376"}, "body": "{\"data\": [{\"event_id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-30T17:00:00+01:00\", \"occurrence_end\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 376, "body_truncated": false}}
{"ts": "2026-03-30T14:36:20+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:20 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:36:20+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:20 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9410"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"ui", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:36:20+00:00", "client": "127.0.0.1", "method": "GET", "path": "/favicon.ico", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "image/avif,image/jxl,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/calendar", "Sec-Fetch-Dest": "image", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=6", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:20 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:36:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=list&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "28439"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"ebaa6e153c2949c66437@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"ui", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:36:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:31+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-03-31", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:31 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:32+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:32 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "367"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 367, "body_truncated": false}}
{"ts": "2026-03-30T14:36:32+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-02", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:32 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:33+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:33 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "367"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 367, "body_truncated": false}}
{"ts": "2026-03-30T14:36:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-02", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:42 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-03", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:42 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "395"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 395, "body_truncated": false}}
{"ts": "2026-03-30T14:36:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-04", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:42 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:43+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-05", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:43 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "49"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"day\"}}", "body_bytes": 49, "body_truncated": false}}
{"ts": "2026-03-30T14:36:44+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=day&date=2026-04-06", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:36:44 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "354"}, "body": "{\"data\": [{\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}], \"meta\": {\"count\": 1, \"view\": \"day\"}}", "body_bytes": 354, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d67b5ff89b3e11f4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:37:14+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"dd76a", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"6e86a3a3cb79f222\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d67b5ff89b3e11f4\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "ETag": "\"cb820e20ce5f05f9\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cb820e20ce5f05f9\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "ETag": "\"fc237d6ea5bab15b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"fc237d6ea5bab15b\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "ETag": "\"a04576a14aacbb44\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a04576a14aacbb44\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "ETag": "\"d4593cbbeb887b80\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d4593cbbeb887b80\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 15, \"uid\": \"35ef9e3fa5fc95e6feeb@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"88afe21d04a4e934\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:37:16+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"2c338e3049044bb6\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:35ef9e3fa5fc95e6feeb@calendar-wp-plugin\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"870fa79824125dc3\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:37:16+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"05e54c633fc9404d7909@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "ETag": "\"032ada2f4689a236\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d67b5ff89b3e11f4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:37:14+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"dd76a", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "ETag": "\"41474f0130ac56c2\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"41474f0130ac56c2\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T143716Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11634"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d67b5ff89b3e11f4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:37:14+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"dd76a", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T14:37:16+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:37:16 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:38:27+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:27 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a1c06c7625070956\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"31413754bab11f12\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T14:38:29+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "655", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/calendars/public/1.ics</D:href></C:calendar-multiget>", "body_bytes": 655, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:29 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8815"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a1c06c7625070956\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143829Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"31413754bab11f12\"</D:getetag>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:38:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/4.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14108", "If-Match": "\"0959513a689d7faf\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:37 GMT", "ETag": "\"c3b404268b1e2a58\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:38:37+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/4.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:37 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8858"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a1c06c7625070956\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T143837Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"31413754bab11f12\"</D:getetag>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:38:43+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a1c06c7625070956\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"31413754bab11f12\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T14:38:50+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:50 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "7109"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:38:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:58 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43446"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:38:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "51"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"month\"}}", "body_bytes": 51, "body_truncated": false}}
{"ts": "2026-03-30T14:38:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/favicon.ico", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "image/avif,image/jxl,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/calendar", "Sec-Fetch-Dest": "image", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=6", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:38:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:39:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:39:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "7109"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:39:09+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:39:09 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "3708"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"al ...(truncated)", "body_bytes": 3708, "body_truncated": false}}
{"ts": "2026-03-30T14:39:24+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:39:24 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"a1c06c7625070956\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"31413754bab11f12\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T14:42:51+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:42:51 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8858"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a1c06c7625070956\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144251Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"31413754bab11f12\"</D:getetag>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:43:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:43:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7751edcdd53548b6\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:43:34+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"052f8", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:43:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:43:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c97f86eaea834f45\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144335Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T144335Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T144335Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T144335Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T14:43:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:43:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"7751edcdd53548b6\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144335Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T14:43:36+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:43:36 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8815"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7751edcdd53548b6\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144336Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"052f81957f9aae6d\"</D:getetag>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:44:20+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:20 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"5ec78c2d14c408f9\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T144420Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T14:44:29+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:29 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7dba3d192408fd8d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:44:28+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"8dd5f", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:44:29+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:29 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb9acb23074ed19b\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144429Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T144429Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T144429Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T144429Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T14:44:29+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:29 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"7dba3d192408fd8d\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144429Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"072b1b494ba4f968\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "ETag": "\"5adcf0bbdfde8074\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5adcf0bbdfde8074\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "ETag": "\"1d474bd1d0cd4bf5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1d474bd1d0cd4bf5\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "ETag": "\"4bb73834167ee601\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4bb73834167ee601\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "ETag": "\"98b19a1e7ae18985\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"98b19a1e7ae18985\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 15, \"uid\": \"a63f8ecbbdc94c49bc3f@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7edae8a0700321c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:44:30+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5cdf8a9141d5dbc9\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:a63f8ecbbdc94c49bc3f@calendar-wp-plugin\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"fe9f3570de454c2f\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:44:30+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "ETag": "\"2e770edf61e4a71a\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7dba3d192408fd8d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:44:28+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"8dd5f", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "ETag": "\"5c32f479683cad08\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5c32f479683cad08\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T144430Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11634"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7dba3d192408fd8d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T14:44:28+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"8dd5f", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T14:44:30+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:30 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:44:58+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6130"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"53fb93409a868c3b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"15e21dd53bfeddfc\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:44:58+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "1143", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/smoke-cancelled-occurrence.ics</D:href><D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href><D:href>/caldav/calendars/public/16.ics</D:href><D:href>/caldav/calendars/public/15.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href><D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/calendars/public/1.ics</D:href></C:calendar-multiget>", "body_bytes": 1143, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:44:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "15419"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"53fb93409a868c3b\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144458Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"15e21dd53bfeddfc\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T14:45:10+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/4.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14108", "If-Match": "\"34008884f1eb8394\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:45:10 GMT", "ETag": "\"2296d29d18e51e25\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:45:10+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/4.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:45:10 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1040"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"2296d29d18e51e25\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T144510Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 1040, "body_truncated": false}}
{"ts": "2026-03-30T14:45:12+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:45:12 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6130"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"53fb93409a868c3b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"15e21dd53bfeddfc\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:45:54+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:45:54 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6130"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"53fb93409a868c3b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"15e21dd53bfeddfc\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:46:14+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:14 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:46:14+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "10580"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"ui", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:46:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:18 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9409"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6046"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-06T1", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-06-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5317"}, "body": "{\"data\": [{\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-06-02T15:00:00+01:00\", \"occurrence_end\": \"2026-06-02T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"occurrence_start\": \"2026-06-03T12:30:00+01:00\", \"occurrence_end\": \"2026-06-03T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-06-03T12:30:00+01:00\", \"occurrence_end\": \"2026-06-03T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"occurrence_start\": \"2026-06-10T12:30:00+01:", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6046"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-06T1", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9409"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:34 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6046"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-06T1", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:37 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:46:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "10580"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"ui", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:46:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/favicon.ico", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "image/avif,image/jxl,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/calendar", "Sec-Fetch-Dest": "image", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=6", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:46:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:38 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9409"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:46:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:46:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6046"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-06T1", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:47:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=week&date=2026-04-27", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "1345"}, "body": "{\"data\": [{\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-29T12:30:00+01:00\", \"occurrence_end\": \"2026-04-29T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-29T12:30:00+01:00\", \"occurrence_end\": \"2026-04-29T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 5, \"uid\": \"fixture-ce-005@calendar-wp-plugin\", \"title\": \"Finance Close\", \"description\": \"Month-end close process.\", \"location\": \"Finance Office\", \"category\": \"Finance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-30T17:00:00+01:00\", \"occurrence_end\": \"2026-04-30T18:00:00+01:00\", \"repeat_type\": \"monthly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_sta ...(truncated)", "body_bytes": 1345, "body_truncated": false}}
{"ts": "2026-03-30T14:47:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9409"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:47:06+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:06 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6046"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-06T1", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:47:53+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/10.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14137", "If-Match": "\"f22edec26fd96749\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:53 GMT", "ETag": "\"e6fa695514466881\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:47:53+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "232", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/10.ics</D:href></C:calendar-multiget>", "body_bytes": 232, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:53 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1070"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e6fa695514466881\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T144753Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260508T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 1070, "body_truncated": false}}
{"ts": "2026-03-30T14:47:53+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:53 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6130"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"53fb93409a868c3b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"15e21dd53bfeddfc\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:47:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:58 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:47:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:47:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "10580"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"ui", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:48:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9409"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:48:01+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5698"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-06T1", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:48:22+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:22 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6130"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"55da5569707995bb\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"527d6e363f17bcfa\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:48:22+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "655", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/calendars/public/1.ics</D:href></C:calendar-multiget>", "body_bytes": 655, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:22 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8815"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"55da5569707995bb\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144822Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"527d6e363f17bcfa\"</D:getetag>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:48:32+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/7.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14137", "If-Match": "\"df74a2a1b310e407\"", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:32 GMT", "ETag": "\"b18f9e3c652a40d4\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T14:48:32+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/7.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:32 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1069"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/7.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"b18f9e3c652a40d4\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-007@calendar-wp-plugin\r\nDTSTAMP:20260330T144832Z\r\nSUMMARY:Fortnightly Coaching\r\nDESCRIPTION:Coaching check-in.\r\nLOCATION:Online\r\nCATEGORIES:Training\r\nDTSTART;TZID=Europe/London:20260407T150000\r\nDTEND;TZID=Europe/London:20260407T160000\r\nRRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=20260731T235959\r\nEXDATE;TZID=Europe/London:20260519T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 1069, "body_truncated": false}}
{"ts": "2026-03-30T14:48:32+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://localhost:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:32 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6130"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"55da5569707995bb\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"527d6e363f17bcfa\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T14:48:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:37 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T14:48:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "10580"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"916c9cd30540959ad63f@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"ui", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T14:48:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/favicon.ico", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "image/avif,image/jxl,image/webp,image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/calendar", "Sec-Fetch-Dest": "image", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=6", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:48:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9409"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:48:41+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:48:41 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6050"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T14:49:47+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:49:47 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"bca3fc6eaa239803\"", "Content-Length": "5115"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T144947Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T144947Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T144947Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T144947Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T14:50:56+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/calendar, application/ics, text/plain;q=0.9", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:50:56 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"584d529babd5cae6\"", "Content-Length": "5115"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T145056Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T145056Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T145056Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T145056Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T14:50:56+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/calendar.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "314", "Depth": "0", "Origin": "http://localhost:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><D:resourcetype/><D:owner/><D:displayname/><D:current-user-principal/><D:current-user-privilege-set/><A:calendar-color/><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 314, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:50:56 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:50:56+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/.well-known/caldav", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "314", "Depth": "0", "Origin": "http://localhost:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><D:resourcetype/><D:owner/><D:displayname/><D:current-user-principal/><D:current-user-privilege-set/><A:calendar-color/><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 314, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:50:56 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:50:56+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "314", "Depth": "0", "Origin": "http://localhost:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><D:resourcetype/><D:owner/><D:displayname/><D:current-user-principal/><D:current-user-privilege-set/><A:calendar-color/><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 314, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:50:56 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T14:50:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/calendar,text/plain;q=0.8,*/*;q=0.5", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "none", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 14:50:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c047ccb96f0fbd50\"", "Content-Length": "5115"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T145059Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T145059Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T145059Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T145059Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"49da7b660d2eb90b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:20:48+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"14f25", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"76e9509bbd366af2\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"49da7b660d2eb90b\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"fa44a32e2b54fe98\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "ETag": "\"4740b3cc34a2cc56\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4740b3cc34a2cc56\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "ETag": "\"2be1c63715d4fd1d\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"2be1c63715d4fd1d\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "ETag": "\"cfd13b1114a34fa6\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cfd13b1114a34fa6\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "ETag": "\"67d3e29da97d3248\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"67d3e29da97d3248\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 15, \"uid\": \"fd51d305728f2287d9eb@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"15832d093f3d58d8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:21:37+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0dd759e3487894b3\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fd51d305728f2287d9eb@calendar-wp-plugin\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0bf138cc955a676d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:21:37+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"bad9b0a4bf071e1cf316@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "ETag": "\"ccabcbefa3ae427d\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"49da7b660d2eb90b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:20:48+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"14f25", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "ETag": "\"ecce7dcc33a5384e\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ecce7dcc33a5384e\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T152137Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11634"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"49da7b660d2eb90b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:20:48+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"14f25", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:21:37+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:37 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:21:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:21:38 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T15:44:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:44:42 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11634"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"49da7b660d2eb90b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:20:48+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"14f25", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:44:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:44:42 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ec592f4817d711b6\"", "Content-Length": "5319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154442Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T154442Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T154442Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154442Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T15:44:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:44:42 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"49da7b660d2eb90b\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154442Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:44:42+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:44:42 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"fa44a32e2b54fe98\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154442Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:44:42+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 409, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:44:42 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "84"}, "body": "{\"error\": {\"code\": \"conflict_error\", \"message\": \"occurrence already has exception\"}}", "body_bytes": 84, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4cd72d479d507116\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"402be", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0a0ab4f2ca5feab6\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4cd72d479d507116\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"318ecd47574f78e8\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "ETag": "\"d846dc38796f779e\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d846dc38796f779e\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "ETag": "\"c80614f78133f2b1\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c80614f78133f2b1\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "ETag": "\"40fb6f8f93bddee4\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"40fb6f8f93bddee4\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "ETag": "\"e437395a7324b090\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e437395a7324b090\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 15, \"uid\": \"89ac5e3af1c07027b9b8@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"2ca833fe353a18f5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:58+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/15/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/15.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ce147ab01d399c28\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:89ac5e3af1c07027b9b8@calendar-wp-plugin\r\nDTSTAMP:20260330T154558Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"dda7eb88fc839463\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:58+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/16/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 16, \"uid\": \"4d11fce48beae092f87b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"81bd198374822883\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11006"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4cd72d479d507116\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"402be", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"c920974d8ef1116c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c920974d8ef1116c\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11634"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4cd72d479d507116\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"402be", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11634"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4cd72d479d507116\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"402be", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"18a0ba0a5476aa53\"", "Content-Length": "5319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4cd72d479d507116\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"318ecd47574f78e8\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"fe2e1195eb2a1dfe\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"fe2e1195eb2a1dfe\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"f9b9356a1517a241\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f9b9356a1517a241\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"f36d586abbe055b0\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f36d586abbe055b0\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"2bc1acbc670b28f9\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"2bc1acbc670b28f9\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 19, \"uid\": \"b397f1a2bd1d27bd909e@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"5cbce152b812cece\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:59+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/19/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/19.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0a27b46fe6ea00d7\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:b397f1a2bd1d27bd909e@calendar-wp-plugin\r\nDTSTAMP:20260330T154559Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"58df47550d8b8d1e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:59+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/20/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/20/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/20/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/20/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 20, \"uid\": \"42cf8591d4bbfc538331@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"aba0878b20403f58\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12946"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4cd72d479d507116\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"402be", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:45:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:45:59 GMT", "ETag": "\"27e69cf4e5e13efe\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:46:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:46:00 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"27e69cf4e5e13efe\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T154600Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:46:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:46:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12946"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"4cd72d479d507116\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:45:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"402be", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:46:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:46:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 18, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:46:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:46:00 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"5e82b8a608ec2f69\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:22+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9e96e", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9f62fea5ac3aa027\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154825Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T154825Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T154825Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154825Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5e82b8a608ec2f69\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154825Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"ed65e21db7fdf5b1\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154825Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"3256d792f303942ee5ec@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"05e6f17954013126\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:25+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T15:48:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"3256d792f303942ee5ec@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"3256d792f303942ee5ec@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"3256d792f303942ee5ec@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T15:48:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"732ad7c020d51395\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:37+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"996ea", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:48:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"84d45e72b4e73efa\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154839Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T154839Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T154839Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154839Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:48:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"732ad7c020d51395\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154839Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:48:39+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:39 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"a7862a0f1a83e217\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154839Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:48:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:39+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"54b5dbcbbac70e6b80a0@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d62c926281c67f37\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:39+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"54b5dbcbbac70e6b80a0@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"54b5dbcbbac70e6b80a0@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"54b5dbcbbac70e6b80a0@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"54b5dbcbbac70e6b80a0@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"54b5dbcbbac70e6b80a0@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "ETag": "\"03110b46b4736657\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"03110b46b4736657\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T154840Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "ETag": "\"b1d8098f2c401ca5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b1d8098f2c401ca5\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T154840Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "ETag": "\"e35466e93feda311\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e35466e93feda311\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T154840Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "ETag": "\"ca53342667463a28\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ca53342667463a28\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T154840Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"c497eb71f64543b5c7e6@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"ee105eed23956cc3\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:40+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1efae4799ce0bd1e\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:c497eb71f64543b5c7e6@calendar-wp-plugin\r\nDTSTAMP:20260330T154840Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"c92a15baad77b616\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:40+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"22636e248d3c1a08f8a3@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "ETag": "\"1075b85ca18a439c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"732ad7c020d51395\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:37+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"996ea", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "ETag": "\"a580ff422270d850\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a580ff422270d850\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T154840Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"732ad7c020d51395\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:37+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"996ea", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:48:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:40 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e6a46365a4181790\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:57+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d80b6", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e80ad55b0cf34f87\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e6a46365a4181790\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"3d214f4f81cae67d\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"b1d82373467e236cc487@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f1958b4788675043\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:59+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"b1d82373467e236cc487@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"b1d82373467e236cc487@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"b1d82373467e236cc487@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"b1d82373467e236cc487@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"b1d82373467e236cc487@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "ETag": "\"5f98042911cdc2aa\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5f98042911cdc2aa\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "ETag": "\"3eb343a6df4e1f4a\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3eb343a6df4e1f4a\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "ETag": "\"8eaecebe6704179d\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"8eaecebe6704179d\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "ETag": "\"1b74dcc0ab5f571c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1b74dcc0ab5f571c\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T154859Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:48:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:48:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"aaa8340a3d7ccd6a8df7@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d7f9a72c4aaad948\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:59+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"058abb73473f9ec4\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:aaa8340a3d7ccd6a8df7@calendar-wp-plugin\r\nDTSTAMP:20260330T154900Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"29e14a872aca1250\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:49:00+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6570fd6aeace58578ae1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "ETag": "\"031e00c7b2437a31\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e6a46365a4181790\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:57+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d80b6", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "ETag": "\"e715872930057161\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e715872930057161\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T154900Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e6a46365a4181790\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:48:57+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"d80b6", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:49:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:49:00 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7b4a62ce837068b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:54:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"3d75a", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"48ac2dd451d7868f\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a7b4a62ce837068b\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"ab57181d2c00fcd5\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"d9d622c02ebfdbf83dab@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"cbd5aab08f2de7f2\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:54:59+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"d9d622c02ebfdbf83dab@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"d9d622c02ebfdbf83dab@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"d9d622c02ebfdbf83dab@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"d9d622c02ebfdbf83dab@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"d9d622c02ebfdbf83dab@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "ETag": "\"a11c28068216c2d6\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a11c28068216c2d6\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "ETag": "\"d96489542d0c9095\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d96489542d0c9095\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "ETag": "\"6e95caf3538b8583\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"6e95caf3538b8583\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "ETag": "\"bf238a72a05154c6\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"bf238a72a05154c6\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"84911fe28ff2f9fbdb45@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"54261a0506aa9388\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:54:59+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"26ffe89dee62df60\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:84911fe28ff2f9fbdb45@calendar-wp-plugin\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"7bc1ad808fbfd5fd\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:54:59+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"8af4eae9f0c214d146d5@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "ETag": "\"fe95f3bc4c2e74e1\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7b4a62ce837068b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:54:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"3d75a", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "ETag": "\"0bbc85496d9bb64a\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:54:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:54:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0bbc85496d9bb64a\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T155459Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:55:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:55:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7b4a62ce837068b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:54:56+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"3d75a", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:55:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:55:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:55:00+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:55:00 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7bc6e565475a9a8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:56:42+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0388f", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"75c7a06e3f9dde8c\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a7bc6e565475a9a8\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"dba8ac559404c969\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"c5a0ca5d685c8908a802@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"01c1e859a0c1d3ee\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:56:45+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"c5a0ca5d685c8908a802@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"c5a0ca5d685c8908a802@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"c5a0ca5d685c8908a802@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"c5a0ca5d685c8908a802@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"c5a0ca5d685c8908a802@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "ETag": "\"e2be2b99c39985f7\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e2be2b99c39985f7\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "ETag": "\"a380dceb2ca70302\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"a380dceb2ca70302\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "ETag": "\"62cfa347f4a3e87c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"62cfa347f4a3e87c\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "ETag": "\"3e18aabb2c471d1b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3e18aabb2c471d1b\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"21ed32483f6fe0854775@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e195c8c718c74ea2\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:56:45+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5aeda0097db3158a\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:21ed32483f6fe0854775@calendar-wp-plugin\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"107f90ee4fdcd3da\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:56:45+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"ff4ad7f18ee79cf13356@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "ETag": "\"25be1f0412a1607c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7bc6e565475a9a8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:56:42+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0388f", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "ETag": "\"b4d712a7912ed997\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b4d712a7912ed997\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T155645Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a7bc6e565475a9a8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T15:56:42+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0388f", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T15:56:45+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 15:56:45 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"50884b9c7f52d7b4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:00:11+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9cc94", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1d9cf2007a92fe76\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"50884b9c7f52d7b4\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"d227b3c11080654f\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"76660280451647fdf0ba@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"8bbc978d26a619c8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:00:13+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"76660280451647fdf0ba@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"76660280451647fdf0ba@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"76660280451647fdf0ba@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"76660280451647fdf0ba@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"76660280451647fdf0ba@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "ETag": "\"5e3a16a0bd9129c8\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5e3a16a0bd9129c8\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "ETag": "\"cc6a3dc3e8885595\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cc6a3dc3e8885595\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "ETag": "\"39ef190e9e85067e\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"39ef190e9e85067e\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "ETag": "\"57c287b65a632230\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"57c287b65a632230\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"0609308738390cd66d4c@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"71eca1563d48f3ec\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:00:13+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"614335fbe22791d5\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:0609308738390cd66d4c@calendar-wp-plugin\r\nDTSTAMP:20260330T160013Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"406094a1e9d195af\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:00:13+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"6bf853766043d7c101b6@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "ETag": "\"0afcaa4cdff054dd\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"50884b9c7f52d7b4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:00:11+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9cc94", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T16:00:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:00:14+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:14 GMT", "ETag": "\"16f6332f4cb07a1b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:00:14+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:14 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"16f6332f4cb07a1b\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T160014Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T16:00:14+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"50884b9c7f52d7b4\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:00:11+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9cc94", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T16:00:14+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T16:00:14+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:00:14 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T16:01:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:01:58 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T16:01:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:01:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "51"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"month\"}}", "body_bytes": 51, "body_truncated": false}}
{"ts": "2026-03-30T16:02:01+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "7109"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:02:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-05-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4034"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-01T14:00:00+01:00\", \"occurrence_end\": \"2026-05-01T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"occurrence_start\": \"2026-05-04T00:00:00+00:00\", \"occurrence_end\": \"2026-05-05T00:00:00+00:00\", \"repeat_type\": \"none\"}, {\"event_id\": 7, \"uid\": \"fixture-ce-007@calendar-wp-plugin\", \"title\": \"Fortnightly Coaching\", \"description\": \"Coaching check-in.\", \"location\": \"Online\", \"category\": \"Training\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-05T15:00:00+01:00\", \"occurrence_end\": \"2026-05-05T16:00:00+01:00\", \"repeat_type\": \"custom\"}, {\"event_id\": 4, \"uid\": \"fixture-ce-004@calendar-wp-plugin\", \"title\": \"Community Lunch\", \"description\": \"Weekly community lunch.\", \"location\": \"Cafeteria\", \"category\": \"Community\", \"all_day_event\": false, \"", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:02:04+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:04 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "7109"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:02:15+00:00", "client": "127.0.0.1", "method": "GET", "path": "/admin.php?as=admin", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:15 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "7183"}, "body": "[omitted html payload: 3935 bytes]", "body_bytes": 3935, "body_truncated": true}}
{"ts": "2026-03-30T16:02:17+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-admin/admin.php?page=calendar-diagnostics&as=admin", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/admin.php?as=admin", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:17 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "8898"}, "body": "[omitted html payload: 3935 bytes]", "body_bytes": 3935, "body_truncated": true}}
{"ts": "2026-03-30T16:02:17+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/admin/diagnostics?limit=20&as=admin", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-diagnostics&as=admin", "Content-Type": "application/json", "X-WP-User": "admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:17 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "28256"}, "body": "{\"data\": [{\"ts\": \"2026-03-30T16:00:13+00:00\", \"client\": \"127.0.0.1\", \"method\": \"POST\", \"path\": \"/wp-json/calendar/v1/events\", \"request\": {\"headers\": {\"Host\": \"127.0.0.1:8080\", \"User-Agent\": \"curl/8.14.1\", \"Accept\": \"*/*\", \"Content-Type\": \"application/json\", \"X-WP-User\": \"admin\", \"Content-Length\": \"295\"}, \"body\": \"{\\\"title\\\": \\\"Smoke Daily Exception TZ\\\", \\\"description\\\": \\\"tz-key\\\", \\\"location\\\": \\\"\\\", \\\"category\\\": \\\"\\\", \\\"all_day_event\\\": false, \\\"start_datetime\\\": \\\"2026-03-02T10:00:00+00:00\\\", \\\"end_datetime\\\": \\\"2026-03-02T11:00:00+00:00\\\", \\\"repeat_type\\\": \\\"daily\\\", \\\"repeat_interval\\\": 1, \\\"repeat_range_mode\\\": \\\"until\\\", \\\"repeat_until\\\": \\\"2026-03-19\\\"}\", \"body_bytes\": 295, \"body_truncated\": false}, \"response\": {\"status\": 201, \"headers\": {\"Server\": \"CalendarFixture/0.1 Python/3.13.5\", \"Date\": \"Mon, 30 Mar 2026 16:00:13 GMT\", \"Content-Type\": \"application/json; charset=utf-8\", \"Content-Length\": \"655\"}, \"body\": \"{\\\"data\\\": {\\\"id\\\": 17, \\\"uid\\\": \\\"6bf853766043d7c101b6@calendar-wp-plugin\\\", \\\"title\\\": \\\"Smoke Daily Exception TZ\\\", \\\"description\\\": \\\"tz-key\\\", \\\"location\\\": \\\"\\\", \\\"category\\\": \\\"\\\", \\\"all_day_event\\\": false, \\\"start_datetime\\\": \\\"2026-03-02T10:00:00+00:00\\\", \\\"", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T16:02:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-admin/admin.php?page=calendar-users&as=admin", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-diagnostics&as=admin", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:24 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "9478"}, "body": "[omitted html payload: 3935 bytes]", "body_bytes": 3935, "body_truncated": true}}
{"ts": "2026-03-30T16:02:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/admin/users?as=admin", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "Content-Type": "application/json", "X-WP-User": "admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "527"}, "body": "{\"data\": [{\"id\": 1, \"email\": \"rw_user@example.test\", \"email_verified_at\": \"2026-03-30T16:01:41+00:00\", \"account_status\": \"active\", \"updated_at\": \"2026-03-30T16:01:41+00:00\"}, {\"id\": 2, \"email\": \"adrians@chezstephens.org.uk\", \"email_verified_at\": \"2026-03-30T16:01:41+00:00\", \"account_status\": \"active\", \"updated_at\": \"2026-03-30T16:01:41+00:00\"}, {\"id\": 3, \"email\": \"pending_user@example.test\", \"email_verified_at\": \"2026-03-30T16:01:41+00:00\", \"account_status\": \"pending_approval\", \"updated_at\": \"2026-03-30T16:01:41+00:00\"}]}", "body_bytes": 527, "body_truncated": false}}
{"ts": "2026-03-30T16:02:28+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:28 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T16:02:28+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:02:28 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "51"}, "body": "{\"data\": [], \"meta\": {\"count\": 0, \"view\": \"month\"}}", "body_bytes": 51, "body_truncated": false}}
{"ts": "2026-03-30T16:03:20+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/calendar, application/ics, text/plain;q=0.9", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:20 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:20+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "203", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:getcontenttype/><D:resourcetype/><D:displayname/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 203, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:20 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:20+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "314", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><D:resourcetype/><D:owner/><D:displayname/><D:current-user-principal/><D:current-user-privilege-set/><A:calendar-color/><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 314, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:20 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/calendar, application/ics, text/plain;q=0.9", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "314", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><D:resourcetype/><D:owner/><D:displayname/><D:current-user-principal/><D:current-user-privilege-set/><A:calendar-color/><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 314, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/calendar, application/ics, text/plain;q=0.9", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "Content-Type": "text/plain; charset=utf-8", "Content-Length": "30"}, "body": "caldav shared public calendar\n", "body_bytes": 30, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "314", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><D:resourcetype/><D:owner/><D:displayname/><D:current-user-principal/><D:current-user-privilege-set/><A:calendar-color/><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 314, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "431"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 431, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "203", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:getcontenttype/><D:resourcetype/><D:displayname/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 203, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "158", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 158, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:25+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "203", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:getcontenttype/><D:resourcetype/><D:displayname/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 203, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:25 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "431"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 431, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "158", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:C='urn:ietf:params:xml:ns:caldav'><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 158, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "217", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:getcontenttype/><D:current-user-privilege-set/><D:displayname/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 217, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "215", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:resourcetype/><D:displayname/><D:current-user-privilege-set/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 215, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "215", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:resourcetype/><D:displayname/><D:current-user-privilege-set/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 215, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "217", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:A='http://apple.com/ns/ical/'><D:prop><D:getcontenttype/><D:current-user-privilege-set/><D:displayname/><A:calendar-color/></D:prop></D:propfind>", "body_bytes": 217, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "If-Match": "nothing", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Content-Length": "0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:26+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "If-Match": "nothing", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Content-Length": "0", "Authorization": "***"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:26 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T16:03:28+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "337", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:C='urn:ietf:params:xml:ns:caldav' xmlns:CS='http://calendarserver.org/ns/'><D:prop><D:resourcetype/><D:owner/><D:current-user-principal/><D:current-user-privilege-set/><D:supported-report-set/><C:supported-calendar-component-set/><CS:getctag/></D:prop></D:propfind>", "body_bytes": 337, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:28 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:28+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "337", "Depth": "0", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache", "Authorization": "***"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D='DAV:' xmlns:C='urn:ietf:params:xml:ns:caldav' xmlns:CS='http://calendarserver.org/ns/'><D:prop><D:resourcetype/><D:owner/><D:current-user-principal/><D:current-user-privilege-set/><D:supported-report-set/><C:supported-calendar-component-set/><CS:getctag/></D:prop></D:propfind>", "body_bytes": 337, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:28 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "509"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 509, "body_truncated": false}}
{"ts": "2026-03-30T16:03:28+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:28 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:28+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:28 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7afd6bfad476334a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"bd549a6776fb7591\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T16:03:28+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "655", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/calendars/public/1.ics</D:href></C:calendar-multiget>", "body_bytes": 655, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:28 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8815"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"7afd6bfad476334a\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T160328Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"bd549a6776fb7591\"</D:getetag>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T16:03:43+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/3.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14098", "If-Match": "\"39d8705698ac45a3\"", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:43 GMT", "ETag": "\"1b040a223eb85dbe\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:43+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/3.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1030"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1b040a223eb85dbe\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T160343Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEXDATE;TZID=Europe/London:20260414T090000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 1030, "body_truncated": false}}
{"ts": "2026-03-30T16:03:43+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7afd6bfad476334a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"bd549a6776fb7591\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T16:03:50+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/4.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "14108", "If-Match": "\"195229643e51b679\"", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "BEGIN:VCALENDAR\r\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\nVERSION:2.0\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/London\r\nX-TZINFO:Europe/London[2025b]\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:-000115\r\nTZNAME:Europe/London(STD)\r\nDTSTART:18471201T000000\r\nRDATE:18471201T000000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19160521T020000\r\nRDATE:19160521T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19161001T030000\r\nRDATE:19161001T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19170408T020000\r\nRDATE:19170408T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19170917T030000\r\nRDATE:19170917T030000\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZOFFSETTO:+010000\r\nTZOFFSETFROM:+000000\r\nTZNAME:Europe/London(DST)\r\nDTSTART:19180324T020000\r\nRDATE:19180324T020000\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETTO:+000000\r\nTZOFFSETFROM:+010000\r\nTZNAME:Europe/London(STD)\r\nDTSTART:19180930T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1MO;UNTIL=19190929 ...(truncated)", "body_bytes": 4097, "body_truncated": true}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:50 GMT", "ETag": "\"2c3b4b86c7b93404\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:03:50+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "231", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/4.ics</D:href></C:calendar-multiget>", "body_bytes": 231, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:50 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1040"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"2c3b4b86c7b93404\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T160350Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260422T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 1040, "body_truncated": false}}
{"ts": "2026-03-30T16:03:51+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:51 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7afd6bfad476334a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"bd549a6776fb7591\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T16:03:56+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:03:56 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6476"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:04:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/users/me", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "Authorization": "***", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:04:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "137"}, "body": "{\"data\": {\"id\": 2, \"email\": \"adrians@chezstephens.org.uk\", \"account_status\": \"active\", \"email_verified_at\": \"2026-03-30T16:01:41+00:00\"}}", "body_bytes": 137, "body_truncated": false}}
{"ts": "2026-03-30T16:04:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:04:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6476"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:05:01+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/10", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "Authorization": "***", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:05:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "686"}, "body": "{\"data\": {\"id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"start_datetime\": \"2026-04-03T14:00:00+01:00\", \"end_datetime\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 8, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"2972ba81ca1c2300\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T16:01:41+00:00\"}}", "body_bytes": 686, "body_truncated": false}}
{"ts": "2026-03-30T16:05:07+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/10/occurrences?from=2026-04-01&months=3", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "Authorization": "***", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:05:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "2794"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-10T14:00:00+01:00\", \"occurrence_end\": \"2026-04-10T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-17T14:00:00+01:00\", \"occurrence_end\": \"2026-04-17T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete excepti ...(truncated)", "body_bytes": 2794, "body_truncated": false}}
{"ts": "2026-03-30T16:05:11+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14%3A00%3A00%2B01%3A00", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "Content-Type": "application/json", "Authorization": "***", "Origin": "http://localhost:8080", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=0"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:05:11 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T16:05:11+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/10/occurrences?from=2026-04-01&months=3", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "Authorization": "***", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:05:11 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "2446"}, "body": "{\"data\": [{\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-10T14:00:00+01:00\", \"occurrence_end\": \"2026-04-10T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-24T14:00:00+01:00\", \"occurrence_end\": \"2026-04-24T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete excepti ...(truncated)", "body_bytes": 2446, "body_truncated": false}}
{"ts": "2026-03-30T16:05:11+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-04-01", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:05:11 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6128"}, "body": "{\"data\": [{\"event_id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\"}, {\"event_id\": 10, \"uid\": \"fixture-ce-010@calendar-wp-plugin\", \"title\": \"Therapy Session\", \"description\": \"Used for single-occurrence delete exception tests.\", \"location\": \"Clinic\", \"category\": \"Health\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T14:00:00+01:00\", \"occurrence_end\": \"2026-04-03T15:00:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-06T09:00:00+01:00\", \"occurrence_end\": \"2026-04-06T09:15:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 3, \"uid\": \"fixture-ce-003@calendar-wp-plugin\", \"title\": \"Daily Standup\", \"description\": \"15 minute sync.\", \"location\": \"Online\", \"category\": \"Team\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T16:33:31+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:33:31 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7afd6bfad476334a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"bd549a6776fb7591\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T16:33:31+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "232", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/10.ics</D:href></C:calendar-multiget>", "body_bytes": 232, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 16:33:31 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1070"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/10.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"41b7bbfae11cdaad\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-010@calendar-wp-plugin\r\nDTSTAMP:20260330T163331Z\r\nSUMMARY:Therapy Session\r\nDESCRIPTION:Used for single-occurrence delete exception tests.\r\nLOCATION:Clinic\r\nCATEGORIES:Health\r\nDTSTART;TZID=Europe/London:20260403T140000\r\nDTEND;TZID=Europe/London:20260403T150000\r\nRRULE:FREQ=WEEKLY;COUNT=8\r\nEXDATE;TZID=Europe/London:20260417T140000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 1070, "body_truncated": false}}
{"ts": "2026-03-30T17:03:35+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:03:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "3570"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"7afd6bfad476334a\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"bd549a6776fb7591\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3570, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"b382c678635b840b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:29:00+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1d2c2", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"bb575c8c2154be15\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b382c678635b840b\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"5e18ae38222b91d2\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"00c5f32762e8c0b85a1c@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"c7092bf3eb675ef3\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:29:02+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"00c5f32762e8c0b85a1c@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"00c5f32762e8c0b85a1c@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"00c5f32762e8c0b85a1c@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"00c5f32762e8c0b85a1c@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"00c5f32762e8c0b85a1c@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "ETag": "\"2105e046d5fa798f\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"2105e046d5fa798f\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "ETag": "\"c13600e6f9aee896\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c13600e6f9aee896\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "ETag": "\"685db0d2f5593d0b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:02 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"685db0d2f5593d0b\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T172902Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "ETag": "\"5ed4a7bad55cd265\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5ed4a7bad55cd265\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T172903Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"2ea801a45310bab83a50@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"cec610533c64bc27\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:29:03+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c02269cb3a8e8d71\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:2ea801a45310bab83a50@calendar-wp-plugin\r\nDTSTAMP:20260330T172903Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f28f7a5c7c266a7e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:29:03+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"371b0caae432edbf9a59@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "ETag": "\"e70d8316450066f2\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"b382c678635b840b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:29:00+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1d2c2", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "ETag": "\"159009a65264b9e1\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"159009a65264b9e1\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T172903Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"b382c678635b840b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:29:00+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1d2c2", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T17:29:03+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:29:03 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"465df57ed39797a5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:30:33+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"651ef", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4be039fb110f13fc\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T173035Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T173035Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T173035Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T173035Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"465df57ed39797a5\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T173035Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"2c12143b41cf6e99\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T173035Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"d90ef129e8487aac2a02@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"3b5c92f57b27a7e7\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:30:35+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"d90ef129e8487aac2a02@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"d90ef129e8487aac2a02@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"d90ef129e8487aac2a02@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"d90ef129e8487aac2a02@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"d90ef129e8487aac2a02@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "ETag": "\"48303f38375ccfe9\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"48303f38375ccfe9\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T173036Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "ETag": "\"0a5f4111009ba192\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0a5f4111009ba192\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T173036Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "ETag": "\"7802f78bb8d6e8f3\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"7802f78bb8d6e8f3\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T173036Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "ETag": "\"4e08622f0a349692\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4e08622f0a349692\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T173036Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"f7dee92cb08d5885ad53@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f74a13c50da08642\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:30:36+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d7729a08966aa16f\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:f7dee92cb08d5885ad53@calendar-wp-plugin\r\nDTSTAMP:20260330T173036Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"bbadcd70ff645ca1\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:30:36+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"47420837950da56232ab@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "ETag": "\"e5bd42e8bfd1b0d1\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"465df57ed39797a5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:30:33+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"651ef", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "ETag": "\"d3ca454bd41251d6\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d3ca454bd41251d6\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T173036Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"465df57ed39797a5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:30:33+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"651ef", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T17:30:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:30:36 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T17:33:35+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:33:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6437"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"465df57ed39797a5\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"651ef0024e9c7082\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T17:33:35+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "1191", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/smoke-cancelled-occurrence.ics</D:href><D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href><D:href>/caldav/calendars/public/17.ics</D:href><D:href>/caldav/calendars/public/16.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href><D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href><D:href>/caldav/calendars/public/11.ics</D:href><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/calendars/public/1.ics</D:href></C:calendar-multiget>", "body_bytes": 1191, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:33:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "16545"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"465df57ed39797a5\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T173335Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"651ef0024e9c7082\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f7ad3938cf996256\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:38:32+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1c535", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d8126b67df01f0e2\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f7ad3938cf996256\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"4a24c041bfbc3ec2\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"3c9e7cfeb04a4a52d8d6@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"ac348cbf9c8977b5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:38:34+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"3c9e7cfeb04a4a52d8d6@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"3c9e7cfeb04a4a52d8d6@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"3c9e7cfeb04a4a52d8d6@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"3c9e7cfeb04a4a52d8d6@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"3c9e7cfeb04a4a52d8d6@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "ETag": "\"1506481eda0c5763\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1506481eda0c5763\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "ETag": "\"cb739417b1b3a094\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cb739417b1b3a094\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "ETag": "\"44d87bb8dd04cf86\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:34+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:34 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"44d87bb8dd04cf86\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T173834Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "ETag": "\"9dd5cba7baa23fc5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9dd5cba7baa23fc5\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T173835Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"d682d215052e032021f3@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"62e14734e3ca22de\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:38:35+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"694b221e5c8ab44a\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:d682d215052e032021f3@calendar-wp-plugin\r\nDTSTAMP:20260330T173835Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"63022f41345a4800\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:38:35+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"82cb03deb443fd591f6d@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "ETag": "\"5bb55dd889f66154\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f7ad3938cf996256\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:38:32+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1c535", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "ETag": "\"05afd85905bfe8d9\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"05afd85905bfe8d9\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T173835Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f7ad3938cf996256\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:38:32+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"1c535", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T17:38:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:38:35 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "6585"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"509f2bd7d2009ce8\"", "Content-Length": "3132"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3132, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 11, \"uid\": \"2ccb5f2076be62c35936@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e6c9698e1085c76b\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:12+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"2ccb5f2076be62c35936@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"2ccb5f2076be62c35936@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"2ccb5f2076be62c35936@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/11/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/11/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 11, \"uid\": \"2ccb5f2076be62c35936@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 11, \"uid\": \"2ccb5f2076be62c35936@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "ETag": "\"ff359fb275c089c9\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ff359fb275c089c9\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "ETag": "\"2764dba1363599bf\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"2764dba1363599bf\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "ETag": "\"dca2e1bdfd4a6703\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"dca2e1bdfd4a6703\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "ETag": "\"f7121f9cf89d5d41\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f7121f9cf89d5d41\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 16, \"uid\": \"bafafa747a751cf525e1@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"8f8aa2c3e6011a47\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:12+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/16/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/16.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"57d6b2e2283725e0\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:bafafa747a751cf525e1@calendar-wp-plugin\r\nDTSTAMP:20260330T174012Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"38b30150be27a031\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:12+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/17/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/17/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "ETag": "\"5409204c5488ce37\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "11645"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:40:12+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:12 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "ETag": "\"f3393675b839a951\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f3393675b839a951\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T174013Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12273"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T17:40:13+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "66"}, "body": "{\"email\": \"sec-nodisclose@example.test\", \"password\": \"***\"}", "body_bytes": 66, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:13 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"data\": {\"user_id\": 4, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:14+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/forgot-password", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "39"}, "body": "{\"email\": \"adrians@chezstephens.org.uk\"}", "body_bytes": 39, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "70"}, "body": "{\"data\": {\"status\": \"ok\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 70, "body_truncated": false}}
{"ts": "2026-03-30T17:40:14+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-1@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"data\": {\"user_id\": 5, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:14+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-2@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"data\": {\"user_id\": 6, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:14+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-3@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"data\": {\"user_id\": 7, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:14+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-4@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:14 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"data\": {\"user_id\": 8, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-5@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"data\": {\"user_id\": 9, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-6@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 10, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "{\"email\": \"sec-rate-7@example.test\", \"password\": \"***\"}", "body_bytes": 62, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 11, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "62"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 429, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"error\": {\"code\": \"rate_limited\", \"message\": \"Too many registration attempts. Try again later.\"}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/sec-1774892415.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Length": "201", "Content-Type": "application/x-www-form-urlencoded"}, "body": "[omitted non-text payload: 201 bytes, content-type=application/x-www-form-urlencoded]", "body_bytes": 201, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "ETag": "\"3cc5e1cc73127fbf\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/sec-1774892415.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3cc5e1cc73127fbf\"", "Content-Length": "287"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:sec-smoke-uid@example.test\r\nDTSTAMP:20260330T174015Z\r\nSUMMARY:Security Smoke Event\r\nDTSTART;TZID=Europe/London:20260415T100000\r\nDTEND;TZID=Europe/London:20260415T110000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 287, "body_truncated": false}}
{"ts": "2026-03-30T17:40:15+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/999999.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 17:40:15 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T18:03:41+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:03:41 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6756"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"eb53d018557c8fca\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"190a40db82a13a9b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T18:03:41+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "1251", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/sec-1774892415.ics</D:href><D:href>/caldav/calendars/public/smoke-cancelled-occurrence.ics</D:href><D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href><D:href>/caldav/calendars/public/17.ics</D:href><D:href>/caldav/calendars/public/16.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href><D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href><D:href>/caldav/calendars/public/11.ics</D:href><D:href>/caldav/calendars/public/10.ics</D:href><D:href>/caldav/calendars/public/9.ics</D:href><D:href>/caldav/calendars/public/8.ics</D:href><D:href>/caldav/calendars/public/7.ics</D:href><D:href>/caldav/calendars/public/6.ics</D:href><D:href>/caldav/calendars/public/5.ics</D:href><D:href>/caldav/calendars/public/4.ics</D:href><D:href>/caldav/calendars/public/3.ics</D:href><D:href>/caldav/calendars/public/2.ics</D:href><D:href>/caldav/ca ...(truncated)", "body_bytes": 1251, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:03:41 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "17327"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"eb53d018557c8fca\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T180341Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"190a40db82a13a9b\"</D:getetag>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-30T18:07:05+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/wp-admin/admin.php?page=calendar-users&as=admin", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User": "?1", "Priority": "u=0, i"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:07:05 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T18:07:05+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/public/events?view=month&date=2026-03-30", "request": {"headers": {"Host": "localhost:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:148.0) Gecko/20100101 Firefox/148.0", "Accept": "*/*", "Accept-Language": "en-GB,en;q=0.9", "Accept-Encoding": "gzip, deflate, br, zstd", "Referer": "http://localhost:8080/calendar", "DNT": "1", "Sec-GPC": "1", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:07:05 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "9410"}, "body": "{\"data\": [{\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"uid\": \"5b12ff0070324c83a9d7@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 17, \"ui", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T18:33:43+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:33:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "6756"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"eb53d018557c8fca\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"190a40db82a13a9b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T18:33:43+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "328", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/17.ics</D:href><D:href>/caldav/calendars/public/16.ics</D:href><D:href>/caldav/calendars/public/11.ics</D:href></C:calendar-multiget>", "body_bytes": 328, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:33:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "2816"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/11.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"1dc48ba9c8e4c1e0\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:2ccb5f2076be62c35936@calendar-wp-plugin\r\nDTSTAMP:20260330T183343Z\r\nSUMMARY:Smoke Occurrences API\r\nDESCRIPTION:occ-endpoint\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T110000\r\nRRULE:FREQ=DAILY;COUNT=3\r\nEXDATE;TZID=Europe/London:20260402T100000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/16.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"57d6 ...(truncated)", "body_bytes": 2816, "body_truncated": false}}
{"ts": "2026-03-30T18:58:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:19 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12887"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T18:58:23+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "66"}, "body": "{\"email\": \"sec-nodisclose@example.test\", \"password\": \"***\"}", "body_bytes": 66, "body_truncated": false}, "response": {"status": 409, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "71"}, "body": "{\"error\": {\"code\": \"conflict_error\", \"message\": \"user already exists\"}}", "body_bytes": 71, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "12887"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"2b728e795356b3a1\"", "Content-Length": "5828"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 21, \"uid\": \"31f9cb4f86804b4a5b99@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"074904f1a79b3def\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T18:58:24+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/21/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 21, \"uid\": \"31f9cb4f86804b4a5b99@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 21, \"uid\": \"31f9cb4f86804b4a5b99@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 21, \"uid\": \"31f9cb4f86804b4a5b99@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/21/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/21/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/21/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 21, \"uid\": \"31f9cb4f86804b4a5b99@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 21, \"uid\": \"31f9cb4f86804b4a5b99@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "ETag": "\"fd09919574f61846\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"fd09919574f61846\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "ETag": "\"55b725a1dc9a9f7c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"55b725a1dc9a9f7c\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "ETag": "\"93bc4c15adc79a61\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"93bc4c15adc79a61\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T185824Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "ETag": "\"3a4eeb42242c3576\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3a4eeb42242c3576\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T185825Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 22, \"uid\": \"43a308b5b85320514c11@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"3f98362302bad93a\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T18:58:25+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/22/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/22.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"10c5aa3ff8a36c74\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:43a308b5b85320514c11@calendar-wp-plugin\r\nDTSTAMP:20260330T185825Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"b1b9932905a7b74c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T18:58:25+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/23/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/23/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/23/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/23/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 23, \"uid\": \"57e4605078dcee8f54a2@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "ETag": "\"ad165d5f81f5c072\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "14838"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "ETag": "\"7d8fff7329f9a530\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"7d8fff7329f9a530\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T185825Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "14838"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T18:58:25+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:58:25 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T18:59:04+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:04 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "14838"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T18:59:04+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:04 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:04+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:04 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "77"}, "body": "{\"email\": \"sec-nodisclose-1774897144@example.test\", \"password\": \"***\"}", "body_bytes": 77, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 12, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/forgot-password", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "39"}, "body": "{\"email\": \"adrians@chezstephens.org.uk\"}", "body_bytes": 39, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "70"}, "body": "{\"data\": {\"status\": \"ok\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 70, "body_truncated": false}}
{"ts": "2026-03-30T18:59:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774897144-1@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 13, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774897144-2@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 14, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:07+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774897144-3@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:07 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 15, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774897144-4@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 16, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774897144-5@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 17, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774897144-6@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 18, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 429, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"error\": {\"code\": \"rate_limited\", \"message\": \"Too many registration attempts. Try again later.\"}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/sec-1774897148.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Length": "201", "Content-Type": "application/x-www-form-urlencoded"}, "body": "[omitted non-text payload: 201 bytes, content-type=application/x-www-form-urlencoded]", "body_bytes": 201, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "ETag": "\"74426c4ef3fe3bdd\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/sec-1774897148.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"74426c4ef3fe3bdd\"", "Content-Length": "287"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:sec-smoke-uid@example.test\r\nDTSTAMP:20260330T185908Z\r\nSUMMARY:Security Smoke Event\r\nDTSTART;TZID=Europe/London:20260415T100000\r\nDTEND;TZID=Europe/London:20260415T110000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 287, "body_truncated": false}}
{"ts": "2026-03-30T18:59:08+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/999999.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:08 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T18:59:17+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:17 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:17+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:17 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:17+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:17 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T18:59:27+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:27 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:27+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:27 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T18:59:27+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:27 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T18:59:27+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "0", "Content-Type": "application/xml", "Content-Length": "119"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 119, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:27 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T18:59:27+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "167"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:displayname/><D:resourcetype/><C:supported-calendar-component-set/></D:prop></D:propfind>", "body_bytes": 167, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 18:59:27 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T19:03:43+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:03:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "7677"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"eb53d018557c8fca\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"190a40db82a13a9b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T19:03:43+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "780", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/23.ics</D:href><D:href>/caldav/calendars/public/22.ics</D:href><D:href>/caldav/calendars/public/21.ics</D:href><D:href>/caldav/calendars/public/sec-1774897148.ics</D:href><D:href>/caldav/calendars/public/smoke-cancelled-occurrence.ics</D:href><D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href><D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href></C:calendar-multiget>", "body_bytes": 780, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:03:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8597"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"fd09919574f61846\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T190343Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"55b725a1dc9a9f7c\"</D:getetag>\n <C:calendar-data>BEGIN:V ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T19:06:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:06:40 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:06:40+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:06:40 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:06:40+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:06:40 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T19:06:40+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "0", "Content-Type": "application/xml", "Content-Length": "119"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 119, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:06:40 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T19:06:40+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "167"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:displayname/><D:resourcetype/><C:supported-calendar-component-set/></D:prop></D:propfind>", "body_bytes": 167, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:06:40 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T19:16:05+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:16:05 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:16:05+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:16:05 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:16:05+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:16:05 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T19:16:05+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "0", "Content-Type": "application/xml", "Content-Length": "119"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 119, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:16:05 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T19:16:05+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "167"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:displayname/><D:resourcetype/><C:supported-calendar-component-set/></D:prop></D:propfind>", "body_bytes": 167, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:16:05 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "14838"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"435242ad54fe20be\"", "Content-Length": "6806"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 24, \"uid\": \"ff961c0d028da4c33d68@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"13736f3159f811a0\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:27:35+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/24/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 24, \"uid\": \"ff961c0d028da4c33d68@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 24, \"uid\": \"ff961c0d028da4c33d68@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 24, \"uid\": \"ff961c0d028da4c33d68@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/24/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/24/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/24/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 24, \"uid\": \"ff961c0d028da4c33d68@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 24, \"uid\": \"ff961c0d028da4c33d68@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "ETag": "\"227c6db7bb9af481\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"227c6db7bb9af481\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "ETag": "\"e59b158ebd60c483\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e59b158ebd60c483\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "ETag": "\"0d9783a0beedd0ef\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0d9783a0beedd0ef\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "ETag": "\"de783c88365b72e6\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"de783c88365b72e6\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 25, \"uid\": \"3c229224b9c6e55380f3@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"11dc511cc506316c\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:27:35+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/25/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/25.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"7c606408b74ecb81\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:3c229224b9c6e55380f3@calendar-wp-plugin\r\nDTSTAMP:20260330T192735Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"6e797a165f88a673\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:27:35+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/26/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/26/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/26/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:35+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/26/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:35 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 26, \"uid\": \"5d29e505c8af669ff7f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "ETag": "\"7675cb635bbcecc0\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "16789"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "ETag": "\"4a343b62858a1e3f\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4a343b62858a1e3f\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T192736Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "16789"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:27:36+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:27:36 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:33:43+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "8598"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"eb53d018557c8fca\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"190a40db82a13a9b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T19:33:43+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "720", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/26.ics</D:href><D:href>/caldav/calendars/public/25.ics</D:href><D:href>/caldav/calendars/public/24.ics</D:href><D:href>/caldav/calendars/public/smoke-cancelled-occurrence.ics</D:href><D:href>/caldav/calendars/public/smoke-exdate-import.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-last.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-ordinal.ics</D:href><D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href><D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href></C:calendar-multiget>", "body_bytes": 720, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:43 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "7815"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"227c6db7bb9af481\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T193343Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"e59b158ebd60c483\"</D:getetag>\n <C:calendar-data>BEGIN:V ...(truncated)", "body_bytes": 3919, "body_truncated": true}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "16789"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f0955aca05643a7e\"", "Content-Length": "7784"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 27, \"uid\": \"fa1d8a27cfbf4aa40bd7@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a36c468e33bf09f5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:33:52+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/27/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 27, \"uid\": \"fa1d8a27cfbf4aa40bd7@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 27, \"uid\": \"fa1d8a27cfbf4aa40bd7@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 27, \"uid\": \"fa1d8a27cfbf4aa40bd7@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/27/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/27/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/27/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 27, \"uid\": \"fa1d8a27cfbf4aa40bd7@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 27, \"uid\": \"fa1d8a27cfbf4aa40bd7@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "ETag": "\"6350421b1463753a\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"6350421b1463753a\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "ETag": "\"5cfa99671f4b7beb\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5cfa99671f4b7beb\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "ETag": "\"65be3c124db419c5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"65be3c124db419c5\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "ETag": "\"3905a2d554e7b5ba\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3905a2d554e7b5ba\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 28, \"uid\": \"aea231c47fe7081e8d96@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"5820328298180a9e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:33:52+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/28/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/28.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"c73446c499d71fd1\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:aea231c47fe7081e8d96@calendar-wp-plugin\r\nDTSTAMP:20260330T193352Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:33:52+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:52 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"82b317029b0183ad\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:33:52+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/29/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/29/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/29/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/29/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 29, \"uid\": \"66c44f2dcba00c571e7c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "ETag": "\"3a78837c720108cb\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "18740"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "ETag": "\"cefb5ce31068ad03\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cefb5ce31068ad03\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T193353Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "18740"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:33:53+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:33:53 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "18740"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9602848cf7b23ee1\"", "Content-Length": "8762"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 30, \"uid\": \"372f5751ecd17b5b1356@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"9310ebe908eeec52\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:35:18+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/30/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 30, \"uid\": \"372f5751ecd17b5b1356@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 30, \"uid\": \"372f5751ecd17b5b1356@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 30, \"uid\": \"372f5751ecd17b5b1356@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/30/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/30/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/30/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 30, \"uid\": \"372f5751ecd17b5b1356@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 30, \"uid\": \"372f5751ecd17b5b1356@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "ETag": "\"5bdb56afb01d0635\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5bdb56afb01d0635\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "ETag": "\"d944656d7163bc58\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:18+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:18 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d944656d7163bc58\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T193518Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "ETag": "\"e4df6ba9e5bc5ebc\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e4df6ba9e5bc5ebc\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T193519Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "ETag": "\"de42e0a9050f4298\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"de42e0a9050f4298\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T193519Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 31, \"uid\": \"57916be3224eecf16f71@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"c671f8dde75b0a3e\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:35:19+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/31/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/31.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"1d4c253672ed1649\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:57916be3224eecf16f71@calendar-wp-plugin\r\nDTSTAMP:20260330T193519Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"bc93364ad884fc9a\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:35:19+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/32/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/32/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/32/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/32/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 32, \"uid\": \"875b585d579132363b4b@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "ETag": "\"7a677c31a5560dce\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "20691"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "ETag": "\"0333f0a3bac7134c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0333f0a3bac7134c\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T193519Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "20691"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:35:19+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:35:19 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:37:42+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:37:42 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:37:42+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:37:42 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:37:42+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:37:42 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T19:37:42+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "0", "Content-Type": "application/xml", "Content-Length": "119"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 119, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:37:42 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T19:37:42+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "167"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:displayname/><D:resourcetype/><C:supported-calendar-component-set/></D:prop></D:propfind>", "body_bytes": 167, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:37:42 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "20691"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"fe1ebad7407f5a79\"", "Content-Length": "9740"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3905, "body_truncated": true}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 33, \"uid\": \"9ba79385ddc86c0ed142@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"47d5fe1d950c41e8\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:43:23+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/33/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 33, \"uid\": \"9ba79385ddc86c0ed142@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 33, \"uid\": \"9ba79385ddc86c0ed142@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 33, \"uid\": \"9ba79385ddc86c0ed142@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/33/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/33/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/33/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 33, \"uid\": \"9ba79385ddc86c0ed142@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 33, \"uid\": \"9ba79385ddc86c0ed142@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "ETag": "\"428b0774334217a0\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"428b0774334217a0\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "ETag": "\"566c179900289f19\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"566c179900289f19\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "ETag": "\"5f03a7c2f0425eed\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5f03a7c2f0425eed\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T194323Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:43:23+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:23 GMT", "ETag": "\"cbde1523187e131a\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cbde1523187e131a\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T194324Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 34, \"uid\": \"6792256d04b9f2249471@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"09fbd59129f4f866\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:43:24+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/34/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/34.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cccf56daf59f3994\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:6792256d04b9f2249471@calendar-wp-plugin\r\nDTSTAMP:20260330T194324Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"664c73b2a2759081\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:43:24+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/35/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/35/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/35/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/35/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 35, \"uid\": \"999a1dcfe70585b069f1@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "ETag": "\"46a37a3457db1c66\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "22642"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "ETag": "\"5649d2d0c6078ad2\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"5649d2d0c6078ad2\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T194324Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "22642"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:43:24+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:24 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "22642"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"65fca5862933b6d8\"", "Content-Length": "10718"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3904, "body_truncated": true}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 36, \"uid\": \"9ba924e112c6328c7991@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"631138c973aa434a\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:43:38+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/36/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 36, \"uid\": \"9ba924e112c6328c7991@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 36, \"uid\": \"9ba924e112c6328c7991@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 36, \"uid\": \"9ba924e112c6328c7991@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/36/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/36/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/36/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 36, \"uid\": \"9ba924e112c6328c7991@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 36, \"uid\": \"9ba924e112c6328c7991@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "ETag": "\"d4b92d5e931bb87e\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"d4b92d5e931bb87e\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "ETag": "\"0ffe94cdaf00da8f\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:38+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:38 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0ffe94cdaf00da8f\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T194338Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "ETag": "\"deaa13cf4c78a1a2\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"deaa13cf4c78a1a2\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T194339Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "ETag": "\"b14dcf1638b1116b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b14dcf1638b1116b\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T194339Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 37, \"uid\": \"dc869cdd20b57c4ce060@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"a42acbb8f1012c50\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:43:39+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/37/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/37.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"7ec2bdd719b303a2\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:dc869cdd20b57c4ce060@calendar-wp-plugin\r\nDTSTAMP:20260330T194339Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"f35557f2b1ee363d\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:43:39+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/38/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/38/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/38/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/38/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 38, \"uid\": \"08597e0cd8484e4afa74@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "ETag": "\"0670fbaf6ffb7eb5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "24593"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "ETag": "\"69637d4b3fac5b1c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"69637d4b3fac5b1c\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T194339Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "24593"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:43:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:43:39 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "24593"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "24593"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"b9666df54fddc7d2\"", "Content-Length": "11696"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3904, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 39, \"uid\": \"5583f348e82b4d30498e@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"6afb4a6b08afb64f\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:45:22+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "0", "Content-Type": "application/xml", "Content-Length": "119"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 119, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/39/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 39, \"uid\": \"5583f348e82b4d30498e@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 39, \"uid\": \"5583f348e82b4d30498e@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 39, \"uid\": \"5583f348e82b4d30498e@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "167"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:displayname/><D:resourcetype/><C:supported-calendar-component-set/></D:prop></D:propfind>", "body_bytes": 167, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/39/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/39/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/39/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 39, \"uid\": \"5583f348e82b4d30498e@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 39, \"uid\": \"5583f348e82b4d30498e@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "ETag": "\"e54b1ce109a46cc8\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e54b1ce109a46cc8\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "ETag": "\"3ca3370cf9a8bc3d\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3ca3370cf9a8bc3d\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "ETag": "\"391d992cae22bea5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"391d992cae22bea5\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "ETag": "\"0f6f0463ee50274c\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"0f6f0463ee50274c\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 40, \"uid\": \"780f5c74fb0ff81f4d77@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"601dc1b8caa7090a\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:45:22+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/40/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/40.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"9af632dd6f1dd8f5\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:780f5c74fb0ff81f4d77@calendar-wp-plugin\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"8cce090cd63776d1\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:45:22+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/41/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/41/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/41/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/41/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 41, \"uid\": \"a2738714eb50fc15415c@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "ETag": "\"cc710e449dbfa1ae\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "26544"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "ETag": "\"050cf9004963ffed\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:22+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:22 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"050cf9004963ffed\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T194522Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:45:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "26544"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:45:23+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "77"}, "body": "{\"email\": \"sec-nodisclose-1774899922@example.test\", \"password\": \"***\"}", "body_bytes": 77, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 19, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:23 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:45:23+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:23 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:45:24+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/forgot-password", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "39"}, "body": "{\"email\": \"adrians@chezstephens.org.uk\"}", "body_bytes": 39, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "70"}, "body": "{\"data\": {\"status\": \"ok\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 70, "body_truncated": false}}
{"ts": "2026-03-30T19:45:24+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-1@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 20, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:24+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-2@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:24 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 21, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-3@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 22, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-4@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 23, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-5@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 24, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:25+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-6@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:25 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 25, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:26+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774899922-7@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:26 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 26, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:45:26+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 429, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:26 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"error\": {\"code\": \"rate_limited\", \"message\": \"Too many registration attempts. Try again later.\"}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T19:45:26+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/sec-1774899926.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Length": "201", "Content-Type": "application/x-www-form-urlencoded"}, "body": "[omitted non-text payload: 201 bytes, content-type=application/x-www-form-urlencoded]", "body_bytes": 201, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:26 GMT", "ETag": "\"60902c44e50b1c11\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:45:26+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/sec-1774899926.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:26 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"60902c44e50b1c11\"", "Content-Length": "287"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:sec-smoke-uid@example.test\r\nDTSTAMP:20260330T194526Z\r\nSUMMARY:Security Smoke Event\r\nDTSTART;TZID=Europe/London:20260415T100000\r\nDTEND;TZID=Europe/London:20260415T110000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 287, "body_truncated": false}}
{"ts": "2026-03-30T19:45:26+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/999999.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:45:26 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "26544"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"e2b1a46432ffc137\"", "Content-Length": "12674"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3904, "body_truncated": true}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 42, \"uid\": \"cc7484132e5ceca0e789@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"ae03a0cef700c3da\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:47:39+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/42/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 42, \"uid\": \"cc7484132e5ceca0e789@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 42, \"uid\": \"cc7484132e5ceca0e789@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 42, \"uid\": \"cc7484132e5ceca0e789@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/42/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/42/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/42/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 42, \"uid\": \"cc7484132e5ceca0e789@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 42, \"uid\": \"cc7484132e5ceca0e789@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "ETag": "\"17ccc871adec4bc3\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"17ccc871adec4bc3\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "ETag": "\"f3ef2b7fc18dcec7\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f3ef2b7fc18dcec7\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "ETag": "\"f5d439a17623207e\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"f5d439a17623207e\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "ETag": "\"ec62ff1e4b136e42\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"ec62ff1e4b136e42\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T194739Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:47:39+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:39 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 43, \"uid\": \"672c78f46dcc88e86186@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"773becc6bc4fddc5\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:47:39+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/43/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/43.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"90276a2d43ab3d9f\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:672c78f46dcc88e86186@calendar-wp-plugin\r\nDTSTAMP:20260330T194740Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"32aa098f1ad6c404\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:47:40+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/44/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/44/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/44/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/44/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 44, \"uid\": \"4d93e11a90cee95c5c1a@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "ETag": "\"f9cb0b8409520dff\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "28495"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "ETag": "\"43a1d243dfe2e00d\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"43a1d243dfe2e00d\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T194740Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "28495"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:47:40+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:47:40 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "28495"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "28495"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"8651b7f9d8461cda\"", "Content-Length": "13652"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nCALSCALE:GREGORIAN\r\nX-WR-TIMEZONE:Europe/London\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-002@calendar-wp-plugin\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Office Closed\r\nDESCRIPTION:Public holiday closure.\r\nLOCATION:HQ\r\nCATEGORIES:Operations\r\nDTSTART;VALUE=DATE:20260504\r\nDTEND;VALUE=DATE:20260505\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-003@calendar-wp-plugin\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Daily Standup\r\nDESCRIPTION:15 minute sync.\r\nLOCATION:Online\r\nCATEGORIES:Team\r\nDTSTART;TZID=Europe/London:20260406T090000\r\nDTEND;TZID=Europe/London:20260406T091500\r\nRRULE:FREQ=DAILY;COUNT=10\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\n ...(truncated)", "body_bytes": 3904, "body_truncated": true}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 401, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "WWW-Authenticate": "Basic realm=\"calendar-caldav-fixture\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "OPTIONS", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "DAV": "1, 2, calendar-access", "Allow": "OPTIONS, PROPFIND, REPORT, GET, PUT, DELETE"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/1.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"eb53d018557c8fca\"", "Content-Length": "364"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-001@calendar-wp-plugin\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Board Meeting\r\nDESCRIPTION:Quarterly board review.\r\nLOCATION:Room A\r\nCATEGORIES:Governance\r\nDTSTART;TZID=Europe/London:20260401T100000\r\nDTEND;TZID=Europe/London:20260401T113000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 364, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "117"}, "body": "<D:propfind xmlns:D=\"DAV:\"><D:prop><D:current-user-principal/><D:resourcetype/><D:displayname/></D:prop></D:propfind>", "body_bytes": 117, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "1348"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype><D:current-user-principal><D:href>/caldav/principals/user/</D:href></D:current-user-principal>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"V ...(truncated)", "body_bytes": 1348, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/xml; charset=utf-8", "Depth": "1", "Content-Length": "239"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n <D:prop><D:getetag/><C:calendar-data/></D:prop>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n</C:calendar-multiget>\n", "body_bytes": 239, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "997"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/4.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"691a56c3c4084218\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:fixture-ce-004@calendar-wp-plugin\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Community Lunch\r\nDESCRIPTION:Weekly community lunch.\r\nLOCATION:Cafeteria\r\nCATEGORIES:Community\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n</D:multistatus>\n", "body_bytes": 997, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/10/occurrences/2026-04-17T14:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "287"}, "body": "{\"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"count\", \"repeat_count\": 3}", "body_bytes": 287, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "647"}, "body": "{\"data\": {\"id\": 45, \"uid\": \"ae50f5d7efb7ef19f4cf@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"count\", \"repeat_count\": 3, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"0896ee7c0c565fe2\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:56:58+00:00\"}}", "body_bytes": 647, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/principals/user/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "0", "Content-Type": "application/xml", "Content-Length": "119"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><C:calendar-home-set/></D:prop></D:propfind>", "body_bytes": 119, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "445"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/principals/user/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><D:principal/></D:resourcetype><C:calendar-home-set><D:href>/caldav/calendars/</D:href></C:calendar-home-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 445, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/45/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "937"}, "body": "{\"data\": [{\"event_id\": 45, \"uid\": \"ae50f5d7efb7ef19f4cf@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 45, \"uid\": \"ae50f5d7efb7ef19f4cf@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-02T10:00:00+01:00\", \"occurrence_end\": \"2026-04-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 45, \"uid\": \"ae50f5d7efb7ef19f4cf@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 937, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/45/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/45/occurrences/2026-04-02T10:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Depth": "1", "Content-Type": "application/xml", "Content-Length": "167"}, "body": "<D:propfind xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:displayname/><D:resourcetype/><C:supported-calendar-component-set/></D:prop></D:propfind>", "body_bytes": 167, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "728"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/></D:resourcetype>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n</D:multistatus>\n", "body_bytes": 728, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/45/occurrences?from=2026-04-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "628"}, "body": "{\"data\": [{\"event_id\": 45, \"uid\": \"ae50f5d7efb7ef19f4cf@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-01T10:00:00+01:00\", \"occurrence_end\": \"2026-04-01T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 45, \"uid\": \"ae50f5d7efb7ef19f4cf@calendar-wp-plugin\", \"title\": \"Smoke Occurrences API\", \"description\": \"occ-endpoint\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-04-03T10:00:00+01:00\", \"occurrence_end\": \"2026-04-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}]}", "body_bytes": 628, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "454"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\nVERSION:2.0\nBEGIN:VTIMEZONE\nTZID:Europe/London\nBEGIN:STANDARD\nDTSTART:18471201T000000\nRRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=9\nTZOFFSETFROM:+0115\nTZOFFSETTO:+0000\nTZNAME:GMT\nEND:STANDARD\nEND:VTIMEZONE\nBEGIN:VEVENT\nUID:smoke-vtimezone-parser-001\nSUMMARY:Smoke VTIMEZONE Parse\nDTSTART;TZID=Europe/London:20260423T150000\nDTEND;TZID=Europe/London:20260423T160000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 454, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "ETag": "\"4777d0172be8ffc5\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-vtimezone.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"4777d0172be8ffc5\"", "Content-Length": "288"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 288, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "261"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-nth-001\nSUMMARY:Smoke Monthly Nth\nDTSTART;TZID=Europe/London:20260402T150000\nDTEND;TZID=Europe/London:20260402T160000\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 261, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "ETag": "\"93aae3c5c0e310d1\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:58+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-nth.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:58 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"93aae3c5c0e310d1\"", "Content-Length": "319"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-nth-001\r\nDTSTAMP:20260330T195658Z\r\nSUMMARY:Smoke Monthly Nth\r\nDTSTART;TZID=Europe/London:20260426T150000\r\nDTEND;TZID=Europe/London:20260426T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 319, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "259"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-ordinal-001\nSUMMARY:Smoke Monthly Ordinal\nDTSTART;TZID=Europe/London:20260411T150000\nDTEND;TZID=Europe/London:20260411T160000\nRRULE:FREQ=MONTHLY;BYDAY=2SA\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 259, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "ETag": "\"3d1c488be8943444\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-ordinal.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"3d1c488be8943444\"", "Content-Length": "327"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-ordinal-001\r\nDTSTAMP:20260330T195659Z\r\nSUMMARY:Smoke Monthly Ordinal\r\nDTSTART;TZID=Europe/London:20260411T150000\r\nDTEND;TZID=Europe/London:20260411T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=2\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 327, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "264"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-monthly-last-001\nSUMMARY:Smoke Monthly Last\nDTSTART;TZID=Europe/London:20260425T150000\nDTEND;TZID=Europe/London:20260425T160000\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 264, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "ETag": "\"bce963d66714a73b\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-monthly-last.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"bce963d66714a73b\"", "Content-Length": "322"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-monthly-last-001\r\nDTSTAMP:20260330T195659Z\r\nSUMMARY:Smoke Monthly Last\r\nDTSTART;TZID=Europe/London:20260425T150000\r\nDTEND;TZID=Europe/London:20260425T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SA;BYSETPOS=-1\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 322, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "362"}, "body": "{\"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-19T15:00:00+01:00\", \"end_datetime\": \"2026-05-19T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\"}", "body_bytes": 362, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "673"}, "body": "{\"data\": {\"id\": 46, \"uid\": \"9fd41c1cc728b146f791@calendar-wp-plugin\", \"title\": \"Smoke 4th Sunday Anchor\", \"description\": \"anchor-normalization\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-05-24T15:00:00+01:00\", \"end_datetime\": \"2026-05-24T16:00:00+01:00\", \"repeat_type\": \"monthly\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"weekday_of_month\", \"repeat_nth_day\": null, \"repeat_nth_pos\": 4, \"repeat_nth_weekday\": 0, \"repeat_range_mode\": \"no_end\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"65b610e6c9d5be76\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:56:59+00:00\"}}", "body_bytes": 673, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/46/occurrences/2026-05-24T15:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/46.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"cb0262906b4e16d2\"", "Content-Length": "420"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:9fd41c1cc728b146f791@calendar-wp-plugin\r\nDTSTAMP:20260330T195659Z\r\nSUMMARY:Smoke 4th Sunday Anchor\r\nDESCRIPTION:anchor-normalization\r\nDTSTART;TZID=Europe/London:20260524T150000\r\nDTEND;TZID=Europe/London:20260524T160000\r\nRRULE:FREQ=MONTHLY;BYDAY=SU;BYSETPOS=4\r\nEXDATE;TZID=Europe/London:20260524T150000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 420, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "X-WP-User": "admin", "Content-Length": "295"}, "body": "{\"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_range_mode\": \"until\", \"repeat_until\": \"2026-03-19\"}", "body_bytes": 295, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "655"}, "body": "{\"data\": {\"id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"start_datetime\": \"2026-03-02T10:00:00+00:00\", \"end_datetime\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"until\", \"repeat_count\": null, \"repeat_until\": \"2026-03-19\", \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"e65810e02d6e9a50\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T19:56:59+00:00\"}}", "body_bytes": 655, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/47/occurrences/2026-03-11T11:00:00+01:00", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/47/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "5212"}, "body": "{\"data\": [{\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "DELETE", "path": "/wp-json/calendar/v1/events/47/occurrences/2026-03-10", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 204, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT"}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/47/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4906"}, "body": "{\"data\": [{\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+00:00\", \"occurrence_end\": \"2026-03-02T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+00:00\", \"occurrence_end\": \"2026-03-03T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+00:00\", \"occurrence_end\": \"2026-03-04T11:00:00+00:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 47, \"uid\": \"5058caddf2fc8c58b4dc@calendar-wp-plugin\", \"title\": \"Smoke Daily Exception TZ\", \"description\": \"tz-key\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+00:00\", \"occurrence_end\": \"2026-03-05T11:00:00", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-exdate-import.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "323"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-exdate-import-001\nSUMMARY:Smoke EXDATE Import\nDTSTART;TZID=Europe/London:20260302T100000\nDTEND;TZID=Europe/London:20260302T110000\nRRULE:FREQ=DAILY;UNTIL=20260319T235959\nEXDATE;TZID=Europe/London:20260310T100000,20260311T100000\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 323, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "ETag": "\"3894b8874c8aec1f\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "30451"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/18/occurrences?from=2026-03-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "4474"}, "body": "{\"data\": [{\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-02T10:00:00+01:00\", \"occurrence_end\": \"2026-03-02T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-03T10:00:00+01:00\", \"occurrence_end\": \"2026-03-03T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-04T10:00:00+01:00\", \"occurrence_end\": \"2026-03-04T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE Import\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-03-05T10:00:00+01:00\", \"occurrence_end\": \"2026-03-05T11:00:00+01:00\", \"repeat_type\": \"daily\"}, {\"event_id\": 18, \"uid\": \"smoke-exdate-import-001\", \"title\": \"Smoke EXDATE ", "body_bytes": 3928, "body_truncated": true}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "text/calendar; charset=utf-8", "Content-Length": "467"}, "body": "BEGIN:VCALENDAR\nPRODID:-//Smoke//EN\nVERSION:2.0\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nSUMMARY:Smoke Cancelled Occurrence\nDTSTART;TZID=Europe/London:20260408T123000\nDTEND;TZID=Europe/London:20260408T133000\nRRULE:FREQ=WEEKLY\nEND:VEVENT\nBEGIN:VEVENT\nUID:smoke-cancelled-occurrence-001\nRECURRENCE-ID;TZID=Europe/London:20260506T123000\nDTSTART;TZID=Europe/London:20260506T123000\nDTEND;TZID=Europe/London:20260506T133000\nSTATUS:CANCELLED\nEND:VEVENT\nEND:VCALENDAR\n", "body_bytes": 467, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "ETag": "\"14340d12265ad2dd\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/smoke-cancelled-occurrence.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"14340d12265ad2dd\"", "Content-Length": "359"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-cancelled-occurrence-001\r\nDTSTAMP:20260330T195659Z\r\nSUMMARY:Smoke Cancelled Occurrence\r\nDTSTART;TZID=Europe/London:20260408T123000\r\nDTEND;TZID=Europe/London:20260408T133000\r\nRRULE:FREQ=WEEKLY\r\nEXDATE;TZID=Europe/London:20260506T123000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 359, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "30452"}, "body": "{\"data\": [{\"id\": 1, \"uid\": \"fixture-ce-001@calendar-wp-plugin\", \"title\": \"Board Meeting\", \"description\": \"Quarterly board review.\", \"location\": \"Room A\", \"category\": \"Governance\", \"all_day_event\": false, \"start_datetime\": \"2026-04-01T10:00:00+01:00\", \"end_datetime\": \"2026-04-01T11:30:00+01:00\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"eb53d018557c8fca\\\"\", \"sync_version\": 1, \"updated_at\": \"2026-03-30T17:40:10+00:00\"}, {\"id\": 2, \"uid\": \"fixture-ce-002@calendar-wp-plugin\", \"title\": \"Office Closed\", \"description\": \"Public holiday closure.\", \"location\": \"HQ\", \"category\": \"Operations\", \"all_day_event\": true, \"start_datetime\": \"2026-05-04\", \"end_datetime\": \"2026-05-05\", \"repeat_type\": \"none\", \"repeat_interval\": 1, \"repeat_nth_mode\": \"\", \"repeat_nth_day\": null, \"repeat_nth_pos\": null, \"repeat_nth_weekday\": null, \"repeat_range_mode\": \"none\", \"repeat_count\": null, \"repeat_until\": null, \"timezone\": \"Europe/London\", \"calendar_id\": \"public\", \"etag\": \"\\\"190a4", "body_bytes": 3927, "body_truncated": true}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/wp-json/calendar/v1/events/19/occurrences?from=2026-05-01&months=1", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "X-WP-User": "admin"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "892"}, "body": "{\"data\": [{\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-13T12:30:00+01:00\", \"occurrence_end\": \"2026-05-13T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-20T12:30:00+01:00\", \"occurrence_end\": \"2026-05-20T13:30:00+01:00\", \"repeat_type\": \"weekly\"}, {\"event_id\": 19, \"uid\": \"smoke-cancelled-occurrence-001\", \"title\": \"Smoke Cancelled Occurrence\", \"description\": \"\", \"location\": \"\", \"category\": \"\", \"all_day_event\": false, \"occurrence_start\": \"2026-05-27T12:30:00+01:00\", \"occurrence_end\": \"2026-05-27T13:30:00+01:00\", \"repeat_type\": \"weekly\"}]}", "body_bytes": 892, "body_truncated": false}}
{"ts": "2026-03-30T19:56:59+00:00", "client": "127.0.0.1", "method": "GET", "path": "/calendar", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:56:59 GMT", "Content-Type": "text/html; charset=utf-8", "Content-Length": "43447"}, "body": "[omitted html payload: 3934 bytes]", "body_bytes": 3934, "body_truncated": true}}
{"ts": "2026-03-30T19:57:00+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "77"}, "body": "{\"email\": \"sec-nodisclose-1774900618@example.test\", \"password\": \"***\"}", "body_bytes": 77, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 27, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:00+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/forgot-password", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "39"}, "body": "{\"email\": \"adrians@chezstephens.org.uk\"}", "body_bytes": 39, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "70"}, "body": "{\"data\": {\"status\": \"ok\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 70, "body_truncated": false}}
{"ts": "2026-03-30T19:57:00+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-1@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 28, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:00+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-2@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 29, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:00+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-3@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:00 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 30, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:01+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-4@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 31, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:01+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-5@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 32, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:01+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-6@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 33, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:01+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "{\"email\": \"sec-rate-1774900618-7@example.test\", \"password\": \"***\"}", "body_bytes": 73, "body_truncated": false}, "response": {"status": 201, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "99"}, "body": "{\"data\": {\"user_id\": 34, \"status\": \"pending_approval\", \"email_status\": \"sent\", \"email_sent\": true}}", "body_bytes": 99, "body_truncated": false}}
{"ts": "2026-03-30T19:57:01+00:00", "client": "127.0.0.1", "method": "POST", "path": "/wp-json/calendar/v1/users/register", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Type": "application/json", "Content-Length": "73"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 429, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:01 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "98"}, "body": "{\"error\": {\"code\": \"rate_limited\", \"message\": \"Too many registration attempts. Try again later.\"}}", "body_bytes": 98, "body_truncated": false}}
{"ts": "2026-03-30T19:57:01+00:00", "client": "127.0.0.1", "method": "PUT", "path": "/caldav/calendars/public/sec-1774900621.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*", "Content-Length": "201", "Content-Type": "application/x-www-form-urlencoded"}, "body": "[omitted non-text payload: 201 bytes, content-type=application/x-www-form-urlencoded]", "body_bytes": 201, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:01 GMT", "ETag": "\"32633048dcc96299\""}, "body": "", "body_bytes": 0, "body_truncated": false}}
{"ts": "2026-03-30T19:57:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/sec-1774900621.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 200, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:02 GMT", "Content-Type": "text/calendar; charset=utf-8", "ETag": "\"32633048dcc96299\"", "Content-Length": "287"}, "body": "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:sec-smoke-uid@example.test\r\nDTSTAMP:20260330T195702Z\r\nSUMMARY:Security Smoke Event\r\nDTSTART;TZID=Europe/London:20260415T100000\r\nDTEND;TZID=Europe/London:20260415T110000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", "body_bytes": 287, "body_truncated": false}}
{"ts": "2026-03-30T19:57:02+00:00", "client": "127.0.0.1", "method": "GET", "path": "/caldav/calendars/public/999999.ics", "request": {"headers": {"Host": "127.0.0.1:8080", "Authorization": "***", "User-Agent": "curl/8.14.1", "Accept": "*/*"}, "body": "", "body_bytes": 0, "body_truncated": false}, "response": {"status": 404, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Mon, 30 Mar 2026 19:57:02 GMT", "Content-Type": "application/json; charset=utf-8", "Content-Length": "62"}, "body": "{\"error\": {\"code\": \"not_found\", \"message\": \"Route not found\"}}", "body_bytes": 62, "body_truncated": false}}
{"ts": "2026-03-31T04:26:37+00:00", "client": "127.0.0.1", "method": "PROPFIND", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "144", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<D:propfind xmlns:D=\"DAV:\"><D:prop><D:getcontenttype/><D:resourcetype/><D:getetag/></D:prop></D:propfind>", "body_bytes": 144, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Tue, 31 Mar 2026 04:26:37 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "15045"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype><D:collection/><C:calendar/></D:resourcetype><D:displayname>Public Calendar</D:displayname><C:supported-calendar-component-set><C:comp name=\"VEVENT\"/></C:supported-calendar-component-set>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/1.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"eb53d018557c8fca\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/2.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:resourcetype/><D:getcontenttype>text/calendar; charset=utf-8</D:getcontenttype><D:getetag>\"190a40db82a13a9b\"</D:getetag>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n</D:response>\n<D:response>\n <D:href>/caldav/calendars/public/3.ics</D:href>\n <D:propstat>\n <D:prop>\n ...(truncated)", "body_bytes": 3918, "body_truncated": true}}
{"ts": "2026-03-31T04:26:37+00:00", "client": "127.0.0.1", "method": "REPORT", "path": "/caldav/calendars/public/", "request": {"headers": {"Host": "127.0.0.1:8080", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Thunderbird/140.8.1", "Accept": "text/xml", "Accept-Language": "en-GB,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Charset": "utf-8,*;q=0.1", "Content-Type": "text/xml; charset=utf-8", "Content-Length": "1644", "Depth": "1", "Origin": "http://127.0.0.1:8080", "DNT": "1", "Authorization": "***", "Connection": "keep-alive", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "no-cors", "Sec-Fetch-Site": "same-origin", "Priority": "u=4", "Pragma": "no-cache", "Cache-Control": "no-cache"}, "body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<C:calendar-multiget xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\"><D:prop><D:getetag/><C:calendar-data/></D:prop><D:href>/caldav/calendars/public/47.ics</D:href><D:href>/caldav/calendars/public/46.ics</D:href><D:href>/caldav/calendars/public/45.ics</D:href><D:href>/caldav/calendars/public/44.ics</D:href><D:href>/caldav/calendars/public/43.ics</D:href><D:href>/caldav/calendars/public/42.ics</D:href><D:href>/caldav/calendars/public/41.ics</D:href><D:href>/caldav/calendars/public/40.ics</D:href><D:href>/caldav/calendars/public/39.ics</D:href><D:href>/caldav/calendars/public/38.ics</D:href><D:href>/caldav/calendars/public/37.ics</D:href><D:href>/caldav/calendars/public/36.ics</D:href><D:href>/caldav/calendars/public/35.ics</D:href><D:href>/caldav/calendars/public/34.ics</D:href><D:href>/caldav/calendars/public/33.ics</D:href><D:href>/caldav/calendars/public/32.ics</D:href><D:href>/caldav/calendars/public/31.ics</D:href><D:href>/caldav/calendars/public/30.ics</D:href><D:href>/caldav/calendars/public/29.ics</D:href><D:href>/caldav/calendars/public/28.ics</D:href><D:href>/caldav/calendars/public/27.ics</D:href><D:href>/caldav/calendars/publ ...(truncated)", "body_bytes": 1644, "body_truncated": false}, "response": {"status": 207, "headers": {"Server": "CalendarFixture/0.1 Python/3.13.5", "Date": "Tue, 31 Mar 2026 04:26:37 GMT", "Content-Type": "application/xml; charset=utf-8", "Content-Length": "24725"}, "body": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\">\n<D:response>\n <D:href>/caldav/calendars/public/smoke-vtimezone.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"4777d0172be8ffc5\"</D:getetag>\n <C:calendar-data>BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Calendar WP Plugin Fixture//EN\r\nBEGIN:VEVENT\r\nUID:smoke-vtimezone-parser-001\r\nDTSTAMP:20260331T042637Z\r\nSUMMARY:Smoke VTIMEZONE Parse\r\nDTSTART;TZID=Europe/London:20260423T150000\r\nDTEND;TZID=Europe/London:20260423T160000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n</C:calendar-data>\n </D:prop>\n <D:status>HTTP/1.1 200 OK</D:status>\n </D:propstat>\n </D:response>\n<D:response>\n <D:href>/caldav/calendars/public/smoke-monthly-nth.ics</D:href>\n <D:propstat>\n <D:prop>\n <D:getetag>\"93aae3c5c0e310d1\"</D:getetag>\n <C:calendar-data>BEGIN:V ...(truncated)", "body_bytes": 3918, "body_truncated": true}}