mod fixtures;
mod utils;
use fixtures::{server, Error, TestServer, FILES};
use rstest::rstest;
use xml::escape::escape_str_pcdata;
#[rstest]
fn propfind_dir(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPFIND", format!("{}dir1", server.url())).send()?;
assert_eq!(resp.status(), 207);
let body = resp.text()?;
assert!(body.contains("/dir1/"));
assert!(body.contains("dir1"));
for f in FILES {
assert!(body.contains(&format!("/dir1/{}", utils::encode_uri(f))));
assert!(body.contains(&format!(
"{}",
escape_str_pcdata(f)
)));
}
Ok(())
}
#[rstest]
fn propfind_dir_depth0(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPFIND", format!("{}dir1", server.url()))
.header("depth", "0")
.send()?;
assert_eq!(resp.status(), 207);
let body = resp.text()?;
assert!(body.contains("/dir1/"));
assert!(body.contains("dir1"));
assert_eq!(
body.lines()
.filter(|v| *v == "HTTP/1.1 200 OK")
.count(),
1
);
Ok(())
}
#[rstest]
fn propfind_dir_depth2(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPFIND", format!("{}dir1", server.url()))
.header("depth", "2")
.send()?;
assert_eq!(resp.status(), 400);
let body = resp.text()?;
assert_eq!(body, "Invalid depth: only 0 and 1 are allowed.");
Ok(())
}
#[rstest]
fn propfind_404(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPFIND", format!("{}404", server.url())).send()?;
assert_eq!(resp.status(), 404);
Ok(())
}
#[rstest]
fn propfind_double_slash(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPFIND", server.url()).send()?;
assert_eq!(resp.status(), 207);
Ok(())
}
#[rstest]
fn propfind_file(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPFIND", format!("{}test.html", server.url())).send()?;
assert_eq!(resp.status(), 207);
let body = resp.text()?;
assert!(body.contains("/test.html"));
assert!(body.contains("test.html"));
assert_eq!(
body.lines()
.filter(|v| *v == "HTTP/1.1 200 OK")
.count(),
1
);
Ok(())
}
#[rstest]
fn proppatch_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPPATCH", format!("{}test.html", server.url())).send()?;
assert_eq!(resp.status(), 207);
let body = resp.text()?;
assert!(body.contains("/test.html"));
Ok(())
}
#[rstest]
fn proppatch_404(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"PROPPATCH", format!("{}404", server.url())).send()?;
assert_eq!(resp.status(), 404);
Ok(())
}
#[rstest]
fn mkcol_dir(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"MKCOL", format!("{}newdir", server.url())).send()?;
assert_eq!(resp.status(), 201);
Ok(())
}
#[rstest]
fn mkcol_not_allow_upload(server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"MKCOL", format!("{}newdir", server.url())).send()?;
assert_eq!(resp.status(), 403);
Ok(())
}
#[rstest]
fn mkcol_already_exists(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"MKCOL", format!("{}dir1", server.url())).send()?;
assert_eq!(resp.status(), 405);
Ok(())
}
#[rstest]
fn copy_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"COPY", format!("{}test.html", server.url()))
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 204);
let resp = reqwest::blocking::get(new_url)?;
assert_eq!(resp.status(), 200);
Ok(())
}
#[rstest]
fn copy_not_allow_upload(server: TestServer) -> Result<(), Error> {
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"COPY", format!("{}test.html", server.url()))
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 403);
Ok(())
}
#[rstest]
fn copy_file_404(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"COPY", format!("{}404", server.url()))
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 404);
Ok(())
}
#[rstest]
fn move_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let origin_url = format!("{}test.html", server.url());
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"MOVE", &origin_url)
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 204);
let resp = reqwest::blocking::get(new_url)?;
assert_eq!(resp.status(), 200);
let resp = reqwest::blocking::get(origin_url)?;
assert_eq!(resp.status(), 404);
Ok(())
}
#[rstest]
fn move_not_allow_upload(#[with(&["--allow-delete"])] server: TestServer) -> Result<(), Error> {
let origin_url = format!("{}test.html", server.url());
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"MOVE", &origin_url)
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 403);
Ok(())
}
#[rstest]
fn move_not_allow_delete(#[with(&["--allow-upload"])] server: TestServer) -> Result<(), Error> {
let origin_url = format!("{}test.html", server.url());
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"MOVE", &origin_url)
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 403);
Ok(())
}
#[rstest]
fn move_file_404(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let new_url = format!("{}test2.html", server.url());
let resp = fetch!(b"MOVE", format!("{}404", server.url()))
.header("Destination", &new_url)
.send()?;
assert_eq!(resp.status(), 404);
Ok(())
}
#[rstest]
fn lock_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"LOCK", format!("{}test.html", server.url())).send()?;
assert_eq!(resp.status(), 200);
let body = resp.text()?;
assert!(body.contains("/test.html"));
Ok(())
}
#[rstest]
fn lock_file_404(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"LOCK", format!("{}404", server.url())).send()?;
assert_eq!(resp.status(), 404);
Ok(())
}
#[rstest]
fn unlock_file(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"LOCK", format!("{}test.html", server.url())).send()?;
assert_eq!(resp.status(), 200);
Ok(())
}
#[rstest]
fn unlock_file_404(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
let resp = fetch!(b"LOCK", format!("{}404", server.url())).send()?;
assert_eq!(resp.status(), 404);
Ok(())
}