#[test]
fn repl_exits_with_nonzero_on_command_failure()
{
let output = std::process::Command::new( "cargo" )
.args( [ "run", "--quiet", "--release" ] )
.stdin( std::process::Stdio::piped() )
.current_dir( env!( "CARGO_MANIFEST_DIR" ) )
.stdout( std::process::Stdio::piped() )
.stderr( std::process::Stdio::piped() )
.spawn()
.expect( "Failed to spawn genfile process" );
use std::io::Write;
output.stdin
.as_ref()
.unwrap()
.write_all( b".file.add path::\"test.txt\" content::\"Should fail - no archive\"\nexit\n" )
.expect( "Failed to write to stdin" );
let result = output.wait_with_output().expect( "Failed to wait for process" );
assert!(
!result.status.success(),
"REPL should exit with non-zero code when commands fail. \
Exit code: {:?}, stderr: {}",
result.status.code(),
String::from_utf8_lossy( &result.stderr )
);
let stderr = String::from_utf8_lossy( &result.stderr );
assert!(
stderr.contains( "No archive loaded" ) || stderr.contains( "ERROR" ),
"Error message should be present in stderr: {stderr}"
);
}
#[test]
fn repl_exits_with_zero_on_all_commands_successful()
{
use std::io::Write;
let output = std::process::Command::new( "cargo" )
.args( [ "run", "--quiet", "--release" ] )
.stdin( std::process::Stdio::piped() )
.current_dir( env!( "CARGO_MANIFEST_DIR" ) )
.stdout( std::process::Stdio::piped() )
.stderr( std::process::Stdio::piped() )
.spawn()
.expect( "Failed to spawn genfile process" );
output.stdin
.as_ref()
.unwrap()
.write_all(
b".archive.new name::\"test\" description::\"Test\"\n\
.file.add path::\"readme.txt\" content::\"Hello\"\n\
exit\n"
)
.expect( "Failed to write to stdin" );
let result = output.wait_with_output().expect( "Failed to wait for process" );
assert!(
result.status.success(),
"REPL should exit with code 0 when all commands succeed. \
Exit code: {:?}, stderr: {}",
result.status.code(),
String::from_utf8_lossy( &result.stderr )
);
}
#[test]
fn repl_exits_with_nonzero_when_any_command_fails()
{
use std::io::Write;
let output = std::process::Command::new( "cargo" )
.args( [ "run", "--quiet", "--release" ] )
.stdin( std::process::Stdio::piped() )
.current_dir( env!( "CARGO_MANIFEST_DIR" ) )
.stdout( std::process::Stdio::piped() )
.stderr( std::process::Stdio::piped() )
.spawn()
.expect( "Failed to spawn genfile process" );
output.stdin
.as_ref()
.unwrap()
.write_all(
b".archive.new name::\"test\" description::\"Test\"\n\
.file.add path::\"readme.txt\" content::\"Hello\"\n\
.file.add path::\"\" content::\"Should fail - empty path\"\n\
exit\n"
)
.expect( "Failed to write to stdin" );
let result = output.wait_with_output().expect( "Failed to wait for process" );
assert!(
!result.status.success(),
"REPL should exit with non-zero when any command fails. \
Exit code: {:?}, stderr: {}",
result.status.code(),
String::from_utf8_lossy( &result.stderr )
);
}
#[test]
fn test_repl_starts_on_no_arguments()
{
use std::io::Write;
let child = std::process::Command::new( "cargo" )
.args( [ "run", "--quiet", "--release" ] )
.stdin( std::process::Stdio::piped() )
.current_dir( env!( "CARGO_MANIFEST_DIR" ) )
.stdout( std::process::Stdio::piped() )
.stderr( std::process::Stdio::piped() )
.spawn()
.expect( "Failed to spawn genfile process" );
child.stdin
.as_ref()
.unwrap()
.write_all( b"exit\n" )
.expect( "Failed to write to stdin" );
let result = child.wait_with_output().expect( "Failed to wait for process" );
assert!(
result.status.success(),
"REPL with only 'exit' command should succeed. \
Exit code: {:?}, stderr: {}",
result.status.code(),
String::from_utf8_lossy( &result.stderr )
);
}
#[test]
fn test_archive_state_persists_across_commands()
{
use std::io::Write;
let child = std::process::Command::new( "cargo" )
.args( [ "run", "--quiet", "--release" ] )
.stdin( std::process::Stdio::piped() )
.current_dir( env!( "CARGO_MANIFEST_DIR" ) )
.stdout( std::process::Stdio::piped() )
.stderr( std::process::Stdio::piped() )
.spawn()
.expect( "Failed to spawn genfile process" );
child.stdin
.as_ref()
.unwrap()
.write_all(
b".archive.new name::state-test\n\
.file.add path::x.txt content::hello\n\
.file.list\n\
exit\n"
)
.expect( "Failed to write to stdin" );
let result = child.wait_with_output().expect( "Failed to wait for process" );
let stdout = String::from_utf8_lossy( &result.stdout );
assert!(
result.status.success(),
"REPL state persistence test should succeed. stdout: {stdout}, stderr: {}",
String::from_utf8_lossy( &result.stderr )
);
assert!(
stdout.contains( "x.txt" ),
"file.list should show file added earlier in same session. stdout: {stdout}"
);
}