src/render/mode/json_test.rs

#[cfg(test)]
mod tests {
    use crate::render::mode::json::{JsonLine, JsonRenderer};

    #[test]
    fn compact_is_single_line() {
        let mut buf = Vec::new();
        {
            let mut r = JsonRenderer::new(&mut buf, false);
            r.render(&JsonLine {
                origin: "app.log",
                raw: "hello",
                fields: vec![],
                seq: 1,
            })
            .unwrap();
        }
        let out = String::from_utf8(buf).unwrap();
        assert_eq!(out.lines().count(), 1);
        assert!(out.contains("\"origin\":\"app.log\""));
    }

    #[test]
    fn pretty_adds_indentation() {
        let mut buf = Vec::new();
        {
            let mut r = JsonRenderer::new(&mut buf, true);
            r.render(&JsonLine {
                origin: "app.log",
                raw: "hi",
                fields: vec![],
                seq: 2,
            })
            .unwrap();
        }
        let out = String::from_utf8(buf).unwrap();
        assert!(out.lines().count() > 1);
        assert!(out.contains("\n  \"origin\""));
    }

    #[test]
    fn fields_roundtrip() {
        let mut buf = Vec::new();
        {
            let mut r = JsonRenderer::new(&mut buf, false);
            let fields = vec![("user".to_string(), "alice".to_string())];
            r.render_raw("app.log", "hi", &fields, 7).unwrap();
        }
        let out = String::from_utf8(buf).unwrap();
        assert!(out.contains("[[\"user\",\"alice\"]]"));
        assert!(out.contains("\"seq\":7"));
    }

    #[test]
    fn error_line_is_valid_json() {
        let mut buf = Vec::new();
        {
            let mut r = JsonRenderer::new(&mut buf, false);
            r.write_error("bad input").unwrap();
        }
        let out = String::from_utf8(buf).unwrap();
        assert_eq!(out.trim(), "{\"error\":\"bad input\"}");
    }
}