mod common;
#[ test ]
fn it_count_target_conversations()
{
use tempfile::TempDir;
let root = TempDir::new().unwrap();
let storage_root = root.path().join( ".claude" );
let project = root.path().join( "proj-count-t04" );
let encoded = common::write_path_project_session( &storage_root, &project, "sess-t04-a", 2 );
common::write_path_project_session( &storage_root, &project, "sess-t04-b", 2 );
let out = common::clg_cmd()
.env( "HOME", root.path().to_str().unwrap() )
.env( "CLAUDE_STORAGE_ROOT", storage_root.to_str().unwrap() )
.arg( ".count" )
.arg( "target::conversations" )
.arg( format!( "project::{encoded}" ) )
.output()
.unwrap();
assert!(
out.status.success(),
".count target::conversations must exit 0; stderr: {}",
String::from_utf8_lossy( &out.stderr ),
);
let s = String::from_utf8_lossy( &out.stdout ).trim().to_string();
assert!(
s.parse::< usize >().is_ok(),
"output must be a bare integer; got: '{s}'",
);
assert_eq!( s, "2", "expected 2 conversations (1:1 with sessions); got: '{s}'" );
}
#[ test ]
fn it_count_conversations_requires_project()
{
use tempfile::TempDir;
let root = TempDir::new().unwrap();
let out = common::clg_cmd()
.env( "HOME", root.path().to_str().unwrap() )
.arg( ".count" )
.arg( "target::conversations" )
.output()
.unwrap();
assert!(
!out.status.success(),
".count target::conversations without project:: must exit non-0; got: {:?}",
out.status.code(),
);
}
#[ test ]
fn it_count_one_conversation()
{
use tempfile::TempDir;
let root = TempDir::new().unwrap();
let storage_root = root.path().join( ".claude" );
let project = root.path().join( "proj-count-t06" );
let encoded = common::write_path_project_session( &storage_root, &project, "sess-t06-only", 2 );
let out = common::clg_cmd()
.env( "HOME", root.path().to_str().unwrap() )
.env( "CLAUDE_STORAGE_ROOT", storage_root.to_str().unwrap() )
.arg( ".count" )
.arg( "target::conversations" )
.arg( format!( "project::{encoded}" ) )
.output()
.unwrap();
assert!(
out.status.success(),
".count target::conversations must exit 0; stderr: {}",
String::from_utf8_lossy( &out.stderr ),
);
let s = String::from_utf8_lossy( &out.stdout ).trim().to_string();
assert_eq!( s, "1", "1 session → 1 conversation (1:1 identity mapping); got: '{s}'" );
}
#[ test ]
fn it_count_zero_conversations_empty_project()
{
use tempfile::TempDir;
let root = TempDir::new().unwrap();
let storage_root = root.path().join( ".claude" );
let project = root.path().join( "proj-count-t07-empty" );
let encoded = claude_storage_core::encode_path( &project )
.expect( "encode project path" );
let dir = storage_root.join( "projects" ).join( &encoded );
std::fs::create_dir_all( &dir ).unwrap();
let out = common::clg_cmd()
.env( "HOME", root.path().to_str().unwrap() )
.env( "CLAUDE_STORAGE_ROOT", storage_root.to_str().unwrap() )
.arg( ".count" )
.arg( "target::conversations" )
.arg( format!( "project::{encoded}" ) )
.output()
.unwrap();
assert!(
out.status.success(),
".count target::conversations on empty project must exit 0; stderr: {}",
String::from_utf8_lossy( &out.stderr ),
);
let s = String::from_utf8_lossy( &out.stdout ).trim().to_string();
assert_eq!( s, "0", "empty project → 0 conversations; got: '{s}'" );
}
#[ test ]
fn it_count_conversations_nonexistent_project_fails()
{
use tempfile::TempDir;
let root = TempDir::new().unwrap();
let storage_root = root.path().join( ".claude" );
let fake_project = root.path().join( "nonexistent-proj-t08" );
let encoded = claude_storage_core::encode_path( &fake_project )
.expect( "encode project path" );
let out = common::clg_cmd()
.env( "HOME", root.path().to_str().unwrap() )
.env( "CLAUDE_STORAGE_ROOT", storage_root.to_str().unwrap() )
.arg( ".count" )
.arg( "target::conversations" )
.arg( format!( "project::{encoded}" ) )
.output()
.unwrap();
assert!(
!out.status.success(),
".count target::conversations with nonexistent project must exit non-0; stdout: {}; stderr: {}",
String::from_utf8_lossy( &out.stdout ),
String::from_utf8_lossy( &out.stderr ),
);
}