11use tracing:: metadata:: LevelFilter ;
22use tracing_subscriber:: { reload, EnvFilter } ;
33
4- use crate :: trace_util:: { get_log_directives, set_log_level, ReloadHandle } ;
4+ use crate :: trace_util:: { get_log_directives, rename_error_to_message , set_log_level, ReloadHandle } ;
55
66#[ test]
77fn log_level_directive_updates ( ) {
@@ -16,3 +16,57 @@ fn log_level_directive_updates() {
1616 let directives = get_log_directives ( & reload_handle) . unwrap ( ) ;
1717 assert_eq ! ( directives, "b=debug,a=info,info" ) ;
1818}
19+
20+ #[ test]
21+ fn rename_error_to_message_renames_error_key ( ) {
22+ let input = br#"{"level":"ERROR","error":"something failed","file":"test.rs"}"# ;
23+ let output = rename_error_to_message ( input) . unwrap ( ) ;
24+ let output_str = String :: from_utf8 ( output) . unwrap ( ) ;
25+
26+ assert ! ( output_str. contains( r#""message":"something failed""# ) , "got: {output_str}" ) ;
27+ assert ! ( !output_str. contains( r#""error""# ) , "got: {output_str}" ) ;
28+ }
29+
30+ #[ test]
31+ fn rename_error_to_message_preserves_other_fields ( ) {
32+ let input = br#"{"level":"INFO","status":"ok","count":42}"# ;
33+ let output = rename_error_to_message ( input) . unwrap ( ) ;
34+ let output_str = String :: from_utf8 ( output) . unwrap ( ) ;
35+
36+ assert ! ( output_str. contains( r#""level":"INFO""# ) , "got: {output_str}" ) ;
37+ assert ! ( output_str. contains( r#""status":"ok""# ) , "got: {output_str}" ) ;
38+ assert ! ( output_str. contains( r#""count":42"# ) , "got: {output_str}" ) ;
39+ }
40+
41+ #[ test]
42+ fn rename_error_to_message_returns_none_for_invalid_json ( ) {
43+ let input = b"not valid json" ;
44+ assert ! ( rename_error_to_message( input) . is_none( ) ) ;
45+ }
46+
47+ #[ test]
48+ fn rename_error_to_message_only_renames_root_level_error ( ) {
49+ // Nested "error" fields should NOT be renamed - only root level
50+ let input = br#"{"error":"root error","nested":{"error":"nested error"}}"# ;
51+ let output = rename_error_to_message ( input) . unwrap ( ) ;
52+ let parsed: serde_json:: Value = serde_json:: from_slice ( & output) . unwrap ( ) ;
53+
54+ // Root "error" should be renamed to "message"
55+ assert_eq ! ( parsed[ "message" ] , "root error" ) ;
56+ assert ! ( parsed. get( "error" ) . is_none( ) , "root 'error' should be removed" ) ;
57+
58+ // Nested "error" should remain unchanged
59+ assert_eq ! ( parsed[ "nested" ] [ "error" ] , "nested error" ) ;
60+ }
61+
62+ #[ test]
63+ fn rename_error_to_message_preserves_existing_message_field ( ) {
64+ // If both "error" and "message" exist, leave the object unchanged
65+ let input = br#"{"error":"the error","message":"original message"}"# ;
66+ let output = rename_error_to_message ( input) . unwrap ( ) ;
67+ let parsed: serde_json:: Value = serde_json:: from_slice ( & output) . unwrap ( ) ;
68+
69+ // Both fields should remain unchanged
70+ assert_eq ! ( parsed[ "message" ] , "original message" ) ;
71+ assert_eq ! ( parsed[ "error" ] , "the error" ) ;
72+ }
0 commit comments