mod common;
use tempfile::TempDir;
fn stdout( out : &std::process::Output ) -> String
{
String::from_utf8_lossy( &out.stdout ).into_owned()
}
fn stderr( out : &std::process::Output ) -> String
{
String::from_utf8_lossy( &out.stderr ).into_owned()
}
fn assert_exit( out : &std::process::Output, code : i32 )
{
assert_eq!(
out.status.code().unwrap_or( -1 ),
code,
"expected exit {code}, got {:?}; stderr: {}",
out.status.code(),
stderr( out )
);
}
#[ test ]
fn ec_1_metadata_0_shows_content()
{
let root = TempDir::new().unwrap();
common::write_test_session_with_last_message(
root.path(),
"proj-meta",
"-default_topic",
2,
"hello world content",
);
let out = common::clg_cmd()
.env( "CLAUDE_STORAGE_ROOT", root.path() )
.arg( ".show" )
.arg( "session_id::-default_topic" )
.arg( "project::proj-meta" )
.arg( "show_metadata::0" )
.output()
.unwrap();
assert_exit( &out, 0 );
let output = stdout( &out );
assert!(
output.contains( "hello world content" ) || output.contains( "entry" ),
"EC-1: show_metadata::0 must show conversation content; got: {output}"
);
}
#[ test ]
fn ec_2_metadata_1_suppresses_content()
{
let root = TempDir::new().unwrap();
common::write_test_session_with_last_message(
root.path(),
"proj-meta2",
"-default_topic",
2,
"unique-sentinel-text-xyzabc",
);
let out = common::clg_cmd()
.env( "CLAUDE_STORAGE_ROOT", root.path() )
.arg( ".show" )
.arg( "session_id::-default_topic" )
.arg( "project::proj-meta2" )
.arg( "show_metadata::1" )
.output()
.unwrap();
assert_exit( &out, 0 );
let output = stdout( &out );
assert!(
!output.contains( "unique-sentinel-text-xyzabc" ),
"EC-2: show_metadata::1 must suppress conversation content; got: {output}"
);
}
#[ test ]
fn ec_3_metadata_true_accepted()
{
let out = common::clg_cmd()
.arg( ".show" )
.arg( "session_id::-default_topic" )
.arg( "show_metadata::true" )
.output()
.unwrap();
let err = stderr( &out );
assert!(
!err.contains( "Invalid boolean" ) && !err.contains( "Type Error" ),
"EC-3: show_metadata::true must not cause a type validation error; got: {err}"
);
}
#[ test ]
fn ec_4_metadata_omitted_defaults_to_content()
{
let root = TempDir::new().unwrap();
common::write_test_session_with_last_message(
root.path(),
"proj-meta4",
"-default_topic",
2,
"default content display",
);
let out = common::clg_cmd()
.env( "CLAUDE_STORAGE_ROOT", root.path() )
.arg( ".show" )
.arg( "session_id::-default_topic" )
.arg( "project::proj-meta4" )
.output()
.unwrap();
assert_exit( &out, 0 );
let output = stdout( &out );
assert!(
output.contains( "default content display" ) || output.contains( "entry" ),
"EC-4: omitted metadata must show content; got: {output}"
);
}
#[ test ]
fn ec_5_metadata_1_includes_entry_count()
{
let root = TempDir::new().unwrap();
common::write_test_session( root.path(), "proj-meta5", "-default_topic", 4 );
let out = common::clg_cmd()
.env( "CLAUDE_STORAGE_ROOT", root.path() )
.arg( ".show" )
.arg( "session_id::-default_topic" )
.arg( "project::proj-meta5" )
.arg( "show_metadata::1" )
.output()
.unwrap();
assert_exit( &out, 0 );
let output = stdout( &out );
assert!(
output.contains( '4' ) || output.contains( "entries" ) || output.contains( "count" ),
"EC-5: show_metadata::1 must show entry count; got: {output}"
);
}
#[ test ]
fn ec_6_metadata_1_includes_timestamps()
{
let root = TempDir::new().unwrap();
common::write_test_session( root.path(), "proj-meta6", "-default_topic", 4 );
let out = common::clg_cmd()
.env( "CLAUDE_STORAGE_ROOT", root.path() )
.arg( ".show" )
.arg( "session_id::-default_topic" )
.arg( "project::proj-meta6" )
.arg( "show_metadata::1" )
.output()
.unwrap();
assert_exit( &out, 0 );
let output = stdout( &out );
assert!(
output.contains( "2025" ) || output.contains( "timestamp" ) || output.contains( "first" ),
"EC-6: show_metadata::1 must show timestamp fields; got: {output}"
);
}