use super::AssertionSkip;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Assertion {
#[serde(rename = "type")]
pub assertion_type: String,
#[serde(default)]
pub field: Option<String>,
#[serde(
default,
deserialize_with = "deserialize_assertion_value",
skip_serializing_if = "Option::is_none"
)]
pub value: Option<serde_json::Value>,
#[serde(default)]
pub values: Option<Vec<serde_json::Value>>,
#[serde(default)]
pub method: Option<String>,
#[serde(default)]
pub check: Option<String>,
#[serde(default)]
pub args: Option<serde_json::Value>,
#[serde(default)]
pub return_type: Option<String>,
#[serde(default)]
pub skip: Option<AssertionSkip>,
}
impl Assertion {
pub(crate) fn expected_values(&self) -> Vec<&serde_json::Value> {
self.values
.as_ref()
.map(|values| values.iter().collect())
.or_else(|| self.value.as_ref().map(|value| vec![value]))
.unwrap_or_default()
}
}
fn deserialize_assertion_value<'de, D>(deserializer: D) -> Result<Option<serde_json::Value>, D::Error>
where
D: serde::Deserializer<'de>,
{
serde_json::Value::deserialize(deserializer).map(Some)
}
#[cfg(test)]
mod tests {
use super::Assertion;
use serde_json::{Value, json};
#[test]
fn expected_values_preserves_null_and_plural_precedence() {
let assertion: Assertion = serde_json::from_value(json!({"type": "equals", "value": null})).unwrap();
assert_eq!(assertion.expected_values(), vec![&Value::Null]);
let assertion: Assertion =
serde_json::from_value(json!({"type": "contains_all", "value": null, "values": [false, null]})).unwrap();
assert_eq!(assertion.expected_values(), vec![&json!(false), &Value::Null]);
}
}