use std::path::{Path, PathBuf};
use active_storage::{errors::DriverError, store::Store};
pub async fn test_driver(driver: &Store, location: PathBuf) {
let foo_directory = location.join("foo");
let foo_directory_file_1 = foo_directory.join("foo_file-1.txt");
assert_unknown_files(driver).await;
assert_write_file(driver, &foo_directory_file_1).await;
assert_last_modified(driver, location.as_path()).await;
assert_delete_file(driver, foo_directory_file_1.as_path()).await;
assert_directories(driver, location.as_path()).await;
}
async fn assert_write_file(driver: &Store, file: &Path) {
assert!(
driver.write(file, b"content").await.is_ok(),
"file should be written"
);
assert!(
driver.file_exists(file).await.unwrap(),
"file should be found"
);
assert_eq!(
driver.read::<String>(file).await.unwrap(),
"content".to_string(),
"invalid file content"
);
}
async fn assert_delete_file(driver: &Store, path: &Path) {
assert!(driver.delete(path).await.is_ok(), "file should be deleted");
assert!(
!driver.file_exists(path).await.unwrap(),
"file should not exist after deletion"
);
}
async fn assert_last_modified(driver: &Store, path: &Path) {
let file = path.join("file.txt");
assert!(
driver.write(file.as_path(), b"content").await.is_ok(),
"file should be written"
);
assert!(
driver
.last_modified(file.as_path())
.await
.unwrap()
.elapsed()
.unwrap()
.as_secs()
< 1,
"last modified file should be less then 1 second"
);
}
async fn assert_directories(driver: &Store, path: &Path) {
let foo_directory = path.join("foo");
let bar_directory = path.join("bar");
let foo_directory_file_1 = foo_directory.join("foo_file-1.txt");
let bar_directory_file_1 = bar_directory.join("bar_file-1.txt");
let bar_directory_file_2 = bar_directory.join("bar_file-2.txt");
driver
.write(foo_directory_file_1.as_path(), b"content")
.await
.unwrap();
driver
.write(bar_directory_file_1.as_path(), b"content")
.await
.unwrap();
driver
.write(bar_directory_file_2.as_path(), b"content")
.await
.unwrap();
assert!(
driver
.delete_directory(bar_directory.as_path())
.await
.is_ok(),
"expected bar directory to be deleted"
);
assert!(
driver
.file_exists(foo_directory_file_1.as_path())
.await
.unwrap(),
"foo file should be exists after bar directory deletion"
);
assert!(
!driver
.file_exists(bar_directory_file_1.as_path())
.await
.unwrap(),
"bar file should be deleted after bar directory deletion"
);
assert!(
!driver
.file_exists(bar_directory_file_2.as_path())
.await
.unwrap(),
"bar file should be deleted after bar directory deletion"
);
}
async fn assert_unknown_files(driver: &Store) {
let path = PathBuf::from("unknown").join("file.txt");
assert!(
!driver.file_exists(path.as_path()).await.unwrap(),
"file should not exists"
);
assert!(matches!(
driver.delete(path.as_path()).await,
Err(DriverError::ResourceNotFound)
));
assert!(matches!(
driver.delete_directory(path.as_path()).await,
Err(DriverError::ResourceNotFound)
));
assert!(matches!(
driver.last_modified(path.as_path()).await,
Err(DriverError::ResourceNotFound)
));
}