summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/client_paths.rs95
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/client_paths.rs b/tests/client_paths.rs
new file mode 100644
index 0000000..0e45a8d
--- /dev/null
+++ b/tests/client_paths.rs
@@ -0,0 +1,95 @@
1use std::ffi::OsStr;
2use std::path::PathBuf;
3
4use zagan_bet::client::paths::{data_dir_from, database_path, parse_args, APP_DIR, DATABASE_FILE};
5
6fn args(values: &[&str]) -> Result<zagan_bet::client::paths::ClientArgs, String> {
7 parse_args(values.iter().map(|value| value.to_string()))
8}
9
10#[test]
11fn the_data_directory_follows_the_xdg_spec() {
12 let xdg = OsStr::new("/home/user/.local/share");
13 let home = OsStr::new("/home/user");
14 assert_eq!(
15 data_dir_from(Some(xdg), Some(home), None),
16 PathBuf::from("/home/user/.local/share").join(APP_DIR)
17 );
18
19 // A relative XDG_DATA_HOME is invalid and must be ignored.
20 assert_eq!(
21 data_dir_from(Some(OsStr::new("relative/path")), Some(home), None),
22 PathBuf::from("/home/user/.local/share").join(APP_DIR)
23 );
24
25 // No XDG: HOME/.local/share.
26 assert_eq!(
27 data_dir_from(None, Some(home), None),
28 PathBuf::from("/home/user/.local/share").join(APP_DIR)
29 );
30
31 // Windows: APPDATA wins over HOME when XDG is unset.
32 assert_eq!(
33 data_dir_from(None, Some(home), Some(OsStr::new("/home/user/AppData/Roaming"))),
34 PathBuf::from("/home/user/AppData/Roaming").join(APP_DIR)
35 );
36
37 // No usable home at all: stay relative rather than guessing.
38 assert_eq!(
39 data_dir_from(Some(OsStr::new("")), Some(OsStr::new("")), Some(OsStr::new(""))),
40 PathBuf::from(APP_DIR)
41 );
42}
43
44#[test]
45fn the_database_lives_inside_the_data_directory() {
46 assert_eq!(
47 database_path(&PathBuf::from("/tmp/zagan")),
48 PathBuf::from("/tmp/zagan").join(DATABASE_FILE)
49 );
50}
51
52#[test]
53fn dash_d_sets_the_data_directory() {
54 let parsed = args(&["-d", "/tmp/zagan-data"]).unwrap();
55 assert_eq!(
56 parsed.data_dir,
57 Some(PathBuf::from("/tmp/zagan-data"))
58 );
59 assert!(!parsed.unsafe_mode);
60 assert!(!parsed.help);
61
62 let parsed = args(&["--data-dir", "/var/lib/zagan"]).unwrap();
63 assert_eq!(parsed.data_dir, Some(PathBuf::from("/var/lib/zagan")));
64
65 let parsed = args(&["--data-dir=/var/lib/zagan"]).unwrap();
66 assert_eq!(parsed.data_dir, Some(PathBuf::from("/var/lib/zagan")));
67}
68
69#[test]
70fn flags_can_be_combined() {
71 let parsed = args(&["--unsafe", "-d", "/tmp/x"]).unwrap();
72 assert!(parsed.unsafe_mode);
73 assert_eq!(parsed.data_dir, Some(PathBuf::from("/tmp/x")));
74}
75
76#[test]
77fn bad_arguments_are_rejected_with_usage() {
78 let error = args(&["-d"]).unwrap_err();
79 assert!(error.contains("needs a directory"), "{error}");
80 assert!(error.contains("usage:"), "{error}");
81
82 let error = args(&["--data-dir="]).unwrap_err();
83 assert!(error.contains("needs a directory"), "{error}");
84
85 let error = args(&["--nope"]).unwrap_err();
86 assert!(error.contains("unknown argument: --nope"), "{error}");
87}
88
89#[test]
90fn help_is_a_flag_not_an_error() {
91 let parsed = args(&["-h"]).unwrap();
92 assert!(parsed.help);
93 let parsed = args(&["--help"]).unwrap();
94 assert!(parsed.help);
95}