From 94854e0733b996dbc6524c531c2d8983fd84a4b0 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Wed, 25 Nov 2020 23:06:25 -0500 Subject: [PATCH] Add tests for CLI behavior This caught a bug! Parse errors should be printed to stderr, not stdout. --- src/bin/cargo-deadlinks.rs | 2 +- .../broken_links/hardcoded-target/index.html | 1 + tests/cli_args/Cargo.toml | 9 +++ tests/cli_args/src/lib.rs | 2 + tests/simple_project.rs | 68 ++++++++++++++++++- tests/simple_project/src/lib.rs | 7 -- 6 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 tests/broken_links/hardcoded-target/index.html create mode 100644 tests/cli_args/Cargo.toml create mode 100644 tests/cli_args/src/lib.rs diff --git a/src/bin/cargo-deadlinks.rs b/src/bin/cargo-deadlinks.rs index 83233b5..0f0ca67 100644 --- a/src/bin/cargo-deadlinks.rs +++ b/src/bin/cargo-deadlinks.rs @@ -95,7 +95,7 @@ fn main() { let args: MainArgs = match parse_args() { Ok(args) => args, Err(err) => { - println!("error: {}", err); + eprintln!("error: {}", err); std::process::exit(1) } }; diff --git a/tests/broken_links/hardcoded-target/index.html b/tests/broken_links/hardcoded-target/index.html new file mode 100644 index 0000000..829bc21 --- /dev/null +++ b/tests/broken_links/hardcoded-target/index.html @@ -0,0 +1 @@ + diff --git a/tests/cli_args/Cargo.toml b/tests/cli_args/Cargo.toml new file mode 100644 index 0000000..0b59ab0 --- /dev/null +++ b/tests/cli_args/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "cli_args" +version = "0.1.0" +authors = ["Joshua Nelson "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/tests/cli_args/src/lib.rs b/tests/cli_args/src/lib.rs new file mode 100644 index 0000000..52c6521 --- /dev/null +++ b/tests/cli_args/src/lib.rs @@ -0,0 +1,2 @@ +//! Links to [Private] +struct Private; diff --git a/tests/simple_project.rs b/tests/simple_project.rs index eedcbb8..2433340 100644 --- a/tests/simple_project.rs +++ b/tests/simple_project.rs @@ -2,7 +2,7 @@ extern crate assert_cmd; extern crate predicates; use assert_cmd::prelude::*; -use predicate::str::contains; +use predicate::str::{contains, starts_with}; use predicates::prelude::*; use std::env; use std::path::Path; @@ -142,3 +142,69 @@ mod workspace { assert_doc("./tests/workspace", &[]).success(); } } + +mod cli_args { + use super::*; + + #[test] + fn it_passes_arguments_through_to_cargo() { + remove_all("./tests/cli_args/target"); + deadlinks() + .current_dir("./tests/cli_args") + .arg("--") + .arg("--document-private-items") + .assert() + .success(); + assert!(Path::new("./tests/cli_args/target/doc/cli_args/struct.Private.html").exists()); + } + + #[test] + fn it_exits_with_success_on_info_queries() { + for arg in &["-h", "--help", "-V", "--version"] { + deadlinks().arg(arg).assert().success(); + } + } + + #[test] + fn dir_works() { + deadlinks() + .arg("--dir") + .arg("./tests/broken_links/hardcoded-target") + .assert() + .failure() + .stdout(contains("Found invalid urls")); + } + + #[test] + fn missing_deadlinks_gives_helpful_error() { + Command::cargo_bin("cargo-deadlinks") + .unwrap() + .assert() + .failure() + .stderr(contains("should be run as `cargo deadlinks`")); + } + + #[test] + fn too_many_args_is_an_error() { + deadlinks() + .arg("x") + .assert() + .failure() + .stderr(contains("error:").and(contains("x"))); + } + + #[test] + fn version_contains_binary_name() { + Command::cargo_bin("deadlinks") + .unwrap() + .arg("--version") + .assert() + .stdout(starts_with("deadlinks ")); + Command::cargo_bin("cargo-deadlinks") + .unwrap() + .arg("deadlinks") + .arg("--version") + .assert() + .stdout(starts_with("cargo-deadlinks ")); + } +} diff --git a/tests/simple_project/src/lib.rs b/tests/simple_project/src/lib.rs index 6e5c82b..4d97fbe 100644 --- a/tests/simple_project/src/lib.rs +++ b/tests/simple_project/src/lib.rs @@ -8,10 +8,3 @@ pub fn bar() {} /// [Correct link](crate::bar) pub struct Tmp {} -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); - } -}