use anyhow::Result;
use std::process::Command;
use tempfile::tempdir;
#[test]
fn test_help_command() -> Result<()> {
let output = Command::new("cargo")
.args(["run", "--", "--help"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(stdout.contains("Generate code banks and calculate tokens for Rust dependencies"));
assert!(stdout.contains("Usage: depbank <COMMAND>"));
assert!(stdout.contains("Commands:"));
assert!(stdout.contains("generate"));
assert!(stdout.contains("tokens"));
assert!(stdout.contains("list"));
Ok(())
}
#[test]
fn test_list_command_with_fixture() -> Result<()> {
let output = Command::new("cargo")
.args(["run", "--", "list", "-p", "fixtures/simple_project"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(stdout.contains("Found"));
assert!(stdout.contains("Cargo.toml files"));
assert!(stdout.contains("anyhow"));
assert!(stdout.contains("serde"));
Ok(())
}
#[test]
fn test_list_detailed_command_with_fixture() -> Result<()> {
let output = Command::new("cargo")
.args(["run", "--", "list", "-p", "fixtures/simple_project", "-d"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(stdout.contains("anyhow"));
assert!(stdout.contains("serde"));
Ok(())
}
#[test]
fn test_tokens_command() -> Result<()> {
let temp_dir = tempdir()?;
let test_file_path = temp_dir.path().join("test_file.txt");
std::fs::write(&test_file_path, "This is a test file for token counting.")?;
let output = Command::new("cargo")
.args(["run", "--", "tokens", test_file_path.to_str().unwrap()])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(stdout.contains("tokens"));
assert!(stdout.contains("bytes"));
Ok(())
}
#[test]
fn test_generate_dry_run() -> Result<()> {
let output = Command::new("cargo")
.args([
"run",
"--",
"generate",
"-p",
"fixtures/simple_project",
"-d",
])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(stdout.contains("Analyzing project"));
Ok(())
}
#[test]
fn test_empty_project() -> Result<()> {
let output = Command::new("cargo")
.args(["run", "--", "list", "-p", "fixtures/empty_project"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(
stdout.contains("0") && (stdout.contains("dependencies") || stdout.contains("Cargo.toml"))
);
Ok(())
}
#[test]
fn test_complex_project() -> Result<()> {
let output = Command::new("cargo")
.args(["run", "--", "list", "-p", "fixtures/complex_project", "-d"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(stdout.contains("tokio"));
assert!(stdout.contains("log"));
Ok(())
}
#[test]
fn test_workspace_project() -> Result<()> {
let output = Command::new("cargo")
.args(["run", "--", "list", "-p", "fixtures/workspace_project"])
.output()?;
let stdout = String::from_utf8(output.stdout)?;
assert!(output.status.success());
assert!(stdout.contains("Found"));
assert!(stdout.contains("Cargo.toml files"));
assert!(stdout.contains("log") || stdout.contains("env_logger"));
Ok(())
}