summaryrefslogtreecommitdiff
path: root/tests/util/server/src/assertions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/util/server/src/assertions.rs')
-rw-r--r--tests/util/server/src/assertions.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/util/server/src/assertions.rs b/tests/util/server/src/assertions.rs
index f964e56e9..c8b8845f4 100644
--- a/tests/util/server/src/assertions.rs
+++ b/tests/util/server/src/assertions.rs
@@ -108,3 +108,44 @@ pub fn assert_wildcard_match_with_logger(
}
}
}
+
+/// Asserts that the actual `serde_json::Value` is equal to the expected `serde_json::Value`, but
+/// only for the keys present in the expected value.
+///
+/// # Example
+///
+/// ```
+/// # use serde_json::json;
+/// # use test_server::assertions::assert_json_subset;
+/// assert_json_subset(json!({"a": 1, "b": 2}), json!({"a": 1}));
+///
+/// // Arrays are compared element by element
+/// assert_json_subset(json!([{ "a": 1, "b": 2 }, {}]), json!([{"a": 1}, {}]));
+/// ```
+#[track_caller]
+pub fn assert_json_subset(
+ actual: serde_json::Value,
+ expected: serde_json::Value,
+) {
+ match (actual, expected) {
+ (
+ serde_json::Value::Object(actual),
+ serde_json::Value::Object(expected),
+ ) => {
+ for (k, v) in expected.iter() {
+ let Some(actual_v) = actual.get(k) else {
+ panic!("Key {k:?} not found in actual value ({actual:#?})");
+ };
+ assert_json_subset(actual_v.clone(), v.clone());
+ }
+ }
+ (serde_json::Value::Array(actual), serde_json::Value::Array(expected)) => {
+ for (i, v) in expected.iter().enumerate() {
+ assert_json_subset(actual[i].clone(), v.clone());
+ }
+ }
+ (actual, expected) => {
+ assert_eq!(actual, expected);
+ }
+ }
+}