use cqlite_cli::test_infrastructure::*;
#[tokio::test]
async fn test_invalid_command_error_handling() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
runner.run(&["nonexistent_command"])?
.assert_failure()?
.stderr_contains("error")?;
Ok(())
}
#[tokio::test]
async fn test_missing_required_arguments() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
runner.run(&["read-sstable"])?
.assert_failure()?
.stderr_contains("required")?;
runner.run(&["select"])?
.assert_failure()?
.stderr_contains("required")?;
Ok(())
}
#[tokio::test]
async fn test_invalid_file_paths() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
runner.run(&[
"read-sstable",
"/non/existent/sstable/path",
"--schema",
"/non/existent/schema/path",
])?.assert_failure()?;
runner.run(&[
"info",
"/non/existent/file",
])?.assert_failure()?;
Ok(())
}
#[tokio::test]
async fn test_invalid_command_line_options() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
runner.run(&["--format", "invalid_format", "--help"])?
.assert_failure()?
.stderr_contains("invalid")?;
runner.run(&["read-sstable", "dummy", "--schema", "dummy", "--limit", "not_a_number"])?
.assert_failure()?;
Ok(())
}
#[tokio::test]
async fn test_configuration_file_errors() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
runner.run(&[
"--config",
"/non/existent/config.toml",
"--help",
])?.assert_failure()?;
let invalid_config_path = env.temp_dir.join("invalid_config.toml");
std::fs::write(&invalid_config_path, "invalid toml content [")?;
runner.run(&[
"--config",
invalid_config_path.to_str().unwrap(),
"--help",
])?.assert_failure()?;
Ok(())
}
#[tokio::test]
async fn test_schema_validation_errors() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
let invalid_schema_path = env.fixtures_dir.join("invalid_schema.json");
std::fs::write(&invalid_schema_path, "invalid json content")?;
let dummy_sstable_path = env.fixtures_dir.join("dummy.sstable");
std::fs::write(&dummy_sstable_path, "dummy content")?;
runner.run(&[
"read-sstable",
dummy_sstable_path.to_str().unwrap(),
"--schema",
invalid_schema_path.to_str().unwrap(),
])?.assert_failure()?;
Ok(())
}
#[tokio::test]
async fn test_memory_limit_errors() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
let dummy_sstable_path = env.fixtures_dir.join("dummy.sstable");
let dummy_schema_path = env.fixtures_dir.join("dummy_schema.json");
std::fs::write(&dummy_sstable_path, "dummy content")?;
std::fs::write(&dummy_schema_path, r#"{"tables": []}"#)?;
runner.run(&[
"read-sstable",
dummy_sstable_path.to_str().unwrap(),
"--schema",
dummy_schema_path.to_str().unwrap(),
"--max-memory-mb", "1",
])?.assert_failure()?;
Ok(())
}
#[tokio::test]
async fn test_concurrent_access_error_handling() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
let dummy_sstable_path = env.fixtures_dir.join("concurrent_test.sstable");
let dummy_schema_path = env.fixtures_dir.join("concurrent_schema.json");
std::fs::write(&dummy_sstable_path, "test content")?;
std::fs::write(&dummy_schema_path, r#"{"tables": []}"#)?;
for _ in 0..3 {
let _result = runner.run(&[
"info",
dummy_sstable_path.to_str().unwrap(),
]);
}
Ok(())
}
#[tokio::test]
async fn test_timeout_error_handling() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
let dummy_sstable_path = env.fixtures_dir.join("timeout_test.sstable");
let dummy_schema_path = env.fixtures_dir.join("timeout_schema.json");
std::fs::write(&dummy_sstable_path, "test content for timeout")?;
std::fs::write(&dummy_schema_path, r#"{"tables": []}"#)?;
let result = runner.run(&[
"read-sstable",
dummy_sstable_path.to_str().unwrap(),
"--schema",
dummy_schema_path.to_str().unwrap(),
]);
match result {
Ok(_) => assert!(true), Err(_) => assert!(true), }
Ok(())
}
#[tokio::test]
async fn test_resource_exhaustion_handling() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
let large_dummy_path = env.fixtures_dir.join("large_test.sstable");
let large_content = "x".repeat(1000); std::fs::write(&large_dummy_path, large_content)?;
let dummy_schema_path = env.fixtures_dir.join("large_schema.json");
std::fs::write(&dummy_schema_path, r#"{"tables": []}"#)?;
let result = runner.run(&[
"read-sstable",
large_dummy_path.to_str().unwrap(),
"--schema",
dummy_schema_path.to_str().unwrap(),
"--max-memory-mb", "1",
"--buffer-size", "64",
]);
match result {
Ok(_) => assert!(true), Err(_) => assert!(true), }
Ok(())
}
#[tokio::test]
async fn test_malformed_query_error_handling() -> TestResult<()> {
test_container!(container);
let runner = CliTestRunner::new(container);
let env = container.environment();
let dummy_sstable_path = env.fixtures_dir.join("query_test.sstable");
let dummy_schema_path = env.fixtures_dir.join("query_schema.json");
std::fs::write(&dummy_sstable_path, "test content")?;
std::fs::write(&dummy_schema_path, r#"{"tables": [{"name": "test", "columns": []}]}"#)?;
runner.run(&[
"select",
dummy_sstable_path.to_str().unwrap(),
"--schema",
dummy_schema_path.to_str().unwrap(),
"INVALID SQL QUERY SYNTAX",
])?.assert_failure()?;
runner.run(&[
"select",
dummy_sstable_path.to_str().unwrap(),
"--schema",
dummy_schema_path.to_str().unwrap(),
"SELECT * FROM nonexistent_table",
])?.assert_failure()?;
Ok(())
}