mirror of
https://github.com/sigoden/dufs.git
synced 2026-04-09 00:59:02 +03:00
@@ -11,9 +11,12 @@ use std::time::{Duration, Instant};
|
||||
#[allow(dead_code)]
|
||||
pub type Error = Box<dyn std::error::Error>;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub const BIN_FILE: &str = "😀.bin";
|
||||
|
||||
/// File names for testing purpose
|
||||
#[allow(dead_code)]
|
||||
pub static FILES: &[&str] = &["test.txt", "test.html", "index.html", "😀.bin"];
|
||||
pub static FILES: &[&str] = &["test.txt", "test.html", "index.html", BIN_FILE];
|
||||
|
||||
/// Directory names for testing directory don't exist
|
||||
#[allow(dead_code)]
|
||||
@@ -42,10 +45,17 @@ pub static DIRECTORIES: &[&str] = &["dir1/", "dir2/", "dir3/", DIR_NO_INDEX, DIR
|
||||
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(&format!("This is {file}"))
|
||||
.expect("Couldn't write to file");
|
||||
if *file == BIN_FILE {
|
||||
tmpdir
|
||||
.child(file)
|
||||
.write_binary(b"bin\0\0123")
|
||||
.expect("Couldn't write to file");
|
||||
} else {
|
||||
tmpdir
|
||||
.child(file)
|
||||
.write_str(&format!("This is {file}"))
|
||||
.expect("Couldn't write to file");
|
||||
}
|
||||
}
|
||||
for directory in DIRECTORIES {
|
||||
if *directory == DIR_ASSETS {
|
||||
@@ -58,10 +68,17 @@ pub fn tmpdir() -> TempDir {
|
||||
if *directory == DIR_NO_INDEX && *file == "index.html" {
|
||||
continue;
|
||||
}
|
||||
tmpdir
|
||||
.child(format!("{directory}{file}"))
|
||||
.write_str(&format!("This is {directory}{file}"))
|
||||
.expect("Couldn't write to file");
|
||||
if *file == BIN_FILE {
|
||||
tmpdir
|
||||
.child(format!("{directory}{file}"))
|
||||
.write_binary(b"bin\0\0123")
|
||||
.expect("Couldn't write to file");
|
||||
} else {
|
||||
tmpdir
|
||||
.child(format!("{directory}{file}"))
|
||||
.write_str(&format!("This is {directory}{file}"))
|
||||
.expect("Couldn't write to file");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
mod fixtures;
|
||||
mod utils;
|
||||
|
||||
use fixtures::{server, Error, TestServer};
|
||||
use fixtures::{server, Error, TestServer, BIN_FILE};
|
||||
use rstest::rstest;
|
||||
use serde_json::Value;
|
||||
use utils::retrive_edit_file;
|
||||
|
||||
#[rstest]
|
||||
fn get_dir(server: TestServer) -> Result<(), Error> {
|
||||
@@ -103,12 +104,12 @@ fn get_dir_search(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
|
||||
|
||||
#[rstest]
|
||||
fn get_dir_search2(#[with(&["-A"])] server: TestServer) -> Result<(), Error> {
|
||||
let resp = reqwest::blocking::get(format!("{}?q={}", server.url(), "😀.bin"))?;
|
||||
let resp = reqwest::blocking::get(format!("{}?q={BIN_FILE}", server.url()))?;
|
||||
assert_eq!(resp.status(), 200);
|
||||
let paths = utils::retrieve_index_paths(&resp.text()?);
|
||||
assert!(!paths.is_empty());
|
||||
for p in paths {
|
||||
assert!(p.contains("😀.bin"));
|
||||
assert!(p.contains(BIN_FILE));
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
@@ -177,6 +178,24 @@ fn get_file_404(server: TestServer) -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
fn get_file_edit(server: TestServer) -> Result<(), Error> {
|
||||
let resp = fetch!(b"GET", format!("{}index.html?edit", server.url())).send()?;
|
||||
assert_eq!(resp.status(), 200);
|
||||
let editable = retrive_edit_file(&resp.text().unwrap()).unwrap();
|
||||
assert!(editable);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
fn get_file_edit_bin(server: TestServer) -> Result<(), Error> {
|
||||
let resp = fetch!(b"GET", format!("{}{BIN_FILE}?edit", server.url())).send()?;
|
||||
assert_eq!(resp.status(), 200);
|
||||
let editable = retrive_edit_file(&resp.text().unwrap()).unwrap();
|
||||
assert!(!editable);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
fn head_file_404(server: TestServer) -> Result<(), Error> {
|
||||
let resp = fetch!(b"HEAD", format!("{}404", server.url())).send()?;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
mod fixtures;
|
||||
mod utils;
|
||||
|
||||
use fixtures::{server, Error, TestServer, DIR_NO_FOUND, DIR_NO_INDEX, FILES};
|
||||
use fixtures::{server, Error, TestServer, BIN_FILE, DIR_NO_FOUND, DIR_NO_INDEX, FILES};
|
||||
use rstest::rstest;
|
||||
|
||||
#[rstest]
|
||||
@@ -56,11 +56,10 @@ fn render_try_index3(
|
||||
#[case(server(&["--render-try-index"] as &[&str]), false)]
|
||||
#[case(server(&["--render-try-index", "--allow-search"] as &[&str]), true)]
|
||||
fn render_try_index4(#[case] server: TestServer, #[case] searched: bool) -> Result<(), Error> {
|
||||
let resp = reqwest::blocking::get(format!("{}{}?q={}", server.url(), DIR_NO_INDEX, "😀.bin"))?;
|
||||
let resp = reqwest::blocking::get(format!("{}{}?q={}", server.url(), DIR_NO_INDEX, BIN_FILE))?;
|
||||
assert_eq!(resp.status(), 200);
|
||||
let paths = utils::retrieve_index_paths(&resp.text()?);
|
||||
assert!(!paths.is_empty());
|
||||
assert_eq!(paths.iter().all(|v| v.contains("😀.bin")), searched);
|
||||
assert_eq!(paths.iter().all(|v| v.contains(BIN_FILE)), searched);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
@@ -25,24 +25,13 @@ macro_rules! fetch {
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn retrieve_index_paths(index: &str) -> IndexSet<String> {
|
||||
retrieve_index_paths_impl(index).unwrap_or_default()
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn encode_uri(v: &str) -> String {
|
||||
let parts: Vec<_> = v.split('/').map(urlencoding::encode).collect();
|
||||
parts.join("/")
|
||||
}
|
||||
|
||||
fn retrieve_index_paths_impl(index: &str) -> Option<IndexSet<String>> {
|
||||
let lines: Vec<&str> = index.lines().collect();
|
||||
let line = lines.iter().find(|v| v.contains("DATA ="))?;
|
||||
let line_col = line.find("DATA =").unwrap() + 6;
|
||||
let value: Value = line[line_col..].parse().ok()?;
|
||||
pub fn retrieve_index_paths(content: &str) -> IndexSet<String> {
|
||||
let value = retrive_json(content).unwrap();
|
||||
let paths = value
|
||||
.get("paths")?
|
||||
.as_array()?
|
||||
.get("paths")
|
||||
.unwrap()
|
||||
.as_array()
|
||||
.unwrap()
|
||||
.iter()
|
||||
.flat_map(|v| {
|
||||
let name = v.get("name")?.as_str()?;
|
||||
@@ -54,5 +43,26 @@ fn retrieve_index_paths_impl(index: &str) -> Option<IndexSet<String>> {
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
Some(paths)
|
||||
paths
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn retrive_edit_file(content: &str) -> Option<bool> {
|
||||
let value = retrive_json(content)?;
|
||||
let value = value.get("editable").unwrap();
|
||||
Some(value.as_bool().unwrap())
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn encode_uri(v: &str) -> String {
|
||||
let parts: Vec<_> = v.split('/').map(urlencoding::encode).collect();
|
||||
parts.join("/")
|
||||
}
|
||||
|
||||
fn retrive_json(content: &str) -> Option<Value> {
|
||||
let lines: Vec<&str> = content.lines().collect();
|
||||
let line = lines.iter().find(|v| v.contains("DATA ="))?;
|
||||
let line_col = line.find("DATA =").unwrap() + 6;
|
||||
let value: Value = line[line_col..].parse().unwrap();
|
||||
Some(value)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user