From 29b9f6ecd227e52f5973503dfcf4e4f228a43d80 Mon Sep 17 00:00:00 2001 From: diogo464 Date: Sun, 11 Jul 2021 10:07:33 +0100 Subject: Added some tests to dotup_cli crate. --- Cargo.lock | 102 ++++++++++++++++++++++++++++++++++ dotup_cli/Cargo.toml | 5 ++ dotup_cli/tests/cli.rs | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 dotup_cli/tests/cli.rs diff --git a/Cargo.lock b/Cargo.lock index a44b60b..b01d611 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,20 @@ version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" +[[package]] +name = "assert_cmd" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20831bd004dda4c7c372c19cdabff369f794a95e955b3f13fe460e3e1ae95f" +dependencies = [ + "bstr", + "doc-comment", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "atty" version = "0.2.14" @@ -40,6 +54,17 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bstr" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -91,6 +116,18 @@ dependencies = [ "syn", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "dotup" version = "0.1.0" @@ -108,12 +145,20 @@ name = "dotup_cli" version = "0.1.0" dependencies = [ "anyhow", + "assert_cmd", "clap", "dotup", "flexi_logger", "log", + "tempfile", ] +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + [[package]] name = "flexi_logger" version = "0.18.0" @@ -181,6 +226,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "itertools" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" +dependencies = [ + "either", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -239,6 +293,33 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +[[package]] +name = "predicates" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6e46ca79eb4e21e2ec14430340c71250ab69332abf85521c95d3a8bc336aa76" +dependencies = [ + "difflib", + "itertools", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57e35a3326b75e49aa85f5dc6ec15b41108cf5aee58eabb1f274dd18b73c2451" + +[[package]] +name = "predicates-tree" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f553275e5721409451eb85e15fd9a860a6e5ab4496eb215987502b5f5391f2" +dependencies = [ + "predicates-core", + "treeline", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -341,6 +422,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + [[package]] name = "regex-syntax" version = "0.6.25" @@ -474,6 +561,12 @@ dependencies = [ "serde", ] +[[package]] +name = "treeline" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7f741b240f1a48843f9b8e0444fb55fb2a4ff67293b50a9179dfd5ea67f8d41" + [[package]] name = "unicode-segmentation" version = "1.8.0" @@ -504,6 +597,15 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" diff --git a/dotup_cli/Cargo.toml b/dotup_cli/Cargo.toml index 891d32a..cf92f9e 100644 --- a/dotup_cli/Cargo.toml +++ b/dotup_cli/Cargo.toml @@ -6,6 +6,7 @@ version = "0.1.0" [[bin]] name = "dotup" path = "src/main.rs" +doc = false [dependencies] anyhow = "*" @@ -18,3 +19,7 @@ path = "../dotup" [dependencies.flexi_logger] features = ["colors"] version = "*" + +[dev-dependencies] +tempfile = "3.2" +assert_cmd = "1.0" diff --git a/dotup_cli/tests/cli.rs b/dotup_cli/tests/cli.rs new file mode 100644 index 0000000..3b8d657 --- /dev/null +++ b/dotup_cli/tests/cli.rs @@ -0,0 +1,145 @@ +use assert_cmd::{assert::Assert, prelude::*}; +use dotup::ArchiveLink; +use std::{ + path::{Path, PathBuf}, + process::Command, +}; +use tempfile::TempDir; + +const DEPOT_FILE_NAME: &str = "depot.toml"; +const BIN_NAME: &str = "dotup"; + +fn create_empty_file(path: impl AsRef) { + let path = path.as_ref(); + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).unwrap(); + } + std::fs::write(path, "").unwrap(); +} + +fn prepare_command(dir: &TempDir) -> Command { + let mut cmd = Command::cargo_bin(BIN_NAME).unwrap(); + cmd.current_dir(dir.path()); + cmd +} + +fn run_command(dir: &TempDir, cmd: &str) -> Assert { + let mut c = prepare_command(dir); + c.current_dir(dir.path()); + c.args(cmd.split_whitespace()); + c.assert() +} + +fn prepare_dir() -> TempDir { + let dir = TempDir::new().unwrap(); + create_empty_file(dir.path().join("o1/file.txt")); + create_empty_file(dir.path().join("o1/dir/file.txt")); + create_empty_file(dir.path().join("o2/file1.txt")); + create_empty_file(dir.path().join("o2/file2.txt")); + dir +} + +#[test] +fn test_cli_init() { + let dir = prepare_dir(); + let assert = run_command(&dir, "init"); + + assert.success().code(0); + assert!(dir.path().join(DEPOT_FILE_NAME).is_file()); +} + +#[test] +fn test_cli_link() { + let dir = prepare_dir(); + run_command(&dir, "init").success(); + + let assert = run_command(&dir, "link o1 .config"); + assert.success().code(0); + + let assert = run_command(&dir, "link --directory o2 .scripts"); + assert.success().code(0); + + let archive = dotup::archive_read(dir.path().join(DEPOT_FILE_NAME)).unwrap(); + let link1 = ArchiveLink { + origin: PathBuf::from("o1/file.txt"), + destination: PathBuf::from(".config/file.txt"), + }; + let link2 = ArchiveLink { + origin: PathBuf::from("o1/dir/file.txt"), + destination: PathBuf::from(".config/dir/file.txt"), + }; + let link3 = ArchiveLink { + origin: PathBuf::from("o2"), + destination: PathBuf::from(".scripts"), + }; + + assert!(archive.links.contains(&link1)); + assert!(archive.links.contains(&link2)); + assert!(archive.links.contains(&link3)); +} + +#[test] +fn test_cli_install_uninstall_unlink() { + let dir = prepare_dir(); + run_command(&dir, "init").success(); + run_command(&dir, "link o1 .config").success(); + run_command(&dir, "link --directory o2 .scripts").success(); + + let install_dir = TempDir::new().unwrap(); + let install_base = format!("{}", install_dir.path().display()); + run_command( + &dir, + &format!("install --install-base {} o1 o2", install_base), + ) + .success(); + + assert_eq!( + std::fs::read_link(install_dir.path().join(".config/file.txt")).unwrap(), + dir.path().join("o1/file.txt") + ); + assert_eq!( + std::fs::read_link(install_dir.path().join(".config/dir/file.txt")).unwrap(), + dir.path().join("o1/dir/file.txt") + ); + assert_eq!( + std::fs::read_link(install_dir.path().join(".scripts")).unwrap(), + dir.path().join("o2") + ); + + run_command( + &dir, + &format!("uninstall --install-base {} o1/file.txt", install_base), + ) + .success(); + assert!(!install_dir.path().join(".config/file.txt").exists()); + assert!(install_dir.path().join(".config/dir/file.txt").exists()); + assert!(install_dir.path().join(".scripts").exists()); + + run_command( + &dir, + &format!("uninstall --install-base {} o1", install_base), + ) + .success(); + assert!(!install_dir.path().join(".config/file.txt").exists()); + assert!(!install_dir.path().join(".config/dir/file.txt").exists()); + assert!(install_dir.path().join(".scripts").exists()); + + assert_eq!( + 3, + dotup::archive_read(dir.path().join(DEPOT_FILE_NAME)) + .unwrap() + .links + .len() + ); + + run_command(&dir, &format!("unlink --uninstall {} o2", install_base)).success(); + assert!(!install_dir.path().join(".scripts").exists()); + + assert_eq!( + 2, + dotup::archive_read(dir.path().join(DEPOT_FILE_NAME)) + .unwrap() + .links + .len() + ); +} -- cgit