hoard 0.6.1

Hoard backups of files across your filesystem into one location.
Documentation
mod common;

use tokio::{fs, io::AsyncWriteExt};

use crate::common::base::DefaultConfigTester;
use common::tester::Tester;
use hoard::command::Command;
use hoard::config::builder::{Builder, Error as BuilderError};

#[tokio::test]
async fn test_invalid_uuid() {
    let tester = DefaultConfigTester::with_log_level(tracing::Level::INFO).await;
    let uuid_path = tester.config_dir().join("uuid");
    let bad_content = "INVALID UUID";
    {
        let mut file = fs::File::create(&uuid_path)
            .await
            .expect("failed to create uuid file");
        file.write_all(bad_content.as_bytes())
            .await
            .expect("failed to write to uuid file");
    }

    tester
        .expect_command(Command::Backup { hoards: Vec::new() })
        .await;

    let content = fs::read_to_string(&uuid_path)
        .await
        .expect("failed to read uuid file");
    assert_ne!(content, bad_content);

    tester.assert_has_output("failed to parse uuid in file");
}

#[tokio::test]
async fn test_invalid_config_extensions() {
    let tester = Tester::new(common::base::BASE_CONFIG).await;
    let expected_output = "configuration file must have file extension \"";

    let path = tester.config_dir().join("config_file");
    {
        fs::File::create(&path)
            .await
            .expect("failed to create config_file");
    }
    let error = Builder::from_file(&path)
        .await
        .expect_err("config file without file extension should fail");
    assert!(matches!(error, BuilderError::InvalidExtension(bad_path) if path == bad_path));

    tester.assert_has_output(expected_output);
    tester.clear_output();

    let path = tester.config_dir().join("config_file.txt");
    {
        fs::File::create(&path)
            .await
            .expect("failed to create config_file.txt");
    }
    let error = Builder::from_file(&path)
        .await
        .expect_err("config file with bad file extension should fail");
    assert!(matches!(error, BuilderError::InvalidExtension(bad_path) if path == bad_path));

    tester.assert_has_output(expected_output);
}

#[tokio::test]
async fn test_missing_config_dir() {
    let tester = Tester::new(common::base::BASE_CONFIG).await;
    fs::remove_dir(tester.config_dir())
        .await
        .expect("failed to delete config dir");
    tester
        .run_command(Command::Backup { hoards: Vec::new() })
        .await
        .expect("running backup without config dir should not fail");
    tester.assert_not_has_output("error while saving uuid to file");
    tester.assert_not_has_output("No such file or directory");
}