diff --git a/crates/ruma-serde/Cargo.toml b/crates/ruma-serde/Cargo.toml index 310e6dd5..dc1c7424 100644 --- a/crates/ruma-serde/Cargo.toml +++ b/crates/ruma-serde/Cargo.toml @@ -23,3 +23,4 @@ serde_json = { version = "1.0.61", features = ["raw_value"] } [dev-dependencies] matches = "0.1.8" +ruma-identifiers = { path = "../ruma-identifiers" } diff --git a/crates/ruma-serde/tests/empty_strings.rs b/crates/ruma-serde/tests/empty_strings.rs index b93665d9..f813ffc1 100644 --- a/crates/ruma-serde/tests/empty_strings.rs +++ b/crates/ruma-serde/tests/empty_strings.rs @@ -1,33 +1,106 @@ -use serde::{Deserialize, Serialize}; -use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; +mod string { + use serde::{Deserialize, Serialize}; + use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; -#[derive(Serialize, Deserialize, PartialEq, Debug)] -struct StringStruct { - #[serde( - deserialize_with = "ruma_serde::empty_string_as_none", - serialize_with = "ruma_serde::none_as_empty_string" - )] - x: Option, + #[derive(Serialize, Deserialize, PartialEq, Debug)] + struct StringStruct { + #[serde( + default, + deserialize_with = "ruma_serde::empty_string_as_none", + serialize_with = "ruma_serde::none_as_empty_string" + )] + x: Option, + } + + #[test] + fn none_se() { + let decoded = StringStruct { x: None }; + let encoded = json!({ "x": "" }); + assert_eq!(to_json_value(decoded).unwrap(), encoded); + } + + #[test] + fn some_se() { + let decoded = StringStruct { x: Some("foo".into()) }; + let encoded = json!({ "x": "foo" }); + assert_eq!(to_json_value(decoded).unwrap(), encoded); + } + + #[test] + fn absent_de() { + let encoded = json!({}); + let decoded = StringStruct { x: None }; + assert_eq!(from_json_value::(encoded).unwrap(), decoded); + } + + #[test] + fn empty_de() { + let encoded = json!({ "x": "" }); + let decoded = StringStruct { x: None }; + assert_eq!(from_json_value::(encoded).unwrap(), decoded); + } + + #[test] + fn some_de() { + let encoded = json!({ "x": "foo" }); + let decoded = StringStruct { x: Some("foo".into()) }; + assert_eq!(from_json_value::(encoded).unwrap(), decoded); + } } -#[derive(Serialize, Deserialize, PartialEq, Debug)] -struct NoneStruct { - #[serde(skip_serializing_if = "Option::is_none")] - x: Option, -} +mod user { + use ruma_identifiers::{user_id, UserId}; + use serde::{Deserialize, Serialize}; + use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; -#[test] -fn empty_se() { - let string = StringStruct { x: None }; - let none = NoneStruct { x: None }; - assert_eq!(to_json_value(string).unwrap(), json!({"x": ""})); - assert_eq!(to_json_value(none).unwrap(), json!({})); -} + const CARL: &str = "@carl:example.com"; -#[test] -fn empty_de() { - let string = StringStruct { x: None }; - let none = NoneStruct { x: None }; - assert_eq!(from_json_value::(json!({"x": ""})).unwrap(), string); - assert_eq!(from_json_value::(json!({})).unwrap(), none); + fn carl() -> UserId { + user_id!("@carl:example.com") + } + + #[derive(Serialize, Deserialize, PartialEq, Debug)] + struct User { + #[serde( + default, + deserialize_with = "ruma_serde::empty_string_as_none", + serialize_with = "ruma_serde::none_as_empty_string" + )] + x: Option, + } + + #[test] + fn none_se() { + let decoded = User { x: None }; + let encoded = json!({ "x": "" }); + assert_eq!(to_json_value(decoded).unwrap(), encoded); + } + + #[test] + fn some_se() { + let decoded = User { x: Some(carl()) }; + let encoded = json!({ "x": CARL }); + assert_eq!(to_json_value(decoded).unwrap(), encoded); + } + + #[test] + fn absent_de() { + let encoded = json!({}); + let decoded = User { x: None }; + assert_eq!(from_json_value::(encoded).unwrap(), decoded); + } + + #[test] + fn empty_de() { + let encoded = json!({ "x": "" }); + let decoded = User { x: None }; + assert_eq!(from_json_value::(encoded).unwrap(), decoded); + } + + #[test] + fn some_de() { + let encoded = json!({ "x": CARL }); + let decoded = User { x: Some(carl()) }; + assert_eq!(from_json_value::(encoded).unwrap(), decoded); + } }