Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split integration test into multiple files #91

Merged
merged 3 commits into from
May 1, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions tests/auth.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
mod fixtures;
use fixtures::*;

#[rstest_parametrize(
cli_auth_arg, client_username, client_password,
case("testuser:testpassword", "testuser", "testpassword"),
case(
"testuser:sha256:9f735e0df9a1ddc702bf0a1a7b83033f9f7153a00c29de82cedadc9957289b05",
"testuser",
"testpassword"
),
case(
"testuser:sha512:e9e633097ab9ceb3e48ec3f70ee2beba41d05d5420efee5da85f97d97005727587fda33ef4ff2322088f4c79e8133cc9cd9f3512f4d3a303cbdb5bc585415a00",
"testuser",
"testpassword"
),
)]
fn auth_works(
tmpdir: TempDir,
port: u16,
cli_auth_arg: &str,
client_username: &str,
client_password: &str
) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
.arg(tmpdir.path())
.arg("-p")
.arg(port.to_string())
.arg("-a")
.arg(cli_auth_arg)
.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(client_username, Some(client_password))
.send()?
.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(())
}
176 changes: 2 additions & 174 deletions tests/cli.rs
Original file line number Diff line number Diff line change
@@ -1,177 +1,5 @@
use assert_cmd::prelude::*;
use assert_fs::fixture::TempDir;
use assert_fs::prelude::*;
use clap::{crate_name, crate_version};
use port_check::free_local_port;
use reqwest;
use reqwest::multipart;
use rstest::rstest;
use select::document::Document;
use select::predicate::{Attr, Text};
use std::process::{Command, Stdio};
use std::thread::sleep;
use std::time::Duration;
use rstest::rstest_parametrize;

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.
pub fn tmpdir() -> TempDir {
let tmpdir = assert_fs::TempDir::new().expect("Couldn't create a temp dir for tests");
for &file in FILES {
tmpdir
.child(file)
.write_str("Test Hello Yes")
.expect("Couldn't write to file");
}
tmpdir
}

/// Get a free port.
pub fn port() -> u16 {
free_local_port().expect("Couldn't find a free local port")
}

#[rstest]
fn serves_requests_with_no_options(tmpdir: TempDir) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
.arg(tmpdir.path())
.stdout(Stdio::null())
.spawn()?;

sleep(Duration::from_secs(1));

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));
}

child.kill()?;

Ok(())
}

#[rstest]
fn serves_requests_with_non_default_port(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 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(())
}

#[rstest_parametrize(
cli_auth_arg, client_username, client_password,
case("testuser:testpassword", "testuser", "testpassword"),
case(
"testuser:sha256:9f735e0df9a1ddc702bf0a1a7b83033f9f7153a00c29de82cedadc9957289b05",
"testuser",
"testpassword"
),
case(
"testuser:sha512:e9e633097ab9ceb3e48ec3f70ee2beba41d05d5420efee5da85f97d97005727587fda33ef4ff2322088f4c79e8133cc9cd9f3512f4d3a303cbdb5bc585415a00",
"testuser",
"testpassword"
),
)]
fn auth_works(
tmpdir: TempDir,
port: u16,
cli_auth_arg: &str,
client_username: &str,
client_password: &str
) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
.arg(tmpdir.path())
.arg("-p")
.arg(port.to_string())
.arg("-a")
.arg(cli_auth_arg)
.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(client_username, Some(client_password))
.send()?
.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(())
}

#[rstest]
fn uploading_files_works(tmpdir: TempDir, port: u16) -> Result<(), Error> {
let test_file_name = "uploaded test file.txt";

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(())
}
mod fixtures;
use fixtures::*;

#[test]
/// Show help and exit.
Expand Down
39 changes: 39 additions & 0 deletions tests/fixtures/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#![allow(dead_code)]

pub use assert_cmd::prelude::*;
pub use assert_fs::fixture::TempDir;
pub use assert_fs::prelude::*;
pub use clap::{crate_name, crate_version};
pub use port_check::free_local_port;
pub use reqwest;
pub use reqwest::multipart;
pub use rstest::rstest;
pub use select::document::Document;
pub use select::predicate::{Attr, Text};
pub use std::process::{Command, Stdio};
pub use std::thread::sleep;
pub use std::time::Duration;
pub use rstest::rstest_parametrize;

/// Error type used by tests
pub type Error = Box<std::error::Error>;

/// File names for testing purpose
pub static FILES: &[&str] = &["test.txt", "test.html", "test.mkv"];

/// Test fixture which creates a temporary directory with a few files inside.
pub fn tmpdir() -> TempDir {
let tmpdir = assert_fs::TempDir::new().expect("Couldn't create a temp dir for tests");
for &file in FILES {
tmpdir
.child(file)
.write_str("Test Hello Yes")
.expect("Couldn't write to file");
}
tmpdir
}

/// Get a free port.
pub fn port() -> u16 {
free_local_port().expect("Couldn't find a free local port")
}
44 changes: 44 additions & 0 deletions tests/serve_request.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
mod fixtures;
use fixtures::*;

#[rstest]
fn serves_requests_with_no_options(tmpdir: TempDir) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
.arg(tmpdir.path())
.stdout(Stdio::null())
.spawn()?;

sleep(Duration::from_secs(1));

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));
}

child.kill()?;

Ok(())
}

#[rstest]
fn serves_requests_with_non_default_port(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 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(())
}
51 changes: 51 additions & 0 deletions tests/upload_files.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
mod fixtures;
use fixtures::*;

#[rstest]
fn uploading_files_works(tmpdir: TempDir, port: u16) -> Result<(), Error> {
let test_file_name = "uploaded test file.txt";

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(())
}