aboutsummaryrefslogtreecommitdiffstats
path: root/tests/cli.rs
diff options
context:
space:
mode:
authorboastful-squirrel <boastful.squirrel@gmail.com>2019-04-25 16:41:05 +0000
committerboastful-squirrel <boastful.squirrel@gmail.com>2019-04-25 16:41:05 +0000
commitb223d7dff4f70e85695c5641db932944db4dc774 (patch)
treea6de481eaf136eb9d5c739e99c14cae349c5c01a /tests/cli.rs
parentMade code more idiomatic (diff)
parentMerge pull request #82 from svenstaro/dependabot/cargo/pretty_assertions-0.6.1 (diff)
downloadminiserve-b223d7dff4f70e85695c5641db932944db4dc774.tar.gz
miniserve-b223d7dff4f70e85695c5641db932944db4dc774.zip
Merge branch 'master' into no_panics
Diffstat (limited to 'tests/cli.rs')
-rw-r--r--tests/cli.rs102
1 files changed, 93 insertions, 9 deletions
diff --git a/tests/cli.rs b/tests/cli.rs
index ed10f10..6a41764 100644
--- a/tests/cli.rs
+++ b/tests/cli.rs
@@ -3,9 +3,11 @@ use assert_fs::fixture::TempDir;
use assert_fs::prelude::*;
use clap::{crate_name, crate_version};
use port_check::free_local_port;
+use pretty_assertions::assert_eq;
use reqwest;
+use reqwest::multipart;
use select::document::Document;
-use select::predicate::Text;
+use select::predicate::{Attr, Text};
use std::process::{Command, Stdio};
use std::thread::sleep;
use std::time::Duration;
@@ -14,18 +16,17 @@ type Error = Box<std::error::Error>;
static FILES: &[&str] = &["test.txt", "test.html", "test.mkv"];
-// Test fixture which creates a temporary directory with a few files inside.
+/// Test fixture which creates a temporary directory with a few files inside.
pub fn tmpdir() -> Result<TempDir, Error> {
let tmpdir = assert_fs::TempDir::new()?;
for &file in FILES {
- tmpdir.child(file).touch()?;
+ tmpdir.child(file).write_str("Test Hello Yes")?;
}
Ok(tmpdir)
}
#[test]
-/// Starts and serves requests without any options.
-fn starts_ok_with_no_option() -> Result<(), Error> {
+fn serves_requests_with_no_options() -> Result<(), Error> {
let tmpdir = tmpdir()?;
let mut child = Command::cargo_bin("miniserve")?
.arg(tmpdir.path())
@@ -34,7 +35,7 @@ fn starts_ok_with_no_option() -> Result<(), Error> {
sleep(Duration::from_secs(1));
- let body = reqwest::get("http://localhost:8080")?;
+ let body = reqwest::get("http://localhost:8080")?.error_for_status()?;
let parsed = Document::from_read(body)?;
for &file in FILES {
assert!(parsed.find(Text).any(|x| x.text() == file));
@@ -46,8 +47,7 @@ fn starts_ok_with_no_option() -> Result<(), Error> {
}
#[test]
-/// Starts and serves requests on a non-default port.
-fn starts_ok_with_non_default_port() -> Result<(), Error> {
+fn serves_requests_with_non_default_port() -> Result<(), Error> {
let tmpdir = tmpdir()?;
let port = free_local_port().unwrap();
@@ -60,7 +60,39 @@ fn starts_ok_with_non_default_port() -> Result<(), Error> {
sleep(Duration::from_secs(1));
- let body = reqwest::get(format!("http://localhost:{}", port).as_str())?;
+ let body = reqwest::get(format!("http://localhost:{}", port).as_str())?.error_for_status()?;
+ let parsed = Document::from_read(body)?;
+ for &file in FILES {
+ assert!(parsed.find(Text).any(|x| x.text() == file));
+ }
+
+ child.kill()?;
+
+ Ok(())
+}
+
+#[test]
+fn auth_works() -> Result<(), Error> {
+ let tmpdir = tmpdir()?;
+
+ let port = free_local_port().unwrap();
+ let mut child = Command::cargo_bin("miniserve")?
+ .arg(tmpdir.path())
+ .arg("-p")
+ .arg(port.to_string())
+ .arg("-a")
+ .arg("testuser:testpassword")
+ .stdout(Stdio::null())
+ .spawn()?;
+
+ sleep(Duration::from_secs(1));
+
+ let client = reqwest::Client::new();
+ let body = client
+ .get(format!("http://localhost:{}", port).as_str())
+ .basic_auth("testuser", Some("testpassword"))
+ .send()?
+ .error_for_status()?;
let parsed = Document::from_read(body)?;
for &file in FILES {
assert!(parsed.find(Text).any(|x| x.text() == file));
@@ -72,6 +104,58 @@ fn starts_ok_with_non_default_port() -> Result<(), Error> {
}
#[test]
+fn uploading_files_works() -> Result<(), Error> {
+ let tmpdir = tmpdir()?;
+
+ let test_file_name = "uploaded test file.txt";
+
+ let port = free_local_port().unwrap();
+ let mut child = Command::cargo_bin("miniserve")?
+ .arg(tmpdir.path())
+ .arg("-p")
+ .arg(port.to_string())
+ .arg("-u")
+ .stdout(Stdio::null())
+ .spawn()?;
+
+ sleep(Duration::from_secs(1));
+
+ // Before uploading, check whether the uploaded file does not yet exist.
+ let body = reqwest::get(format!("http://localhost:{}", port).as_str())?.error_for_status()?;
+ let parsed = Document::from_read(body)?;
+ assert!(parsed.find(Text).all(|x| x.text() != test_file_name));
+
+ // Perform the actual upload.
+ let upload_action = parsed
+ .find(Attr("id", "file_submit"))
+ .next()
+ .expect("Couldn't find element with id=file_submit")
+ .attr("action")
+ .expect("Upload form doesn't have action attribute");
+ let form = multipart::Form::new();
+ let part = multipart::Part::text("this should be uploaded")
+ .file_name(test_file_name)
+ .mime_str("text/plain")?;
+ let form = form.part("file_to_upload", part);
+
+ let client = reqwest::Client::new();
+ client
+ .post(format!("http://localhost:{}{}", port, upload_action).as_str())
+ .multipart(form)
+ .send()?
+ .error_for_status()?;
+
+ // After uploading, check whether the uploaded file is now getting listed.
+ let body = reqwest::get(format!("http://localhost:{}", port).as_str())?;
+ let parsed = Document::from_read(body)?;
+ assert!(parsed.find(Text).any(|x| x.text() == test_file_name));
+
+ child.kill()?;
+
+ Ok(())
+}
+
+#[test]
/// Show help and exit.
fn help_shows() -> Result<(), Error> {
Command::cargo_bin("miniserve")?