diff options
author | Gaurav <allmanpride@gmail.com> | 2022-08-26 01:59:32 +0000 |
---|---|---|
committer | Gaurav <allmanpride@gmail.com> | 2022-08-26 01:59:44 +0000 |
commit | 4b4d1d78921395f5ffdea0ff94815e100b3144ab (patch) | |
tree | f1a5c1694015993d97c9fb1acd604cf28a59a8a2 /tests/readme.rs | |
parent | Merge pull request #875 from svenstaro/dependabot/cargo/chrono-humanize-0.2.2 (diff) | |
download | miniserve-4b4d1d78921395f5ffdea0ff94815e100b3144ab.tar.gz miniserve-4b4d1d78921395f5ffdea0ff94815e100b3144ab.zip |
Add tests for `--readme`
Diffstat (limited to '')
-rw-r--r-- | tests/readme.rs | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/tests/readme.rs b/tests/readme.rs new file mode 100644 index 0000000..0dabf87 --- /dev/null +++ b/tests/readme.rs @@ -0,0 +1,124 @@ +mod fixtures; + +use assert_cmd::prelude::*; +use assert_fs::fixture::{FileWriteStr, TempDir}; +use assert_fs::prelude::PathChild; +use fixtures::{server, tmpdir, Error, TestServer, DIRECTORIES}; +use reqwest::Url; +use rstest::rstest; +use select::document::Document; +use select::predicate::Attr; +use std::process::{Command, Stdio}; +use std::thread::sleep; +use std::time::Duration; + +#[rstest] +/// Do not show readme contents by default +fn no_readme_contents(server: TestServer) -> Result<(), Error> { + let body = reqwest::blocking::get(server.url())?.error_for_status()?; + let parsed = Document::from_read(body)?; + assert!(parsed.find(Attr("id", "readme")).next().is_none()); + assert!(parsed.find(Attr("id", "readme-filename")).next().is_none()); + assert!(parsed.find(Attr("id", "readme-contents")).next().is_none()); + + Ok(()) +} + +#[rstest] +/// Show readme contents when told to if there is no readme.md file +fn show_readme_contents(tmpdir: TempDir) -> Result<(), Error> { + tmpdir + .child("readme.md") + .write_str("Readme Contents.") + .expect("Couldn't write to readme.md"); + let mut child = Command::cargo_bin("miniserve")? + .arg("--readme") + .arg("--port") + .arg("8090") + .arg(tmpdir.path()) + .stdout(Stdio::null()) + .spawn()?; + + sleep(Duration::from_secs(1)); + let body = reqwest::blocking::get("http://localhost:8090")?.error_for_status()?; + let parsed = Document::from_read(body)?; + assert!(parsed.find(Attr("id", "readme")).next().is_some()); + assert!(parsed.find(Attr("id", "readme-filename")).next().is_some()); + assert!( + parsed + .find(Attr("id", "readme-filename")) + .next() + .unwrap() + .text() + == "readme.md" + ); + assert!(parsed.find(Attr("id", "readme-contents")).next().is_some()); + assert!( + parsed + .find(Attr("id", "readme-contents")) + .next() + .unwrap() + .text() + .trim() + == "Readme Contents." + ); + + child.kill()?; + Ok(()) +} + +#[rstest] +/// Show readme contents when told to if there is no readme.md file +fn show_readme_contents_directories(tmpdir: TempDir) -> Result<(), Error> { + let directories = DIRECTORIES.to_vec(); + for directory in directories.iter() { + tmpdir + .child(format!("{}{}", directory, "readme.md")) + .write_str("Readme Contents.") + .expect("Couldn't write to file"); + } + + let mut child = Command::cargo_bin("miniserve")? + .arg("--readme") + .arg(tmpdir.path()) + .stdout(Stdio::null()) + .spawn()?; + + sleep(Duration::from_secs(1)); + + for directory in directories { + let dir_body = + reqwest::blocking::get(Url::parse("http://localhost:8080")?.join(&directory)?)? + .error_for_status()?; + let dir_body_parsed = Document::from_read(dir_body)?; + assert!(dir_body_parsed.find(Attr("id", "readme")).next().is_some()); + assert!(dir_body_parsed + .find(Attr("id", "readme-filename")) + .next() + .is_some()); + assert!( + dir_body_parsed + .find(Attr("id", "readme-filename")) + .next() + .unwrap() + .text() + == "readme.md" + ); + assert!(dir_body_parsed + .find(Attr("id", "readme-contents")) + .next() + .is_some()); + assert!( + dir_body_parsed + .find(Attr("id", "readme-contents")) + .next() + .unwrap() + .text() + .trim() + == "Readme Contents." + ); + } + + child.kill()?; + Ok(()) +} |