#[cfg(test)]
mod tests {
use ig_client::presentation::serialization::{
option_string_empty_as_none, string_as_bool_opt, string_as_float_opt,
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct FloatTest {
#[serde(with = "string_as_float_opt")]
value: Option<f64>,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct BoolTest {
#[serde(with = "string_as_bool_opt")]
value: Option<bool>,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct StringTest {
#[serde(with = "option_string_empty_as_none")]
value: Option<String>,
}
#[test]
fn test_string_as_float_opt_serialize() {
let test = FloatTest { value: Some(42.5) };
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":42.5}"#);
let test = FloatTest { value: None };
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":null}"#);
}
#[test]
fn test_string_as_float_opt_deserialize() {
let json = r#"{"value": 42.5}"#;
let deserialized: FloatTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, FloatTest { value: Some(42.5) });
let json = r#"{"value": "42.5"}"#;
let deserialized: FloatTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, FloatTest { value: Some(42.5) });
let json = r#"{"value": null}"#;
let deserialized: FloatTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, FloatTest { value: None });
let json = r#"{"value": ""}"#;
let deserialized: FloatTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, FloatTest { value: None });
}
#[test]
fn test_string_as_float_opt_deserialize_errors() {
let json = r#"{"value": "not-a-number"}"#;
let result: Result<FloatTest, _> = serde_json::from_str(json);
assert!(result.is_err());
let json = r#"{"value": true}"#;
let result: Result<FloatTest, _> = serde_json::from_str(json);
assert!(result.is_err());
let json = r#"{"value": [1, 2, 3]}"#;
let result: Result<FloatTest, _> = serde_json::from_str(json);
assert!(result.is_err());
let json = r#"{"value": {"a": 1}}"#;
let result: Result<FloatTest, _> = serde_json::from_str(json);
assert!(result.is_err());
}
#[test]
fn test_string_as_bool_opt_serialize() {
let test = BoolTest { value: Some(true) };
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":"1"}"#);
let test = BoolTest { value: Some(false) };
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":"0"}"#);
let test = BoolTest { value: None };
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":null}"#);
}
#[test]
fn test_string_as_bool_opt_deserialize() {
let json = r#"{"value": "1"}"#;
let deserialized: BoolTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, BoolTest { value: Some(true) });
let json = r#"{"value": "0"}"#;
let deserialized: BoolTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, BoolTest { value: Some(false) });
let json = r#"{"value": null}"#;
let deserialized: BoolTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, BoolTest { value: None });
let json = r#"{"value": ""}"#;
let deserialized: BoolTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, BoolTest { value: None });
}
#[test]
fn test_string_as_bool_opt_deserialize_errors() {
let json = r#"{"value": "invalid"}"#;
let result: Result<BoolTest, _> = serde_json::from_str(json);
assert!(result.is_err());
let json = r#"{"value": 1}"#;
let result: Result<BoolTest, _> = serde_json::from_str(json);
assert!(result.is_err());
}
#[test]
fn test_option_string_empty_as_none_serialize() {
let test = StringTest {
value: Some("hello".to_string()),
};
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":"hello"}"#);
let test = StringTest {
value: Some("".to_string()),
};
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":null}"#);
let test = StringTest { value: None };
let serialized = serde_json::to_string(&test).unwrap();
assert_eq!(serialized, r#"{"value":null}"#);
}
#[test]
fn test_option_string_empty_as_none_deserialize() {
let json = r#"{"value": "hello"}"#;
let deserialized: StringTest = serde_json::from_str(json).unwrap();
assert_eq!(
deserialized,
StringTest {
value: Some("hello".to_string())
}
);
let json = r#"{"value": ""}"#;
let deserialized: StringTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, StringTest { value: None });
let json = r#"{"value": null}"#;
let deserialized: StringTest = serde_json::from_str(json).unwrap();
assert_eq!(deserialized, StringTest { value: None });
}
}