aboutsummaryrefslogtreecommitdiffstats
path: root/tests/webdav.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/webdav.rs')
-rw-r--r--tests/webdav.rs150
1 files changed, 150 insertions, 0 deletions
diff --git a/tests/webdav.rs b/tests/webdav.rs
new file mode 100644
index 0000000..09d04e9
--- /dev/null
+++ b/tests/webdav.rs
@@ -0,0 +1,150 @@
+use std::process::Command;
+
+use assert_cmd::prelude::*;
+use assert_fs::TempDir;
+use predicates::str::contains;
+use reqwest::{blocking::Client, Method};
+use reqwest_dav::{
+ list_cmd::{ListEntity, ListFile, ListFolder},
+ ClientBuilder as DavClientBuilder,
+};
+use rstest::rstest;
+
+mod fixtures;
+
+use crate::fixtures::{
+ server, tmpdir, Error, TestServer, DIRECTORIES, DIRECTORY_SYMLINK, FILES, FILE_SYMLINK,
+ HIDDEN_DIRECTORIES, HIDDEN_FILES,
+};
+
+#[rstest]
+#[case(server(&["--enable-webdav"]), true)]
+#[case(server(&[] as &[&str]), false)]
+fn webdav_flag_works(
+ #[case] server: TestServer,
+ #[case] should_respond: bool,
+) -> Result<(), Error> {
+ let client = Client::new();
+ let response = client
+ .request(Method::from_bytes(b"PROPFIND").unwrap(), server.url())
+ .header("Depth", "1")
+ .send()?;
+
+ assert_eq!(should_respond, response.status().is_success());
+
+ Ok(())
+}
+
+#[rstest]
+fn webdav_advertised_in_options(
+ #[with(&["--enable-webdav"])] server: TestServer,
+) -> Result<(), Error> {
+ let response = Client::new()
+ .request(Method::OPTIONS, server.url())
+ .send()?
+ .error_for_status()?;
+
+ let headers = response.headers();
+ let allow = headers.get("allow").unwrap().to_str()?;
+
+ assert!(allow.contains("OPTIONS") && allow.contains("PROPFIND"));
+ assert!(headers.get("dav").is_some());
+
+ Ok(())
+}
+
+fn list_webdav(url: url::Url, path: &str) -> Result<Vec<ListEntity>, reqwest_dav::Error> {
+ let client = DavClientBuilder::new().set_host(url.to_string()).build()?;
+
+ let rt = tokio::runtime::Runtime::new().unwrap();
+
+ rt.block_on(async { client.list(path, reqwest_dav::Depth::Number(1)).await })
+}
+
+#[rstest]
+#[case(server(&["--enable-webdav"]), false)]
+#[case(server(&["--enable-webdav", "--hidden"]), true)]
+fn webdav_respects_hidden_flag(
+ #[case] server: TestServer,
+ #[case] hidden_should_show: bool,
+) -> Result<(), Error> {
+ let list = list_webdav(server.url(), "/")?;
+
+ assert_eq!(
+ hidden_should_show,
+ list.iter().any(|el|
+ matches!(el, ListEntity::File(ListFile { href, .. }) if href.contains(HIDDEN_FILES[0]))
+ )
+ );
+
+ assert_eq!(
+ hidden_should_show,
+ list.iter().any(|el|
+ matches!(el, ListEntity::Folder(ListFolder { href, .. }) if href.contains(HIDDEN_DIRECTORIES[0]))
+ )
+ );
+
+ Ok(())
+}
+
+#[rstest]
+#[case(server(&["--enable-webdav"]), true)]
+#[should_panic]
+#[case(server(&["--enable-webdav", "--no-symlinks"]), false)]
+fn webdav_respects_no_symlink_flag(#[case] server: TestServer, #[case] symlinks_should_show: bool) {
+ let list = list_webdav(server.url(), "/").unwrap();
+
+ assert_eq!(
+ symlinks_should_show,
+ list.iter().any(|el|
+ matches!(el, ListEntity::File(ListFile { href, .. }) if href.contains(FILE_SYMLINK))
+ ),
+ );
+
+ assert_eq!(
+ symlinks_should_show,
+ list.iter().any(|el|
+ matches!(el, ListEntity::Folder(ListFolder { href, .. }) if href.contains(DIRECTORY_SYMLINK))
+ ),
+ );
+
+ let list_linked = list_webdav(server.url(), &format!("/{}", DIRECTORY_SYMLINK));
+
+ assert_eq!(symlinks_should_show, list_linked.is_ok());
+}
+
+#[rstest]
+fn webdav_works_with_route_prefix(
+ #[with(&["--enable-webdav", "--route-prefix", "test-prefix"])] server: TestServer,
+) -> Result<(), Error> {
+ let prefixed_list = list_webdav(server.url().join("test-prefix")?, "/")?;
+
+ assert!(
+ prefixed_list.iter().any(|el|
+ matches!(el, ListEntity::Folder(ListFolder { href, .. }) if href.contains(DIRECTORIES[0]))
+ )
+ );
+
+ let root_list = list_webdav(server.url(), "/");
+
+ assert!(root_list.is_err());
+
+ Ok(())
+}
+
+// timeout is used in case the binary does not exit as expected and starts waiting for requests
+#[rstest]
+#[timeout(std::time::Duration::from_secs(1))]
+fn webdav_single_file_refuses_starting(tmpdir: TempDir) {
+ Command::cargo_bin("miniserve")
+ .unwrap()
+ .current_dir(tmpdir.path())
+ .arg(FILES[0])
+ .arg("--enable-webdav")
+ .assert()
+ .failure()
+ .stderr(contains(format!(
+ "Error: The --enable-webdav option was provided, but the serve path '{}' is a file",
+ FILES[0]
+ )));
+}