@@ -328,4 +328,47 @@ mod tests {
328328 assert ! ( results[ 0 ] . success) ;
329329 assert ! ( results[ 1 ] . success) ;
330330 }
331+
332+ #[ tokio:: test]
333+ async fn test_execute_safe_outputs_empty_file_returns_empty ( ) {
334+ let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
335+ let safe_output_path = temp_dir. path ( ) . join ( SAFE_OUTPUT_FILENAME ) ;
336+ tokio:: fs:: write ( & safe_output_path, "" ) . await . unwrap ( ) ;
337+
338+ let ctx = ExecutionContext :: default ( ) ;
339+ let results = execute_safe_outputs ( temp_dir. path ( ) , & ctx) . await . unwrap ( ) ;
340+ assert ! ( results. is_empty( ) ) ;
341+ }
342+
343+ #[ tokio:: test]
344+ async fn test_execute_missing_data_succeeds ( ) {
345+ let entry = serde_json:: json!( { "name" : "missing-data" , "data_type" : "schema" , "reason" : "not available" } ) ;
346+ let ctx = ExecutionContext :: default ( ) ;
347+
348+ let result = execute_safe_output ( & entry, & ctx) . await ;
349+ assert ! ( result. is_ok( ) ) ;
350+ let ( tool_name, result) = result. unwrap ( ) ;
351+ assert_eq ! ( tool_name, "missing-data" ) ;
352+ assert ! ( result. success) ;
353+ }
354+
355+ #[ tokio:: test]
356+ async fn test_execute_safe_output_malformed_work_item_returns_err ( ) {
357+ // Missing required fields (title and description)
358+ let entry = serde_json:: json!( { "name" : "create-work-item" } ) ;
359+ let ctx = ExecutionContext :: default ( ) ;
360+
361+ let result = execute_safe_output ( & entry, & ctx) . await ;
362+ assert ! ( result. is_err( ) ) ;
363+ }
364+
365+ #[ tokio:: test]
366+ async fn test_execute_unknown_tool_error_contains_tool_name ( ) {
367+ let entry = serde_json:: json!( { "name" : "evil-backdoor" } ) ;
368+ let ctx = ExecutionContext :: default ( ) ;
369+
370+ let result = execute_safe_output ( & entry, & ctx) . await ;
371+ assert ! ( result. is_err( ) ) ;
372+ assert ! ( result. unwrap_err( ) . to_string( ) . contains( "evil-backdoor" ) ) ;
373+ }
331374}
0 commit comments