Crate serde_json_assert

Source
Expand description

This crate includes macros for comparing two serializable values by diffing their JSON representations. It is designed to give much more helpful error messages than the standard assert_eq!. It basically does a diff of the two objects and tells you the exact differences. This is useful when asserting that two large JSON objects are the same.

It uses the serde and serde_json to perform the serialization.

§Partial matching

If you want to assert that one JSON value is “included” in another use assert_json_include:

use serde_json_assert::assert_json_include;
use serde_json::json;

let a = json!({
    "data": {
        "users": [
            {
                "id": 1,
                "country": {
                    "name": "Denmark"
                }
            },
            {
                "id": 24,
                "country": {
                    "name": "Denmark"
                }
            }
        ]
    }
});

let b = json!({
    "data": {
        "users": [
            {
                "id": 1,
                "country": {
                    "name": "Sweden"
                }
            },
            {
                "id": 2,
                "country": {
                    "name": "Denmark"
                }
            }
        ]
    }
});

assert_json_include!(actual: a, expected: b)

This will panic with the error message:

json atoms at path ".data.users[0].country.name" are not equal:
    expected:
        "Sweden"
    actual:
        "Denmark"

json atoms at path ".data.users[1].id" are not equal:
    expected:
        2
    actual:
        24

assert_json_include allows extra data in actual but not in expected. That is so you can verify just a part of the JSON without having to specify the whole thing. For example this test passes:

use serde_json_assert::assert_json_include;
use serde_json::json;

assert_json_include!(
    actual: json!({
        "a": { "b": 1 },
    }),
    expected: json!({
        "a": {},
    })
)

However expected cannot contain additional data so this test fails:

use serde_json_assert::assert_json_include;
use serde_json::json;

assert_json_include!(
    actual: json!({
        "a": {},
    }),
    expected: json!({
        "a": { "b": 1 },
    })
)

That will print

json atom at path ".a.b" is missing from actual

§Exact matching

If you want to ensure two JSON values are exactly the same, use assert_json_eq.

use serde_json_assert::assert_json_eq;
use serde_json::json;

assert_json_eq!(
    json!({ "a": { "b": 1 } }),
    json!({ "a": {} })
)

This will panic with the error message:

json atom at path ".a.b" is missing from lhs

§Further customization

You can use assert_json_matches to further customize the comparison.

Macros§

assert_json_contains
Assert that a JSON value contains other JSON value
assert_json_eq
Compare two JSON values for an exact match.
assert_json_include
Compare two JSON values for an inclusive match.
assert_json_matches
Compare two JSON values according to a configuration.

Structs§

Config
Configuration for how JSON values should be compared.
Difference
Represents a difference between two JSON values.

Enums§

CompareMode
Mode for how JSON values should be compared.
FloatCompareMode
How should floating point numbers be compared.
Key
Represents a key in a JSON object or an index in a JSON array.
NumericMode
How should numbers be compared.
Path
Represents a path to a JSON value in a tree structure.

Functions§

assert_json_matches_no_panic
Compares two JSON values without panicking.
try_assert_json_matches
Compares two JSON values without panicking.