use assert_cmd::{cargo_bin, Command};
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;
#[test]
fn test_basic_search_shows_complete_chain() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("add new")
.current_dir("tests/fixtures/rails-app")
.assert()
.success()
.stdout(predicate::str::contains("'add new'"))
.stdout(predicate::str::contains("search query"))
.stdout(predicate::str::contains("invoice.labels.add_new"))
.stdout(predicate::str::contains("en.yml"))
.stdout(predicate::str::contains("Key:"))
.stdout(predicate::str::contains("invoices.ts"))
.stdout(predicate::str::contains(":14)")) .stdout(predicate::str::contains("├─>").or(predicate::str::contains("└─>")));
}
#[test]
fn test_search_with_case_insensitive_default() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("Add New") .arg("--ignore-case") .current_dir("tests/fixtures/rails-app")
.assert()
.success()
.stdout(predicate::str::contains("add new"))
.stdout(predicate::str::contains("invoice.labels.add_new"));
}
#[test]
fn test_search_with_case_sensitive_flag() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.args(["add new", "--case-sensitive"])
.current_dir("tests/fixtures/rails-app")
.assert()
.success()
.stdout(predicate::str::contains("add new"));
}
#[test]
fn test_search_finds_yaml_translation_files() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("add new")
.current_dir("tests/fixtures/rails-app")
.assert()
.success()
.stdout(predicate::str::contains(".yml"));
}
#[test]
fn test_search_shows_full_key_path() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("add new")
.current_dir("tests/fixtures/rails-app")
.assert()
.success()
.stdout(predicate::str::contains("invoice.labels.add_new"));
}
#[test]
fn test_search_finds_code_references() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("add new")
.current_dir("tests/fixtures/rails-app")
.assert()
.success()
.stdout(predicate::str::contains("invoice_list.ts:"))
.stdout(predicate::str::contains("invoices.ts:"));
}
#[test]
fn test_search_performance_reasonable() {
let start = std::time::Instant::now();
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("add new")
.current_dir("tests/fixtures/rails-app")
.assert()
.success();
let duration = start.elapsed();
assert!(
duration.as_secs() < 5,
"Search took too long: {:?}",
duration
);
}
#[test]
fn test_no_matches_returns_success() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("nonexistent xyz abc 123")
.current_dir("tests/fixtures/rails-app")
.assert()
.success() .stdout(predicate::str::contains("No matches found"));
}
#[test]
fn test_search_with_special_characters() {
let temp_dir = TempDir::new().unwrap();
let yaml_path = temp_dir.path().join("config/locales");
fs::create_dir_all(&yaml_path).unwrap();
let yaml_file = yaml_path.join("en.yml");
fs::write(&yaml_file, "en:\n special: \"hello-world_test.123\"").unwrap();
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("hello-world_test.123")
.current_dir(temp_dir.path())
.assert()
.success()
.stdout(predicate::str::contains("special"));
}
#[test]
fn test_search_in_react_project() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("home")
.current_dir("tests/fixtures/react-app")
.assert()
.success();
}
#[test]
fn test_search_in_vue_project() {
let mut cmd = Command::new(cargo_bin!("cs"));
cmd.arg("welcome")
.current_dir("tests/fixtures/vue-app")
.assert()
.success();
}