use jmap_metadata_types::{
is_registered_namespace, is_valid_namespace, is_vendor_namespace, DataTypeMetadataInfo,
MetadataTextMatch, JMAP_METADATA_URI,
};
#[test]
fn capability_uri_matches_draft_02() {
assert_eq!(JMAP_METADATA_URI, "urn:ietf:params:jmap:metadata");
}
#[test]
fn data_type_metadata_info_draft_02_section_6_1() {
let json = r#"{
"namespaces": ["photography"],
"supportsVendorNamespaces": false,
"supportsPrivate": false,
"maxDepth": 3
}"#;
let info: DataTypeMetadataInfo = serde_json::from_str(json).unwrap();
assert_eq!(info.namespaces, vec!["photography"]);
assert!(!info.supports_vendor_namespaces);
assert!(!info.supports_private);
assert_eq!(info.max_depth, Some(3));
}
#[test]
fn data_type_metadata_info_draft_02_full_support() {
let json = r#"{
"namespaces": ["photography", "workflow"],
"supportsVendorNamespaces": true,
"supportsPrivate": true,
"maxDepth": null
}"#;
let info: DataTypeMetadataInfo = serde_json::from_str(json).unwrap();
assert_eq!(info.namespaces, vec!["photography", "workflow"]);
assert!(info.supports_vendor_namespaces);
assert!(info.supports_private);
assert_eq!(info.max_depth, None);
}
#[test]
fn data_type_metadata_info_defaults() {
let json = r#"{ "maxDepth": null }"#;
let info: DataTypeMetadataInfo = serde_json::from_str(json).unwrap();
assert!(info.namespaces.is_empty());
assert!(!info.supports_vendor_namespaces);
assert!(!info.supports_private);
assert_eq!(info.max_depth, None);
}
#[test]
fn data_type_metadata_info_round_trip() {
let json = r#"{
"namespaces": ["photography"],
"supportsVendorNamespaces": true,
"supportsPrivate": false,
"maxDepth": 5
}"#;
let info: DataTypeMetadataInfo = serde_json::from_str(json).unwrap();
let serialized = serde_json::to_value(&info).unwrap();
let reparsed: DataTypeMetadataInfo = serde_json::from_value(serialized).unwrap();
assert_eq!(info, reparsed);
}
#[test]
fn data_type_metadata_info_max_depth_null_round_trips() {
let json = r#"{
"namespaces": [],
"supportsVendorNamespaces": false,
"supportsPrivate": false,
"maxDepth": null
}"#;
let info: DataTypeMetadataInfo = serde_json::from_str(json).unwrap();
assert_eq!(info.max_depth, None);
let reser = serde_json::to_value(&info).unwrap();
assert!(reser["maxDepth"].is_null());
}
#[test]
fn metadata_text_match_draft_02_section_6_7() {
let json = r#"{
"path": "acme.example.com/memo",
"value": "follow up"
}"#;
let m: MetadataTextMatch = serde_json::from_str(json).unwrap();
assert_eq!(m.path, "acme.example.com/memo");
assert_eq!(m.value, "follow up");
}
#[test]
fn metadata_text_match_round_trip() {
let json = r#"{"path": "photography/album", "value": "sunset"}"#;
let m: MetadataTextMatch = serde_json::from_str(json).unwrap();
let reser = serde_json::to_value(&m).unwrap();
let reparsed: MetadataTextMatch = serde_json::from_value(reser).unwrap();
assert_eq!(m, reparsed);
}
#[test]
fn metadata_text_match_namespace_only_path() {
let json = r#"{"path": "photography", "value": "beach"}"#;
let m: MetadataTextMatch = serde_json::from_str(json).unwrap();
assert_eq!(m.path, "photography");
assert_eq!(m.value, "beach");
}
#[test]
fn registered_namespace_accepts_valid() {
assert!(is_registered_namespace("photography"));
assert!(is_registered_namespace("my-namespace_v2"));
assert!(is_registered_namespace("a"));
assert!(is_registered_namespace("A1-b2_c3"));
}
#[test]
fn registered_namespace_rejects_invalid() {
assert!(!is_registered_namespace(""));
assert!(!is_registered_namespace("has.dot"));
assert!(!is_registered_namespace("has space"));
assert!(!is_registered_namespace("foo@bar"));
}
#[test]
fn vendor_namespace_accepts_valid() {
assert!(is_vendor_namespace("acme.example.com"));
assert!(is_vendor_namespace("a.b"));
}
#[test]
fn vendor_namespace_rejects_invalid() {
assert!(!is_vendor_namespace("nodot"));
assert!(!is_vendor_namespace(""));
assert!(!is_vendor_namespace(".leading"));
assert!(!is_vendor_namespace("trailing."));
assert!(!is_vendor_namespace("a..b"));
assert!(!is_vendor_namespace("a. b"));
}
#[test]
fn valid_namespace_accepts_both_kinds() {
assert!(is_valid_namespace("photography"));
assert!(is_valid_namespace("acme.example.com"));
}
#[test]
fn valid_namespace_rejects_invalid() {
assert!(!is_valid_namespace(""));
assert!(!is_valid_namespace("has space"));
assert!(!is_valid_namespace(".leading"));
}