aboutsummaryrefslogtreecommitdiffstats
path: root/tests/serve_request.rs
diff options
context:
space:
mode:
authorAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2021-03-29 09:31:22 +0000
committerAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2021-03-31 04:00:51 +0000
commit18a3465da2dd5630a760a6f106d1ceff6f78cd9f (patch)
tree781398ba83122bcc84c52cd542697b13f2447535 /tests/serve_request.rs
parentMove symlink symbol from html to css (diff)
downloadminiserve-18a3465da2dd5630a760a6f106d1ceff6f78cd9f.tar.gz
miniserve-18a3465da2dd5630a760a6f106d1ceff6f78cd9f.zip
Test for symlink directories and files
Replace some of the testing files and directories with symbolic links. They should behave exactly the same.
Diffstat (limited to '')
-rw-r--r--tests/serve_request.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/tests/serve_request.rs b/tests/serve_request.rs
index 95449f5..385feeb 100644
--- a/tests/serve_request.rs
+++ b/tests/serve_request.rs
@@ -8,10 +8,16 @@ use regex::Regex;
use rstest::rstest;
use select::document::Document;
use select::node::Node;
+use std::path::Path;
use std::process::{Command, Stdio};
use std::thread::sleep;
use std::time::Duration;
+#[cfg(unix)]
+use std::os::unix::fs::{symlink as symlink_dir, symlink as symlink_file};
+#[cfg(windows)]
+use std::os::windows::fs::{symlink_dir, symlink_file};
+
#[rstest]
fn serves_requests_with_no_options(tmpdir: TempDir) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
@@ -154,6 +160,64 @@ fn serves_requests_no_hidden_files_without_flag(tmpdir: TempDir, port: u16) -> R
}
#[rstest]
+fn serves_requests_symlinks(tmpdir: TempDir, port: u16) -> Result<(), Error> {
+ let mut child = Command::cargo_bin("miniserve")?
+ .arg(tmpdir.path())
+ .arg("-p")
+ .arg(port.to_string())
+ .stdout(Stdio::null())
+ .spawn()?;
+
+ sleep(Duration::from_secs(1));
+
+ let files = &["symlink-file.html"];
+ let dirs = &["symlink-dir/"];
+ let broken = &["symlink broken"];
+
+ for &directory in dirs {
+ let orig = Path::new(DIRECTORIES[0].strip_suffix("/").unwrap());
+ let link = tmpdir
+ .path()
+ .join(Path::new(directory.strip_suffix("/").unwrap()));
+ symlink_dir(orig, link).expect("Couldn't create symlink");
+ }
+ for &file in files {
+ let orig = Path::new(FILES[0]);
+ let link = tmpdir.path().join(Path::new(file));
+ symlink_file(orig, link).expect("Couldn't create symlink");
+ }
+ for &file in broken {
+ let orig = Path::new("should-not-exist.xxx");
+ let link = tmpdir.path().join(Path::new(file));
+ symlink_file(orig, link).expect("Couldn't create symlink");
+ }
+
+ let body = reqwest::blocking::get(format!("http://localhost:{}", port).as_str())?
+ .error_for_status()?;
+ let parsed = Document::from_read(body)?;
+
+ for &entry in files.into_iter().chain(dirs) {
+ let node = parsed
+ .find(|x: &Node| x.name().unwrap_or_default() == "a" && x.text() == entry)
+ .next()
+ .unwrap();
+ assert_eq!(node.attr("href").unwrap().strip_prefix("/").unwrap(), entry);
+ if entry.ends_with("/") {
+ assert_eq!(node.attr("class").unwrap(), "directory");
+ } else {
+ assert_eq!(node.attr("class").unwrap(), "file");
+ }
+ }
+ for &entry in broken {
+ assert!(parsed.find(|x: &Node| x.text() == entry).next().is_none());
+ }
+
+ child.kill()?;
+
+ Ok(())
+}
+
+#[rstest]
fn serves_requests_with_randomly_assigned_port(tmpdir: TempDir) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
.arg(tmpdir.path())