use serde_json::Value;
#[test]
fn test_traverse_stream_flag_parsing() {
let args = ["traverse", "collection", "123", "--stream"];
assert!(args.contains(&"--stream"));
}
#[test]
fn test_traverse_stream_ndjson_format() {
let output_lines = vec![
r#"{"event":"node","id":1,"depth":0,"path":[1]}"#,
r#"{"event":"node","id":2,"depth":1,"path":[1,2]}"#,
r#"{"event":"node","id":3,"depth":1,"path":[1,3]}"#,
r#"{"event":"done","total_nodes":3,"max_depth":1,"elapsed_ms":5}"#,
];
for line in &output_lines {
let parsed: Result<Value, _> = serde_json::from_str(line);
assert!(parsed.is_ok(), "Line should be valid JSON: {line}");
}
}
#[test]
fn test_stream_node_event_structure() {
let event = r#"{"event":"node","id":42,"depth":2,"path":[1,5,42]}"#;
let parsed: Value = serde_json::from_str(event).expect("valid JSON");
assert_eq!(parsed["event"], "node");
assert_eq!(parsed["id"], 42);
assert_eq!(parsed["depth"], 2);
assert!(parsed["path"].is_array());
}
#[test]
fn test_stream_done_event_structure() {
let event = r#"{"event":"done","total_nodes":100,"max_depth":5,"elapsed_ms":150}"#;
let parsed: Value = serde_json::from_str(event).expect("valid JSON");
assert_eq!(parsed["event"], "done");
assert_eq!(parsed["total_nodes"], 100);
assert_eq!(parsed["max_depth"], 5);
assert!(parsed["elapsed_ms"].is_number());
}
#[test]
fn test_traverse_stream_bfs_dfs_compat() {
let strategies = ["bfs", "dfs"];
for strategy in strategies {
assert!(
strategy == "bfs" || strategy == "dfs",
"Strategy {strategy} should support streaming"
);
}
}
#[test]
fn test_stream_error_event_structure() {
let event = r#"{"event":"error","message":"Collection 'unknown' not found"}"#;
let parsed: Value = serde_json::from_str(event).expect("valid JSON");
assert_eq!(parsed["event"], "error");
assert!(parsed["message"].is_string());
}
#[test]
fn test_stream_empty_graph() {
let output_lines = [r#"{"event":"done","total_nodes":0,"max_depth":0,"elapsed_ms":1}"#];
let parsed: Value = serde_json::from_str(output_lines[0]).expect("valid JSON");
assert_eq!(parsed["event"], "done");
assert_eq!(parsed["total_nodes"], 0);
}
#[test]
fn test_stream_respects_depth_limit() {
let output_lines = vec![
r#"{"event":"node","id":1,"depth":0,"path":[1]}"#,
r#"{"event":"node","id":2,"depth":1,"path":[1,2]}"#,
r#"{"event":"node","id":3,"depth":2,"path":[1,2,3]}"#,
r#"{"event":"done","total_nodes":3,"max_depth":2,"elapsed_ms":10}"#,
];
for line in &output_lines {
let parsed: Value = serde_json::from_str(line).expect("valid JSON");
if parsed["event"] == "node" {
let depth = parsed["depth"].as_u64().unwrap_or(0);
assert!(depth <= 2, "Depth should respect limit");
}
}
}