Skip to main content

sova_testing/
assert.rs

1//! Uniform JSON snapshot helpers (insta).
2
3/// Assert JSON snapshot with common redactions (`id`, timestamps).
4///
5/// Uses `$crate::insta` so callers of this crate (or the facade re-export) do not
6/// need a direct `insta` dependency.
7#[macro_export]
8macro_rules! assert_json_snapshot {
9    ($name:expr, $value:expr) => {{
10        let mut settings = $crate::insta::Settings::clone_current();
11        $crate::with_json_redactions(&mut settings);
12        settings.bind(|| {
13            $crate::insta::assert_json_snapshot!($name, $value);
14        });
15    }};
16    ($value:expr) => {{
17        let mut settings = $crate::insta::Settings::clone_current();
18        $crate::with_json_redactions(&mut settings);
19        settings.bind(|| {
20            $crate::insta::assert_json_snapshot!($value);
21        });
22    }};
23}
24
25/// Redact volatile fields commonly present in API JSON.
26pub fn with_json_redactions(settings: &mut insta::Settings) {
27    settings.add_filter(r#""id"\s*:\s*\d+"#, r#""id": "[id]""#);
28    settings.add_filter(
29        r#""created_at"\s*:\s*"[^"]*""#,
30        r#""created_at": "[datetime]""#,
31    );
32    settings.add_filter(
33        r#""updated_at"\s*:\s*"[^"]*""#,
34        r#""updated_at": "[datetime]""#,
35    );
36    settings.add_filter(
37        r#""read_at"\s*:\s*("[^"]*"|null)"#,
38        r#""read_at": "[read_at]""#,
39    );
40}