use super::{run_dir, temp_dir};
use std::fs;
#[test]
fn recursive_dir_collects_uppercase_variants_excludes_others() {
let dir = temp_dir();
let nested = dir.join("src");
fs::create_dir_all(&nested).unwrap();
fs::write(nested.join("lib.RS"), "fn a() {}\nfn b() { a(); }\n").unwrap();
fs::write(
dir.join("README.MD"),
"| Name | Value | Description |\n| --- | --- | --- |\n| a | 1 | first |\n| longname | 200 | second item |\n",
)
.unwrap();
fs::write(dir.join("notes.org"), "not allowed by default\n").unwrap();
let (_stdout, stderr, exit) = run_dir(&dir, &["--dry-run"]);
assert_eq!(exit, 1, "dry-run must fail for proposed Rust changes");
assert!(
stderr.contains("lib.RS"),
"recursion must collect and process lib.RS: {stderr}"
);
let (_stdout, md_stderr, md_exit) = run_dir(&dir, &["--include", "tables", "--dry-run"]);
assert_eq!(md_exit, 1, "dry-run must fail for proposed table changes");
assert!(
md_stderr.contains("README.MD") && md_stderr.contains("success[FIX]"),
"recursion must collect and process README.MD: {md_stderr}"
);
assert!(
!md_stderr.contains("notes.org") && !stderr.contains("notes.org"),
"notes.org must be excluded silently"
);
let _ = fs::remove_dir_all(&dir);
}
#[test]
fn recursive_directory_dry_run_should_label_each_move_with_path() {
let dir = temp_dir();
fs::create_dir(&dir).unwrap();
let file_a = dir.join("a.rs");
let file_b = dir.join("b.rs");
fs::write(&file_a, "fn a() {}\nfn b() { a(); }\n").unwrap();
fs::write(&file_b, "fn c() {}\nfn d() { c(); }\n").unwrap();
let (stdout, stderr, exit) = run_dir(&dir, &["--dry-run"]);
let _ = fs::remove_dir_all(&dir);
assert_eq!(exit, 1, "dry-run must fail for proposed directory changes");
assert!(stdout.is_empty(), "text dry-run must leave stdout empty");
assert!(
stderr.contains("a.rs:") && stderr.contains("b.rs:"),
"multi-file dry-run must label each change line with its path: {stderr}"
);
assert!(
stderr.contains("rearrange fn b from pos 2 to pos 1")
&& stderr.contains("rearrange fn d from pos 2 to pos 1"),
"directory dry-run should report each file's move on stderr: {stderr}"
);
}
#[test]
fn recursive_directory_error_should_still_reorder_valid_file() {
let dir = temp_dir();
fs::create_dir(&dir).unwrap();
let good = dir.join("good.rs");
let bad = dir.join("bad.rs");
fs::write(&good, "fn a() {}\nfn b() { a(); }\n").unwrap();
fs::write(&bad, "not valid rust {{{").unwrap();
let (_stdout, stderr, exit) = run_dir(&dir, &[]);
let actual_good = fs::read_to_string(&good).unwrap();
let _ = fs::remove_dir_all(&dir);
assert_ne!(exit, 0, "directory with invalid file should exit non-zero");
assert!(
!stderr.is_empty(),
"stderr should contain error message for invalid file"
);
let a_pos = actual_good.find("fn a").expect("fn a missing");
let b_pos = actual_good.find("fn b").expect("fn b missing");
assert!(
b_pos < a_pos,
"valid file should still be reordered despite sibling error"
);
}