lychee 0.24.2

A fast, async link checker
#[cfg(test)]
mod cli {
    use std::{error::Error, fs::File, io::Write};

    use assert_cmd::cargo::cargo_bin_cmd;
    use predicates::str::contains;

    type Result<T> = std::result::Result<T, Box<dyn Error>>;

    #[tokio::test]
    async fn test_local_file() -> Result<()> {
        let dir = tempfile::tempdir()?;
        let index_path = dir.path().join("index.html");
        let mut index = File::create(&index_path)?;
        writeln!(index, r#"<a href="./foo.html">Foo</a>"#)?;

        let foo_path = dir.path().join("foo.html");
        File::create(foo_path)?;

        cargo_bin_cmd!()
            .arg(index_path)
            .arg("--no-progress")
            .arg("-vv")
            .env_clear()
            .assert()
            .success()
            .stdout(contains("1 Total"))
            .stderr(contains("foo.html"));

        Ok(())
    }

    #[tokio::test]
    async fn test_local_dir() -> Result<()> {
        let dir = tempfile::tempdir()?;
        let index_path = dir.path().join("index.html");
        let mut index = File::create(index_path)?;
        writeln!(index, r#"<a href="./foo.html">Foo</a>"#)?;
        writeln!(index, r#"<a href="./bar.md">Bar</a>"#)?;

        let foo_path = dir.path().join("foo.html");
        File::create(foo_path)?;
        let bar_path = dir.path().join("bar.md");
        File::create(bar_path)?;

        cargo_bin_cmd!()
            .arg(dir.path())
            .arg("--no-progress")
            .arg("-vv")
            .env_clear()
            .assert()
            .success()
            .stdout(contains("2 Total"))
            .stdout(contains("2 OK"))
            .stderr(contains("foo.html"))
            .stderr(contains("bar.md"));

        Ok(())
    }
}