diff options
author | Sven-Hendrik Haase <svenstaro@gmail.com> | 2025-03-03 03:54:51 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-03 03:54:51 +0000 |
commit | c26b74c8a9f47f86b39a687b20d769e3b349fd8d (patch) | |
tree | 1c562da6fbcba9900ce85e300cc9298a0ddf23c8 /tests | |
parent | Merge pull request #1478 from svenstaro/dependabot/cargo/all-dependencies-65d... (diff) | |
parent | feat: validate temp dir exists through `value_parser` and fixed clippy issues (diff) | |
download | miniserve-c26b74c8a9f47f86b39a687b20d769e3b349fd8d.tar.gz miniserve-c26b74c8a9f47f86b39a687b20d769e3b349fd8d.zip |
Merge pull request #1431 from AlecDivito/upload-progress-bar
feat: Added HTML and Javascript progress bar when uploading files
Diffstat (limited to 'tests')
-rw-r--r-- | tests/upload_files.rs | 94 |
1 files changed, 92 insertions, 2 deletions
diff --git a/tests/upload_files.rs b/tests/upload_files.rs index 5fdf2cf..15730bb 100644 --- a/tests/upload_files.rs +++ b/tests/upload_files.rs @@ -3,6 +3,7 @@ use std::path::Path; use assert_fs::fixture::TempDir; use reqwest::blocking::{multipart, Client}; +use reqwest::header::HeaderMap; use rstest::rstest; use select::document::Document; use select::predicate::{Attr, Text}; @@ -11,8 +12,29 @@ mod fixtures; use crate::fixtures::{server, tmpdir, Error, TestServer}; +// Generate the hashes using the following +// ```bash +// $ sha256 -s 'this should be uploaded' +// $ sha512 -s 'this should be uploaded' +// ``` #[rstest] -fn uploading_files_works(#[with(&["-u"])] server: TestServer) -> Result<(), Error> { +#[case::no_hash(None, None)] +#[case::only_hash(None, Some("test"))] +#[case::partial_sha256_hash(Some("SHA256"), None)] +#[case::partial_sha512_hash(Some("SHA512"), None)] +#[case::sha256_hash( + Some("SHA256"), + Some("e37b14e22e7b3f50dadaf821c189af80f79b1f39fd5a8b3b4f536103735d4620") +)] +#[case::sha512_hash( + Some("SHA512"), + Some("03bcfc52c53904e34e06b95e8c3ee1275c66960c441417892e977d52687e28afae85b6039509060ee07da739e4e7fc3137acd142162c1456f723604f8365e154") +)] +fn uploading_files_works( + #[with(&["-u"])] server: TestServer, + #[case] sha_func: Option<&str>, + #[case] sha: Option<&str>, +) -> Result<(), Error> { let test_file_name = "uploaded test file.txt"; // Before uploading, check whether the uploaded file does not yet exist. @@ -33,7 +55,16 @@ fn uploading_files_works(#[with(&["-u"])] server: TestServer) -> Result<(), Erro .mime_str("text/plain")?; let form = form.part("file_to_upload", part); - let client = Client::new(); + let mut headers = HeaderMap::new(); + if let Some(sha_func) = sha_func.as_ref() { + headers.insert("X-File-Hash-Function", sha_func.parse()?); + } + if let Some(sha) = sha.as_ref() { + headers.insert("X-File-Hash", sha.parse()?); + } + + let client = Client::builder().default_headers(headers).build()?; + client .post(server.url().join(upload_action)?) .multipart(form) @@ -84,6 +115,65 @@ fn uploading_files_is_prevented(server: TestServer) -> Result<(), Error> { Ok(()) } +// Generated hashs with the following +// ```bash +// echo "invalid" | base64 | sha256 +// echo "invalid" | base64 | sha512 +// ``` +#[rstest] +#[case::sha256_hash( + Some("SHA256"), + Some("f4ddf641a44e8fe8248cc086532cafaa8a914a21a937e40be67926ea074b955a") +)] +#[case::sha512_hash( + Some("SHA512"), + Some("d3fe39ab560dd7ba91e6e2f8c948066d696f2afcfc90bf9df32946512f6934079807f301235b88b72bf746b6a88bf111bc5abe5c711514ed0731d286985297ba") +)] +#[case::sha128_hash(Some("SHA128"), Some("invalid"))] +fn uploading_files_with_invalid_sha_func_is_prevented( + #[with(&["-u"])] server: TestServer, + #[case] sha_func: Option<&str>, + #[case] sha: Option<&str>, +) -> Result<(), Error> { + let test_file_name = "uploaded test file.txt"; + + // Before uploading, check whether the uploaded file does not yet exist. + let body = reqwest::blocking::get(server.url())?.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 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 mut headers = HeaderMap::new(); + if let Some(sha_func) = sha_func.as_ref() { + headers.insert("X-File-Hash-Function", sha_func.parse()?); + } + if let Some(sha) = sha.as_ref() { + headers.insert("X-File-Hash", sha.parse()?); + } + + let client = Client::builder().default_headers(headers).build()?; + + assert!(client + .post(server.url().join("/upload?path=/")?) + .multipart(form) + .send()? + .error_for_status() + .is_err()); + + // After uploading, check whether the uploaded file is NOT getting listed. + let body = reqwest::blocking::get(server.url())?; + let parsed = Document::from_read(body)?; + assert!(!parsed.find(Text).any(|x| x.text() == test_file_name)); + + Ok(()) +} + /// This test runs the server with --allowed-upload-dir argument and /// checks that file upload to a different directory is actually prevented. #[rstest] |