use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use jmap_types::{Id, State};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StateChange {
pub changed: HashMap<Id, HashMap<String, State>>,
#[serde(flatten, default, skip_serializing_if = "serde_json::Map::is_empty")]
pub extra: serde_json::Map<String, serde_json::Value>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn state_change_preserves_vendor_extras() {
let raw = json!({
"changed": {
"acc1": { "Email": "s42" }
},
"acmeCorpSequence": 17
});
let obj: StateChange = serde_json::from_value(raw).expect("StateChange must deserialize");
assert_eq!(
obj.extra.get("acmeCorpSequence").and_then(|v| v.as_u64()),
Some(17)
);
let v = serde_json::to_value(&obj).expect("StateChange must serialize");
assert_eq!(v["acmeCorpSequence"], json!(17));
}
#[test]
fn extra_equality_is_order_insensitive_under_workspace_flags() {
let raw_a = json!({
"changed": {"acc1": {"Email": "s1"}},
"vendorA": 1,
"vendorB": 2
});
let raw_b = json!({
"changed": {"acc1": {"Email": "s1"}},
"vendorB": 2,
"vendorA": 1
});
let a: StateChange = serde_json::from_value(raw_a).expect("a must deserialize");
let b: StateChange = serde_json::from_value(raw_b).expect("b must deserialize");
assert_eq!(
a, b,
"extra-map equality is order-insensitive under the workspace's \
default serde_json::Map (BTreeMap-backed); if this fails, \
check whether preserve_order has been enabled in the dep graph"
);
}
}