spacehog 0.1.7

A simple utility for finding large files on your system.
Documentation
use std::io::Write;
use std::{fs::File, io::BufRead};

use assert_cmd::Command;
use tempfile::{tempdir, tempdir_in, TempDir};

#[test]
fn binary_with_version_flag_prints_version() {
    Command::cargo_bin("spacehog")
        .unwrap()
        .arg("--version")
        .assert()
        .success()
        .stdout(predicates::str::contains(env!("CARGO_PKG_VERSION")));
}

#[test]
fn binary_with_help_flag_prints_description() {
    Command::cargo_bin("spacehog")
        .unwrap()
        .arg("--help")
        .assert()
        .success()
        .stdout(predicates::str::contains(env!("CARGO_PKG_DESCRIPTION")));
}

#[test]
fn binary_with_help_flag_prints_usage() {
    Command::cargo_bin("spacehog")
        .unwrap()
        .arg("--help")
        .assert()
        .success()
        .stdout(predicates::str::contains("Usage: spacehog"));
}

#[test]
fn binary_with_no_args_prints_top_5_largest_files_under_working_directory() {
    Command::cargo_bin("spacehog")
        .unwrap()
        .assert()
        .success()
        .stdout(predicates::str::contains("*** Top 5 largest files ***"));
}

#[test]
fn binary_with_path_arg_prints_the_top_n_largest_files_under_the_given_path() {
    let output = Command::cargo_bin("spacehog")
        .unwrap()
        .arg("./testdata")
        .assert()
        .success()
        .get_output()
        .clone();
    let lines: Vec<String> = output.stdout.lines().map_while(Result::ok).collect();
    assert!(lines[0].contains("*** Top 4 largest files ***"));
    assert!(lines[1].ends_with("world.txt"));
    assert!(lines[2].ends_with("mundo.txt"));
    assert!(lines[3].ends_with("hello.txt"));
    assert!(lines[4].ends_with("hola.txt"));
}

#[test]
fn binary_with_the_number_arg_prints_the_top_n_largest_files_under_the_current_working_directory() {
    Command::cargo_bin("spacehog")
        .unwrap()
        .args(["-n", "10"])
        .assert()
        .success()
        .stdout(predicates::str::contains("*** Top 10 largest files ***"));
}

#[test]
fn binary_reports_that_the_directory_is_empty_if_it_contains_zero_files() {
    let dir = TempDir::new().expect("failed to create temporary directory");
    Command::cargo_bin("spacehog")
        .unwrap()
        .arg(dir.path())
        .assert()
        .success()
        .stdout(predicates::str::contains("No files found."));
}

#[test]
fn binary_ignores_hidden_files_and_directories_by_default() {
    use std::io::Write;
    let parent_dir = tempdir().expect("failed to create temporary directory");
    let hidden_dir = tempdir_in(parent_dir.path()).expect("failed to create temporary directory");
    let temp_file_path = hidden_dir.path().join("test.txt");
    let mut temp_file = File::create(temp_file_path).expect("failed to create temporary file");
    write!(temp_file, "hello test").unwrap();

    Command::cargo_bin("spacehog")
        .unwrap()
        .arg(parent_dir.path())
        .assert()
        .success()
        .stdout(predicates::str::contains("No files found."));
}

#[test]
fn binary_includes_hidden_files_and_directories_when_given_hidden_flag() {
    let parent_dir = tempdir().expect("failed to create temporary directory");
    let hidden_dir = tempdir_in(parent_dir.path()).expect("failed to create temporary directory");
    let temp_file_path = hidden_dir.path().join("test.txt");
    let mut temp_file = File::create(temp_file_path).expect("failed to create temporary file");
    write!(temp_file, "hello test").unwrap();

    Command::cargo_bin("spacehog")
        .unwrap()
        .arg(parent_dir.path())
        .arg("--hidden")
        .assert()
        .success()
        .stdout(predicates::str::contains("*** Top 1 largest files ***"));
}

#[test]
fn binary_with_invalid_path_arg_prints_an_error_message_and_exits_with_failure_code() {
    #[cfg(windows)]
    let want = "The system cannot find the path specified";
    #[cfg(not(windows))]
    let want = "No such file or directory";
    Command::cargo_bin("spacehog")
        .unwrap()
        .arg("nonexistent")
        .assert()
        .failure()
        .stderr(predicates::str::contains(want));
}