uklid 0.2.0

Interactively delete node_modules.
Documentation
use expectrl::{spawn, ControlCode, Error, Regex};
use std::fs;
use std::fs::create_dir_all;
use std::path::PathBuf;
use std::time::Duration;

use uklid::get_home_dir;

#[test]
fn interactive_cli() -> Result<(), Error> {
    /* Create a new temporary directory */
    let temp = assert_fs::TempDir::new().unwrap();
    /* Create a node_modules with an empty package.json in it */
    let node_modules_path_str: PathBuf = [temp.to_str().unwrap(), "node_modules"].iter().collect();
    let node_modules_file_path_str: PathBuf =
        [node_modules_path_str.to_str().unwrap(), "package.json"]
            .iter()
            .collect();

    if let Err(_e) = create_dir_all(&node_modules_path_str) {
        panic!("Error creating tests node_modules directory: {_e}")
    }

    /* Assert that the tests node_modules directory exists */
    assert!(&node_modules_path_str.as_path().exists());

    let temp_path = temp.to_str().unwrap().to_owned();

    /* Add some data to the package.json file */
    let data = "hello";

    if let Err(_e) = fs::write(&node_modules_file_path_str, data) {
        panic!("Error writing to temp file: {_e}");
    };

    let _home_dir = get_home_dir();

    /* Spawn interactive CLI */
    let mut p = spawn("./target/debug/uklid").unwrap();
    p.set_expect_timeout(Some(Duration::from_secs(1)));
    let prompt = &format!("Where should I start searching? [{_home_dir}]");
    p.expect(prompt).unwrap();
    p.send_line(&temp_path)?;
    p.expect(Regex(
        "Found 1 node_module folders with a total size of \\d",
    ))?;
    p.expect(Regex("Choose which node_modules to delete:"))?;
    p.expect(Regex(format!(".*\\[ \\].*{temp_path}/node_modules.*")))?;
    p.send_control(ControlCode::CarriageReturn)?;
    p.expect("No node_modules selected. Aborting...")?;

    assert!(&node_modules_path_str.as_path().exists());

    let mut p = spawn("./target/debug/uklid").unwrap();
    p.set_expect_timeout(Some(Duration::from_secs(1)));
    let prompt = &format!("Where should I start searching? [{_home_dir}]");
    p.expect(prompt).unwrap();
    p.send_line(&temp_path)?;
    p.expect(Regex(
        "Found 1 node_module folders with a total size of \\d",
    ))?;
    p.expect(Regex("Choose which node_modules to delete:"))?;
    p.expect(Regex(format!(".*\\[ \\].*{temp_path}/node_modules.*")))?;
    p.send_control(ControlCode::Space)?;
    p.expect("> [x]")?;
    p.send_control(ControlCode::CarriageReturn)?;
    p.expect("The following node_modules will be deleted:")?;
    p.expect(Regex(format!(".*{temp_path}/node_modules.*")))?;
    p.expect("Continue?  [y/n]")?;
    p.send("y")?;
    p.expect(Regex("Freed .* bytes".to_string()))?;

    temp.close().unwrap();
    Ok(())
}