Fix MS Exchange to JSCalendar conversion (closes #1 closes #2)

This commit is contained in:
Maurus Decimus
2026-06-04 12:18:56 +02:00
parent c89c5af37c
commit e49a7db278
5 changed files with 215 additions and 109 deletions
+8 -7
View File
@@ -8,7 +8,7 @@ use serde_json::{Map, Value, json};
use crate::exchange_ews::parse::{CalendarItemRaw, RawAttendee, RawOccurrence};
use crate::exchange_ews::recurrence::to_jscalendar_rule;
use crate::exchange_ews::tz::windows_to_iana;
use crate::exchange_ews::tz::resolve_to_iana;
pub struct EventValue {
pub data: Value,
@@ -73,7 +73,7 @@ pub fn to_jscalendar(raw: &CalendarItemRaw) -> EventValue {
let iana = raw
.start_tz
.as_deref()
.map(|tz| windows_to_iana(tz).unwrap_or(tz).to_owned());
.map(|tz| resolve_to_iana(tz).unwrap_or_else(|| "Etc/UTC".to_owned()));
if let Some(true) = raw.is_all_day_event {
if let Some(start) = raw.start.as_ref() {
let date_only = start.split('T').next().unwrap_or(start.as_str());
@@ -155,7 +155,7 @@ pub fn to_jscalendar(raw: &CalendarItemRaw) -> EventValue {
if let Some(rec) = raw.recurrence.as_ref()
&& let Some(rule) = to_jscalendar_rule(rec)
{
event.insert("recurrenceRules".to_owned(), Value::Array(vec![rule]));
event.insert("recurrenceRule".to_owned(), rule);
}
let overrides = build_recurrence_overrides(
&raw.modified_occurrences,
@@ -429,7 +429,7 @@ mod tests {
}
#[test]
fn unknown_windows_timezone_passes_through_verbatim() {
fn unknown_windows_timezone_falls_back_to_utc() {
let raw = CalendarItemRaw {
uid: Some("uid-x".to_owned()),
start: Some("2025-06-15T14:00:00Z".to_owned()),
@@ -439,7 +439,7 @@ mod tests {
};
let v = to_jscalendar(&raw).data;
assert_eq!(v["start"], "2025-06-15T14:00:00");
assert_eq!(v["timeZone"], "Made Up Time");
assert_eq!(v["timeZone"], "Etc/UTC");
}
#[test]
@@ -514,8 +514,9 @@ mod tests {
..CalendarItemRaw::default()
};
let v = to_jscalendar(&raw).data;
assert_eq!(v["recurrenceRules"][0]["frequency"], "daily");
assert_eq!(v["recurrenceRules"][0]["count"], 3);
assert!(v.get("recurrenceRules").is_none());
assert_eq!(v["recurrenceRule"]["frequency"], "daily");
assert_eq!(v["recurrenceRule"]["count"], 3);
let over = v["recurrenceOverrides"].as_object().unwrap();
assert!(over.contains_key("2025-06-16T14:00:00"));
assert_eq!(over["2025-06-17T14:00:00"]["excluded"], true);