diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/readme.rs | 125 | ||||
-rw-r--r-- | tests/serve_request.rs | 7 |
2 files changed, 130 insertions, 2 deletions
diff --git a/tests/readme.rs b/tests/readme.rs new file mode 100644 index 0000000..56a3afd --- /dev/null +++ b/tests/readme.rs @@ -0,0 +1,125 @@ +mod fixtures; + +use fixtures::{server, Error, TestServer, DIRECTORIES, FILES}; +use rstest::rstest; +use select::predicate::Attr; +use select::{document::Document, node::Node}; +use std::fs::{remove_file, File}; +use std::io::Write; +use std::path::PathBuf; + +/// Do not show readme contents by default +#[rstest] +fn no_readme_contents(server: TestServer) -> Result<(), Error> { + let body = reqwest::blocking::get(server.url())?.error_for_status()?; + let parsed = Document::from_read(body)?; + + // Check that the regular file listing still works. + for &file in FILES { + assert!(parsed.find(|x: &Node| x.text() == file).next().is_some()); + } + for &dir in DIRECTORIES { + assert!(parsed.find(|x: &Node| x.text() == dir).next().is_some()); + } + + // Check that there is no readme stuff here. + 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(()) +} + +/// Show readme contents when told to if there is a readme file in the root +#[rstest( + readme_name, + case("Readme.md"), + case("readme.md"), + case("README.md"), + case("README.MD"), + case("ReAdMe.Md") +)] +fn show_root_readme_contents( + #[with(&["--readme"])] server: TestServer, + readme_name: &str, +) -> Result<(), Error> { + let readme_path = write_readme_contents(server.path().to_path_buf(), readme_name); + let body = reqwest::blocking::get(server.url())?.error_for_status()?; + let parsed = Document::from_read(body)?; + + // All the files are still getting listed... + for &file in FILES { + assert!(parsed.find(|x: &Node| x.text() == file).next().is_some()); + } + // ...in addition to the readme contents below the file listing. + assert_readme_contents(&parsed, &readme_name); + remove_file(readme_path).unwrap(); + Ok(()) +} + +/// Show readme contents when told to if there is a readme file in any of the directories +#[rstest( + readme_name, + case("Readme.md"), + case("readme.md"), + case("README.md"), + case("README.MD"), + case("ReAdMe.Md") +)] +fn show_nested_readme_contents( + #[with(&["--readme"])] server: TestServer, + readme_name: &str, +) -> Result<(), Error> { + for dir in DIRECTORIES { + let readme_path = write_readme_contents(server.path().join(dir), readme_name); + let body = reqwest::blocking::get(server.url().join(dir)?)?.error_for_status()?; + let parsed = Document::from_read(body)?; + + // All the files are still getting listed... + for &file in FILES { + assert!(parsed.find(|x: &Node| x.text() == file).next().is_some()); + } + // ...in addition to the readme contents below the file listing. + assert_readme_contents(&parsed, &readme_name); + remove_file(readme_path).unwrap(); + } + Ok(()) +} + +fn write_readme_contents(path: PathBuf, filename: &str) -> PathBuf { + let readme_path = path.join(filename); + let mut readme_file = File::create(&readme_path).unwrap(); + readme_file + .write(format!("Contents of {}", filename).to_string().as_bytes()) + .expect("Couldn't write readme"); + readme_path +} + +fn assert_readme_contents(parsed_dom: &Document, filename: &str) { + assert!(parsed_dom.find(Attr("id", "readme")).next().is_some()); + assert!(parsed_dom + .find(Attr("id", "readme-filename")) + .next() + .is_some()); + assert!( + parsed_dom + .find(Attr("id", "readme-filename")) + .next() + .unwrap() + .text() + == filename + ); + assert!(parsed_dom + .find(Attr("id", "readme-contents")) + .next() + .is_some()); + assert!( + parsed_dom + .find(Attr("id", "readme-contents")) + .next() + .unwrap() + .text() + .trim() + == format!("Contents of {}", filename) + ); +} diff --git a/tests/serve_request.rs b/tests/serve_request.rs index 3f5eeff..f376469 100644 --- a/tests/serve_request.rs +++ b/tests/serve_request.rs @@ -33,6 +33,9 @@ fn serves_requests_with_no_options(tmpdir: TempDir) -> Result<(), Error> { for &file in FILES { assert!(parsed.find(|x: &Node| x.text() == file).next().is_some()); } + for &dir in DIRECTORIES { + assert!(parsed.find(|x: &Node| x.text() == dir).next().is_some()); + } child.kill()?; @@ -135,7 +138,7 @@ fn serves_requests_symlinks( let broken = "symlink broken"; // Set up some basic symlinks: - // to dir, to file, to non-existant location + // to dir, to file, to non-existent location let orig = DIRECTORIES[0].strip_suffix("/").unwrap(); let link = server.path().join(dir.strip_suffix("/").unwrap()); symlink_dir(orig, link).expect("Couldn't create symlink"); @@ -166,7 +169,7 @@ fn serves_requests_symlinks( } // If following symlinks is deactivated, we can just skip this iteration as we assorted - // above tht no entries in the listing can be found for symlinks in that case. + // above the no entries in the listing can be found for symlinks in that case. if no_symlinks { continue; } |