mod common;
use assert_cmd::prelude::*;
use common::dircat_cmd; use predicates::prelude::*;
use std::fs;
use std::io::Write;
use tempfile::tempdir;
#[test]
fn test_respects_gitignore_by_default() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let gitignore_path = temp.path().join(".gitignore");
let git_dir = temp.path().join(".git"); let target_dir = temp.path().join("target");
fs::create_dir_all(&git_dir)?; fs::create_dir_all(&target_dir)?;
let mut file = fs::File::create(gitignore_path)?;
let gitignore_content = "target/\n*.log\n";
write!(file, "{}", gitignore_content)?;
drop(file);
let src_content = "Source";
let obj_content = "Object";
let log_content = "Log";
fs::write(temp.path().join("src.rs"), src_content)?;
fs::write(target_dir.join("debug.o"), obj_content)?;
fs::write(temp.path().join("app.log"), log_content)?;
dircat_cmd()
.current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: src.rs")) .stdout(predicate::str::contains(src_content)) .stdout(predicate::str::contains("## File: target/debug.o").not()) .stdout(predicate::str::contains(obj_content).not()) .stdout(predicate::str::contains("## File: app.log").not()) .stdout(predicate::str::contains(log_content).not()) .stdout(predicate::str::contains("## File: .gitignore").not())
.stdout(predicate::str::contains("## File: .git").not());
temp.close()?;
Ok(())
}
#[test]
fn test_no_gitignore_flag() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let gitignore_path = temp.path().join(".gitignore");
let git_dir = temp.path().join(".git"); let target_dir = temp.path().join("target");
fs::create_dir_all(&git_dir)?; fs::create_dir_all(&target_dir)?;
let mut file = fs::File::create(gitignore_path)?;
let gitignore_content = "target/\n*.log\n";
write!(file, "{}", gitignore_content)?;
drop(file);
let src_content = "Source";
let obj_content = "Object";
let log_content = "Log";
fs::write(temp.path().join("src.rs"), src_content)?;
fs::write(target_dir.join("debug.o"), obj_content)?;
fs::write(temp.path().join("app.log"), log_content)?;
fs::write(temp.path().join(".gitignore"), gitignore_content)?;
dircat_cmd()
.arg("-t") .current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: src.rs")) .stdout(predicate::str::contains(src_content)) .stdout(predicate::str::contains("## File: target/debug.o")) .stdout(predicate::str::contains(obj_content)) .stdout(predicate::str::contains("## File: app.log")) .stdout(predicate::str::contains(log_content)) .stdout(predicate::str::contains("## File: .gitignore")) .stdout(predicate::str::contains(gitignore_content));
temp.close()?;
Ok(())
}
#[test]
fn test_respects_hidden_files_by_default() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let hidden_content = "Hidden";
let visible_content = "Visible";
fs::write(temp.path().join(".hidden.txt"), hidden_content)?;
fs::write(temp.path().join("visible.txt"), visible_content)?;
dircat_cmd()
.current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: visible.txt")) .stdout(predicate::str::contains(visible_content)) .stdout(predicate::str::contains("## File: .hidden.txt").not()) .stdout(predicate::str::contains(hidden_content).not());
temp.close()?;
Ok(())
}
#[test]
fn test_no_gitignore_includes_hidden_files() -> Result<(), Box<dyn std::error::Error>> {
let temp = tempdir()?;
let hidden_content = "Hidden";
let visible_content = "Visible";
fs::write(temp.path().join(".hidden.txt"), hidden_content)?;
fs::write(temp.path().join("visible.txt"), visible_content)?;
dircat_cmd()
.arg("-t") .current_dir(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("## File: visible.txt")) .stdout(predicate::str::contains(visible_content)) .stdout(predicate::str::contains("## File: .hidden.txt")) .stdout(predicate::str::contains(hidden_content));
temp.close()?;
Ok(())
}