diff --git a/src/server/handlers.rs b/src/server/handlers.rs index 08fa22b..1da4763 100644 --- a/src/server/handlers.rs +++ b/src/server/handlers.rs @@ -447,13 +447,20 @@ struct DetailQuery { async fn trace( State(state): State, Query(query): Query, -) -> Result { +) -> Json { let store = state.store(); let matches = store.search_nodes(&query.from); let graph = state.graph(); if matches.is_empty() { - return Err(StatusCode::NOT_FOUND); + return Json(serde_json::json!({ + "target": null, + "callers": [], + "callees": [], + "caller_count": 0, + "callee_count": 0, + "truncated": false, + })); } let (start_idx, _) = &matches[0]; @@ -475,7 +482,7 @@ async fn trace( "truncated": visited >= max_nodes, }); - Ok(Json(result)) + Json(result) } async fn execute_query( diff --git a/tests/serve_api.rs b/tests/serve_api.rs index 2b55936..70dba74 100644 --- a/tests/serve_api.rs +++ b/tests/serve_api.rs @@ -201,4 +201,24 @@ mod tests { let json: serde_json::Value = serde_json::from_str(&body).unwrap(); assert_eq!(json["total"], 0); } + + #[test] + fn test_serve_trace_empty_match_returns_200() { + let port = 19883; + let mut child = start_server(port); + + let (status, body) = get( + port, + "/api/v1/trace?from=nonexistent_symbol_xyz_123", + ); + stop_server(&mut child); + + assert_eq!(status, 200); + let json: serde_json::Value = serde_json::from_str(&body).unwrap(); + assert!(json["target"].is_null()); + assert_eq!(json["callers"], serde_json::json!([])); + assert_eq!(json["callees"], serde_json::json!([])); + assert_eq!(json["caller_count"], 0); + assert_eq!(json["callee_count"], 0); + } }