Files
r2client/tests/r2_tests.rs

138 lines
4.7 KiB
Rust

use std::env;
use std::fs;
use std::io::Write;
fn create_test_file(path: &str, content: &str) {
let mut file = fs::File::create(path).unwrap();
file.write_all(content.as_bytes()).unwrap();
}
#[cfg(feature = "sync")]
mod sync_tests {
use super::create_test_file;
use r2client::sync::R2Bucket;
use std::env;
use std::fs;
fn setup_bucket() -> R2Bucket {
dotenv::dotenv().ok();
let bucket = env::var("R2_BUCKET").expect("R2_BUCKET not set for integration tests");
let access_key = env::var("R2_ACCESS_KEY").expect("R2_ACCESS_KEY not set");
let secret_key = env::var("R2_SECRET_KEY").expect("R2_SECRET_KEY not set");
let endpoint = env::var("R2_ENDPOINT").expect("R2_ENDPOINT not set");
R2Bucket::from_credentials(bucket, access_key, secret_key, endpoint)
}
#[test]
fn test_sync_e2e() {
let bucket = setup_bucket();
let test_content = "Hello, R2 sync world!";
let local_upload_path = "test_upload_sync.txt";
let r2_file_key = "test/test_upload_sync.txt";
let local_download_path = "test_download_sync.txt";
create_test_file(local_upload_path, test_content);
// 1. Upload file
bucket
.upload_file(local_upload_path, r2_file_key)
.expect("Sync upload failed");
// 2. List files and check if it exists
let files = bucket.list_files().expect("Sync list_files failed");
assert!(
files
.get("test")
.unwrap()
.contains(&"test_upload_sync.txt".to_string())
);
// 3. List folders and check if it exists
let folders = bucket.list_folders().expect("Sync list_folders failed");
assert!(folders.contains(&"test".to_string()));
// 4. Download file
bucket
.download_file(r2_file_key, local_download_path)
.expect("Sync download failed");
// 5. Verify content
let downloaded_content = fs::read_to_string(local_download_path).unwrap();
assert_eq!(test_content, downloaded_content);
// Cleanup
fs::remove_file(local_upload_path).unwrap();
fs::remove_file(local_download_path).unwrap();
// NOTE: The test file on R2 is not deleted as there is no delete API yet.
}
}
#[cfg(feature = "async")]
mod async_tests {
use super::create_test_file;
use r2client::R2Bucket;
use std::env;
use std::fs;
fn setup_bucket() -> R2Bucket {
dotenv::dotenv().ok();
let bucket = env::var("R2_BUCKET").expect("R2_BUCKET not set for integration tests");
let access_key = env::var("R2_ACCESS_KEY").expect("R2_ACCESS_KEY not set");
let secret_key = env::var("R2_SECRET_KEY").expect("R2_SECRET_KEY not set");
let endpoint = env::var("R2_ENDPOINT").expect("R2_ENDPOINT not set");
R2Bucket::from_credentials(bucket, access_key, secret_key, endpoint)
}
#[tokio::test]
async fn test_async_e2e() {
let bucket = setup_bucket();
let test_content = "Hello, R2 async world!";
let local_upload_path = "test_upload_async.txt";
let r2_file_key = "test/test_upload_async.txt";
let local_download_path = "test_download_async.txt";
create_test_file(local_upload_path, test_content);
// 0. List files to see if a get request will go through lol
let files = bucket.list_files().await.expect("Async list_files failed");
println!("{files:#?}");
// 1. Upload file
bucket
.upload_file(local_upload_path, r2_file_key)
.await
.expect("Async upload failed");
// 2. List files and check if it exists
let files = bucket.list_files().await.expect("Async list_files failed");
assert!(
files
.get("test")
.unwrap()
.contains(&"test_upload_async.txt".to_string())
);
// 3. List folders and check if it exists
let folders = bucket
.list_folders()
.await
.expect("Async list_folders failed");
assert!(folders.contains(&"test".to_string()));
// 4. Download file
bucket
.download_file(r2_file_key, local_download_path)
.await
.expect("Async download failed");
// 5. Verify content
let downloaded_content = fs::read_to_string(local_download_path).unwrap();
assert_eq!(test_content, downloaded_content);
// Cleanup
fs::remove_file(local_upload_path).unwrap();
fs::remove_file(local_download_path).unwrap();
// NOTE: The test file on R2 is not deleted as there is no delete API yet.
}
}