| Crates.io | googletest-json-serde |
| lib.rs | googletest-json-serde |
| version | 0.5.0 |
| created_at | 2025-09-29 06:06:17.635752+00 |
| updated_at | 2026-01-07 19:53:36.059766+00 |
| description | GoogleTest matchers for serde_json::Value |
| homepage | https://github.com/chege/googletest-json-serde |
| repository | https://github.com/chege/googletest-json-serde |
| max_upload_size | |
| id | 1859029 |
| size | 159,893 |
A set of matcher macros for ergonomic JSON testing with googletest-rust.
These tiny, focused matchers make it effortless to assert on serde_json::Value in Rust tests.
googletest-json-serde adds focused matcher macros for JSON so your Rust tests read like intent, not plumbing. It handles heterogeneous arrays, deep object patterns, path checks, and produces readable failure messages with path context.
Add as a dev-dependency:
cargo add googletest-json-serde --dev
use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
let actual = json!({
"vampire": { "name": "Nandor the Relentless", "age": 758, "familiar": "Guillermo" },
"house": { "city": "Staten Island", "roommates": ["Laszlo", "Nadja", "Colin Robinson"] }
});
assert_that!(
actual,
j::pat!({
"vampire": {
"name": starts_with("Nandor"),
"age": gt(500),
"familiar": eq("Guillermo"),
},
"house": {
"city": eq("Staten Island"),
"roommates": j::unordered_elements_are![
eq("Laszlo"),
eq("Nadja"),
contains_substring("Robinson"),
],
},
.. // allow extra fields
})
);
j::matches_pattern! / j::pat! (strict or relaxed)j::elements_are!j::unordered_elements_are!j::contains_each!j::is_contained_in!j::len!j::each!j::each_is_string()/number/boolean/null/array/objectj::primitive!, j::is_number/integer/fractional_number/whole_number/string/boolean, j::is_true/false, j::is_null, j::is_not_null, j::is_empty_string/non_empty_string, j::is_empty_array/object, j::is_non_empty_array/objectj::has_paths, j::has_only_paths, j::has_path_with!j::optional!use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
assert_that!(json!(42), j::primitive!(gt(40_i64)));
assert_that!(json!("Laszlo"), j::primitive!(starts_with("Las")));
assert_that!(json!(true), j::is_true());
assert_that!(json!(null), j::is_null());
assert_that!(json!(7), j::is_integer());
assert_that!(json!(7.0), j::is_whole_number());
assert_that!(json!(7.25), j::is_fractional_number());
use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
let value = json!({"user": {"id": 7, "name": "Ada"}});
assert_that!(value, j::has_path_with!("user.name", "Ada"));
assert_that!(value, j::has_path_with!("user.id", json!(7)));
assert_that!(value, j::has_path_with!("user.name", starts_with("A")));
use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
assert_that!(json!(42), j::predicate(|v| v.as_i64().map_or(false, |n| n > 0)));
assert_that!(json!("Energy vampire"), j::predicate(|v| v.as_str().map_or(false, |s| s.contains("Energy"))));
use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
assert_that!(
json!({"name": "Laszlo", "age": 310, "familiar": null}),
j::pat!({
"name": starts_with("Las"),
"age": gt(300),
"familiar": j::is_null(),
.. // allow extras like hobbies or cursed hats
})
);
use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
assert_that!(
json!(["Nandor", 758, true]),
j::elements_are![eq("Nandor"), j::is_number(), is_true()]
);
assert_that!(
json!(["Laszlo", "Nadja", "Colin Robinson"]),
j::unordered_elements_are![eq("Colin Robinson"), "Laszlo", "Nadja"]
);
assert_that!(
json!(["familiar", 1, null]),
j::contains_each![j::is_string(), j::is_not_null()]
);
assert_that!(
json!(["Nandor", "Nadja"]),
j::each_is_string()
);
use googletest::prelude::*;
use googletest_json_serde::json as j;
use serde_json::json;
assert_that!(
json!({
"guests": [
{"name": "Baron Afanas", "age": 2000},
{"name": "The Guide", "age": 500}
],
"house": { "city": "Staten Island", "roommates": 4 },
"ignored": true
}),
j::pat!({
"guests": j::unordered_elements_are![
j::pat!({ "name": starts_with("Baron"), "age": gt(1500) }),
j::pat!({ "name": eq("The Guide"), "age": ge(400) })
],
"house": { "city": eq("Staten Island"), "roommates": eq(4) },
..
})
);
tests/ and sanity/tests/sanity_test.rs.Dual-licensed under MIT or Apache-2.0.