yuru 0.1.8

A fast phonetic fuzzy finder for the shell
mod support;

use predicates::prelude::*;
use std::fs;
use std::path::MAIN_SEPARATOR;
use support::command;

#[test]
fn cli_empty_piped_stdin_does_not_fall_back_to_walker() {
    let dir = tempfile::tempdir().unwrap();
    fs::write(dir.path().join("match.txt"), "").unwrap();

    command()
        .current_dir(dir.path())
        .args(["--filter", "match"])
        .write_stdin("")
        .assert()
        .failure()
        .stdout(predicate::eq(""));
}
#[test]
fn cli_walks_files_when_explicit_walker_and_stdin_is_empty() {
    let dir = tempfile::tempdir().unwrap();
    fs::write(dir.path().join("alpha.txt"), "").unwrap();
    fs::create_dir(dir.path().join("nested")).unwrap();
    fs::write(dir.path().join("nested").join("beta.log"), "").unwrap();

    command()
        .current_dir(dir.path())
        .args(["--filter", "beta", "--walker", "file,follow,hidden"])
        .assert()
        .success()
        .stdout(predicate::eq(format!("nested{MAIN_SEPARATOR}beta.log\n")));
}
#[test]
fn cli_explicit_walker_ignores_invalid_fzf_default_command() {
    let dir = tempfile::tempdir().unwrap();
    fs::write(dir.path().join("alpha.txt"), "").unwrap();

    command()
        .current_dir(dir.path())
        .env(
            "FZF_DEFAULT_COMMAND",
            "fdfind --definitely-missing-yuru-test",
        )
        .args(["--filter", "alpha", "--walker", "file,follow,hidden"])
        .assert()
        .success()
        .stdout(predicate::eq("alpha.txt\n"));
}
#[test]
fn cli_walker_can_include_directories_and_skip_names() {
    let dir = tempfile::tempdir().unwrap();
    fs::create_dir(dir.path().join("keep")).unwrap();
    fs::create_dir(dir.path().join("node_modules")).unwrap();
    fs::write(dir.path().join("node_modules").join("dep.js"), "").unwrap();

    command()
        .current_dir(dir.path())
        .args([
            "--filter",
            "keep",
            "--walker",
            "file,dir",
            "--walker-skip",
            "node_modules",
        ])
        .assert()
        .success()
        .stdout(predicate::eq("keep\n"));
}
#[cfg(unix)]
#[test]
fn cli_walker_skips_broken_symlinks_when_following_links() {
    let dir = tempfile::tempdir().unwrap();
    fs::create_dir(dir.path().join(".config")).unwrap();
    std::os::unix::fs::symlink("missing", dir.path().join(".config").join("starship")).unwrap();
    fs::write(dir.path().join("alpha.txt"), "").unwrap();

    command()
        .current_dir(dir.path())
        .args(["--filter", "alpha", "--walker", "file,follow,hidden"])
        .assert()
        .success()
        .stdout(predicate::eq("alpha.txt\n"));
}
#[cfg(unix)]
#[test]
fn cli_walker_skips_symlink_loops_when_following_links() {
    let dir = tempfile::tempdir().unwrap();
    fs::create_dir_all(dir.path().join("loop").join("nested")).unwrap();
    std::os::unix::fs::symlink("..", dir.path().join("loop").join("nested").join("back")).unwrap();
    fs::write(dir.path().join("alpha.txt"), "").unwrap();

    command()
        .current_dir(dir.path())
        .args(["--filter", "alpha", "--walker", "file,follow,hidden"])
        .assert()
        .success()
        .stdout(predicate::eq("alpha.txt\n"));
}
#[test]
fn cli_walker_respects_gitignore() {
    let dir = tempfile::tempdir().unwrap();
    fs::write(dir.path().join(".gitignore"), "ignored.txt\n").unwrap();
    fs::write(dir.path().join("ignored.txt"), "").unwrap();

    command()
        .current_dir(dir.path())
        .args(["--filter", "ignored", "--walker", "file"])
        .assert()
        .failure()
        .stdout(predicate::eq(""));
}