Skip to content

Commit e64bf9a

Browse files
committed
Add tests for CLI parsing
Check global flags are handled correctly and that exclusive flags can't be used at the same time etc.
1 parent 1b9f83c commit e64bf9a

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

src/cli.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,97 @@ impl TracingOptions {
127127
self.tracing_level
128128
}
129129
}
130+
131+
#[cfg(test)]
132+
mod tests {
133+
use std::path::PathBuf;
134+
135+
use clap::error::{Error, ErrorKind};
136+
use clap::Parser;
137+
use tracing::Level;
138+
139+
use super::Cli;
140+
use crate::cli::Command;
141+
const APP: &str = "numtracker";
142+
143+
#[test]
144+
fn serve_defaults() {
145+
let cli = Cli::try_parse_from([APP, "serve"]).unwrap();
146+
assert_eq!(cli.db, PathBuf::from("numtracker.db"));
147+
assert_eq!(cli.verbose.log_level(), Some(Level::ERROR));
148+
149+
assert_eq!(cli.tracing().tracing_url(), None);
150+
assert_eq!(cli.tracing().level(), Level::INFO);
151+
152+
let Command::Serve(cmd) = cli.command else {
153+
panic!("Unexpected subcommand: {:?}", cli.command);
154+
};
155+
assert_eq!(cmd.addr(), ("0.0.0.0".parse().unwrap(), 8000));
156+
assert_eq!(cmd.root_directory(), None);
157+
}
158+
159+
#[test]
160+
fn global_verbose() {
161+
let cli = Cli::try_parse_from([APP, "-vv", "serve"]).unwrap();
162+
assert_eq!(cli.log_level(), Some(Level::DEBUG));
163+
164+
let cli = Cli::try_parse_from([APP, "serve", "-v"]).unwrap();
165+
assert_eq!(cli.log_level(), Some(Level::INFO));
166+
167+
let cli = Cli::try_parse_from([APP, "schema", "-q"]).unwrap();
168+
assert_eq!(cli.log_level(), None);
169+
}
170+
171+
#[test]
172+
fn exclusive_quiet_verbose() {
173+
let err = Cli::try_parse_from([APP, "schema", "-q", "-v"]).unwrap_err();
174+
assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
175+
}
176+
177+
#[test]
178+
fn max_verbosity() {
179+
let cli = Cli::try_parse_from([APP, "-vvv", "serve"]).unwrap();
180+
assert_eq!(cli.log_level(), Some(Level::TRACE));
181+
182+
// Adding more flags does nothing but isn't an error
183+
let cli = Cli::try_parse_from([APP, "-vvvv", "serve"]).unwrap();
184+
assert_eq!(cli.log_level(), Some(Level::TRACE));
185+
186+
let cli = Cli::try_parse_from([APP, "-vvvvv", "serve"]).unwrap();
187+
assert_eq!(cli.log_level(), Some(Level::TRACE));
188+
}
189+
190+
#[test]
191+
fn tracing_opts() {
192+
let cli = Cli::try_parse_from([APP, "--tracing", "https://tracing.example.com", "serve"])
193+
.unwrap();
194+
assert_eq!(
195+
cli.tracing().tracing_url(),
196+
Some("https://tracing.example.com".parse().unwrap())
197+
);
198+
assert_eq!(cli.tracing().level(), Level::INFO);
199+
200+
let cli = Cli::try_parse_from([
201+
APP,
202+
"--tracing",
203+
"https://tracing.example.com",
204+
"--tracing-level",
205+
"DEBUG",
206+
"serve",
207+
])
208+
.unwrap();
209+
assert_eq!(
210+
cli.tracing().tracing_url(),
211+
Some("https://tracing.example.com".parse().unwrap())
212+
);
213+
assert_eq!(cli.tracing().level(), Level::DEBUG);
214+
}
215+
216+
#[test]
217+
fn schema_command() {
218+
let cli = Cli::try_parse_from([APP, "schema"]).unwrap();
219+
let Command::Schema = cli.command else {
220+
panic!("Unexpected command: {:?}", cli.command);
221+
};
222+
}
223+
}

0 commit comments

Comments
 (0)