aboutsummaryrefslogtreecommitdiff
path: root/dotup_cli
diff options
context:
space:
mode:
authordiogo464 <[email protected]>2021-07-11 10:07:33 +0100
committerdiogo464 <[email protected]>2021-07-11 10:07:33 +0100
commit29b9f6ecd227e52f5973503dfcf4e4f228a43d80 (patch)
tree2047469b2f00afea666a7a3d1e25ea3a8fbf0c10 /dotup_cli
parentfcc5fbe564ee74e5f8434349424cbc4c646597df (diff)
Added some tests to dotup_cli crate.
Diffstat (limited to 'dotup_cli')
-rw-r--r--dotup_cli/Cargo.toml5
-rw-r--r--dotup_cli/tests/cli.rs145
2 files changed, 150 insertions, 0 deletions
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"
6[[bin]] 6[[bin]]
7name = "dotup" 7name = "dotup"
8path = "src/main.rs" 8path = "src/main.rs"
9doc = false
9 10
10[dependencies] 11[dependencies]
11anyhow = "*" 12anyhow = "*"
@@ -18,3 +19,7 @@ path = "../dotup"
18[dependencies.flexi_logger] 19[dependencies.flexi_logger]
19features = ["colors"] 20features = ["colors"]
20version = "*" 21version = "*"
22
23[dev-dependencies]
24tempfile = "3.2"
25assert_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 @@
1use assert_cmd::{assert::Assert, prelude::*};
2use dotup::ArchiveLink;
3use std::{
4 path::{Path, PathBuf},
5 process::Command,
6};
7use tempfile::TempDir;
8
9const DEPOT_FILE_NAME: &str = "depot.toml";
10const BIN_NAME: &str = "dotup";
11
12fn create_empty_file(path: impl AsRef<Path>) {
13 let path = path.as_ref();
14 if let Some(parent) = path.parent() {
15 std::fs::create_dir_all(parent).unwrap();
16 }
17 std::fs::write(path, "").unwrap();
18}
19
20fn prepare_command(dir: &TempDir) -> Command {
21 let mut cmd = Command::cargo_bin(BIN_NAME).unwrap();
22 cmd.current_dir(dir.path());
23 cmd
24}
25
26fn run_command(dir: &TempDir, cmd: &str) -> Assert {
27 let mut c = prepare_command(dir);
28 c.current_dir(dir.path());
29 c.args(cmd.split_whitespace());
30 c.assert()
31}
32
33fn prepare_dir() -> TempDir {
34 let dir = TempDir::new().unwrap();
35 create_empty_file(dir.path().join("o1/file.txt"));
36 create_empty_file(dir.path().join("o1/dir/file.txt"));
37 create_empty_file(dir.path().join("o2/file1.txt"));
38 create_empty_file(dir.path().join("o2/file2.txt"));
39 dir
40}
41
42#[test]
43fn test_cli_init() {
44 let dir = prepare_dir();
45 let assert = run_command(&dir, "init");
46
47 assert.success().code(0);
48 assert!(dir.path().join(DEPOT_FILE_NAME).is_file());
49}
50
51#[test]
52fn test_cli_link() {
53 let dir = prepare_dir();
54 run_command(&dir, "init").success();
55
56 let assert = run_command(&dir, "link o1 .config");
57 assert.success().code(0);
58
59 let assert = run_command(&dir, "link --directory o2 .scripts");
60 assert.success().code(0);
61
62 let archive = dotup::archive_read(dir.path().join(DEPOT_FILE_NAME)).unwrap();
63 let link1 = ArchiveLink {
64 origin: PathBuf::from("o1/file.txt"),
65 destination: PathBuf::from(".config/file.txt"),
66 };
67 let link2 = ArchiveLink {
68 origin: PathBuf::from("o1/dir/file.txt"),
69 destination: PathBuf::from(".config/dir/file.txt"),
70 };
71 let link3 = ArchiveLink {
72 origin: PathBuf::from("o2"),
73 destination: PathBuf::from(".scripts"),
74 };
75
76 assert!(archive.links.contains(&link1));
77 assert!(archive.links.contains(&link2));
78 assert!(archive.links.contains(&link3));
79}
80
81#[test]
82fn test_cli_install_uninstall_unlink() {
83 let dir = prepare_dir();
84 run_command(&dir, "init").success();
85 run_command(&dir, "link o1 .config").success();
86 run_command(&dir, "link --directory o2 .scripts").success();
87
88 let install_dir = TempDir::new().unwrap();
89 let install_base = format!("{}", install_dir.path().display());
90 run_command(
91 &dir,
92 &format!("install --install-base {} o1 o2", install_base),
93 )
94 .success();
95
96 assert_eq!(
97 std::fs::read_link(install_dir.path().join(".config/file.txt")).unwrap(),
98 dir.path().join("o1/file.txt")
99 );
100 assert_eq!(
101 std::fs::read_link(install_dir.path().join(".config/dir/file.txt")).unwrap(),
102 dir.path().join("o1/dir/file.txt")
103 );
104 assert_eq!(
105 std::fs::read_link(install_dir.path().join(".scripts")).unwrap(),
106 dir.path().join("o2")
107 );
108
109 run_command(
110 &dir,
111 &format!("uninstall --install-base {} o1/file.txt", install_base),
112 )
113 .success();
114 assert!(!install_dir.path().join(".config/file.txt").exists());
115 assert!(install_dir.path().join(".config/dir/file.txt").exists());
116 assert!(install_dir.path().join(".scripts").exists());
117
118 run_command(
119 &dir,
120 &format!("uninstall --install-base {} o1", install_base),
121 )
122 .success();
123 assert!(!install_dir.path().join(".config/file.txt").exists());
124 assert!(!install_dir.path().join(".config/dir/file.txt").exists());
125 assert!(install_dir.path().join(".scripts").exists());
126
127 assert_eq!(
128 3,
129 dotup::archive_read(dir.path().join(DEPOT_FILE_NAME))
130 .unwrap()
131 .links
132 .len()
133 );
134
135 run_command(&dir, &format!("unlink --uninstall {} o2", install_base)).success();
136 assert!(!install_dir.path().join(".scripts").exists());
137
138 assert_eq!(
139 2,
140 dotup::archive_read(dir.path().join(DEPOT_FILE_NAME))
141 .unwrap()
142 .links
143 .len()
144 );
145}