use std::sync::Arc;
use bytes::Bytes;
use crate::FileStore;
const TEMP_BODY_A: &[u8] = b"temporary file string";
fn init() {
let _ = env_logger::builder().filter_level(log::LevelFilter::Debug).is_test(true).try_init();
}
#[tokio::test]
async fn test_azure() {
init();
let fs = FileStore::with_limit_retries("azure://alpytest.blob.core.windows.net/pytest/").await.unwrap();
println!("{fs:?}");
assert!(fs.get("__missing_file__").await.unwrap().is_none());
assert!(fs.exists("test").await.unwrap());
assert!(fs.get("test").await.unwrap().is_some());
assert!(fs.put("bob", &Bytes::copy_from_slice(b"bob")).await.is_err());
}
#[tokio::test]
async fn test_azure_emulator() {
init();
let fs = FileStore::with_limit_retries("azure://localhost/?emulator=true&allow_directory_access=true").await.unwrap();
println!("{fs:?}");
common_actions(fs).await
}
#[tokio::test]
async fn test_file() {
let directory = tempfile::tempdir().unwrap();
let url = format!("file://{}", directory.path().to_string_lossy());
println!("{url}");
let fs = FileStore::with_limit_retries(&url).await.unwrap();
common_actions(fs).await
}
#[tokio::test]
async fn test_s3() {
let content = Bytes::copy_from_slice(b"THIS IS A MINIO TEST");
let fs = FileStore::with_limit_retries("s3://al_storage_key:Ch@ngeTh!sPa33w0rd@localhost:9000/?s3_bucket=test&use_ssl=False").await.unwrap();
assert!(fs.delete("al4_minio_pytest.txt").await.is_ok());
assert!(fs.put("al4_minio_pytest.txt", &content).await.is_ok());
assert!(fs.exists("al4_minio_pytest.txt").await.unwrap());
assert_eq!(fs.get("al4_minio_pytest.txt").await.unwrap().unwrap(), content);
assert!(fs.delete("al4_minio_pytest.txt").await.is_ok());
common_actions(fs).await;
}
async fn common_actions(fs: Arc<FileStore>) {
let temp_dir = tempfile::tempdir().unwrap();
assert!(!fs.exists("__missing_file__").await.unwrap());
assert!(fs.get("__missing_file__").await.unwrap().is_none());
assert!(fs.download("__missing_file__", &temp_dir.path().join("local_copy")).await.is_err());
assert!(fs.stream("__missing_file__").await.is_err());
assert!(fs.upload(&temp_dir.path().join("__missing_file__"), "not-to-be-created").await.is_err());
assert!(!fs.exists("not-to-be-created").await.unwrap());
fs.delete("__missing_file__").await.unwrap();
let temp_body_a = Bytes::copy_from_slice(TEMP_BODY_A);
assert!(fs.put("put", &temp_body_a).await.is_ok());
assert_eq!(fs.get("put").await.unwrap().unwrap(), TEMP_BODY_A);
{
let temp_file_a = temp_dir.path().join("a");
tokio::fs::write(&temp_file_a, TEMP_BODY_A).await.unwrap();
let temp_file_b = temp_dir.path().join("b");
tokio::fs::write(&temp_file_b, TEMP_BODY_A).await.unwrap();
let failures = fs.upload_batch(&[
(&temp_file_a, "upload/a"),
(&temp_file_b, "upload/b")
]).await;
assert!(failures.is_empty(), "{failures:?}");
assert!(fs.exists("upload/a").await.unwrap());
assert!(fs.exists("upload/b").await.unwrap());
let temp_file_name = temp_dir.path().join("scratch");
assert!(!temp_file_name.exists());
fs.download("upload/b", &temp_file_name).await.unwrap();
assert_eq!(tokio::fs::read(temp_file_name).await.unwrap(), TEMP_BODY_A);
}
assert!(fs.exists("put").await.unwrap());
fs.delete("put").await.unwrap();
fs.delete("put").await.unwrap();
assert!(!fs.exists("put").await.unwrap());
}