use super::support::live_runtime;
use crate::runtime::core::setup_data::object_request_json;
use uuid::Uuid;
#[tokio::test]
#[ignore = "requires live MinIO+Postgres; run with UDB_LIVE_OBJECT_TESTS=1 ... -- --ignored"]
async fn live_minio_storage_object_delete_roundtrip() {
unsafe {
std::env::set_var(
"UDB_MINIO_ENDPOINT",
std::env::var("UDB_MINIO_ENDPOINT")
.unwrap_or_else(|_| "http://127.0.0.1:19000".to_string()),
);
std::env::set_var(
"UDB_MINIO_ACCESS_KEY",
std::env::var("UDB_MINIO_ACCESS_KEY").unwrap_or_else(|_| "udbminio".to_string()),
);
std::env::set_var(
"UDB_MINIO_SECRET_KEY",
std::env::var("UDB_MINIO_SECRET_KEY").unwrap_or_else(|_| "udbminio123".to_string()),
);
std::env::set_var(
"UDB_MINIO_REGION",
std::env::var("UDB_MINIO_REGION").unwrap_or_else(|_| "us-east-1".to_string()),
);
std::env::set_var("UDB_ALLOW_DEGRADED_BACKENDS", "true");
}
let runtime = live_runtime().await;
let bucket = std::env::var("UDB_STORAGE_BUCKET").unwrap_or_else(|_| "udb-storage".to_string());
let key = format!("ittest/{}.txt", Uuid::new_v4());
let put_req = object_request_json("put", &bucket, &key, "text/plain");
runtime
.put_object_backend_target("minio", None, &put_req, b"hello-udb".to_vec())
.await
.expect("put_object");
let get_req = object_request_json("get", &bucket, &key, "");
let got = runtime
.get_object_backend_target("minio", None, &get_req)
.await
.expect("get_object");
assert_eq!(got, b"hello-udb", "object bytes must round-trip");
let del_req = object_request_json("delete", &bucket, &key, "");
runtime
.delete_object_backend_target("minio", None, "default", &del_req)
.await
.expect("delete_object");
let after = runtime
.get_object_backend_target("minio", None, &get_req)
.await;
assert!(after.is_err(), "object must be gone after delete");
}
#[tokio::test]
#[ignore = "requires live MinIO+Postgres; run with UDB_LIVE_OBJECT_TESTS=1 ... -- --ignored --nocapture"]
async fn live_minio_object_exists_missing_returns_false_not_error() {
unsafe {
std::env::set_var(
"UDB_MINIO_ENDPOINT",
std::env::var("UDB_MINIO_ENDPOINT")
.unwrap_or_else(|_| "http://127.0.0.1:59000".to_string()),
);
std::env::set_var(
"UDB_MINIO_ACCESS_KEY",
std::env::var("UDB_MINIO_ACCESS_KEY").unwrap_or_else(|_| "minio".to_string()),
);
std::env::set_var(
"UDB_MINIO_SECRET_KEY",
std::env::var("UDB_MINIO_SECRET_KEY").unwrap_or_else(|_| "minio123".to_string()),
);
std::env::set_var(
"UDB_MINIO_REGION",
std::env::var("UDB_MINIO_REGION").unwrap_or_else(|_| "us-east-1".to_string()),
);
std::env::set_var("UDB_ALLOW_DEGRADED_BACKENDS", "true");
}
let runtime = live_runtime().await;
let bucket = std::env::var("UDB_STORAGE_BUCKET").unwrap_or_else(|_| "udb-storage".to_string());
let key = format!("exists/{}.txt", Uuid::new_v4());
runtime
.put_object_backend_target(
"minio",
None,
&object_request_json("put", &bucket, &key, "text/plain"),
b"present".to_vec(),
)
.await
.expect("put_object");
let present = runtime
.object_exists_backend_target("minio", "", &bucket, &key)
.await;
assert!(
matches!(present, Ok(Some(_))),
"present object must HEAD as Ok(Some((size, etag))): {present:?}"
);
let missing = runtime
.object_exists_backend_target("minio", "", &bucket, "exists/does-not-exist.txt")
.await;
assert!(
matches!(missing, Ok(None)),
"missing object must HEAD as Ok(None), not an error: {missing:?}"
);
let _ = runtime
.delete_object_backend_target(
"minio",
None,
"default",
&object_request_json("delete", &bucket, &key, ""),
)
.await;
}
#[tokio::test]
#[ignore = "requires live MinIO+Postgres; run with UDB_LIVE_OBJECT_TESTS=1 ... -- --ignored"]
async fn live_minio_presign_put_get_roundtrip() {
unsafe {
std::env::set_var(
"UDB_MINIO_ENDPOINT",
std::env::var("UDB_MINIO_ENDPOINT")
.unwrap_or_else(|_| "http://127.0.0.1:19000".to_string()),
);
std::env::set_var(
"UDB_MINIO_ACCESS_KEY",
std::env::var("UDB_MINIO_ACCESS_KEY").unwrap_or_else(|_| "udbminio".to_string()),
);
std::env::set_var(
"UDB_MINIO_SECRET_KEY",
std::env::var("UDB_MINIO_SECRET_KEY").unwrap_or_else(|_| "udbminio123".to_string()),
);
std::env::set_var(
"UDB_MINIO_REGION",
std::env::var("UDB_MINIO_REGION").unwrap_or_else(|_| "us-east-1".to_string()),
);
std::env::set_var("UDB_ALLOW_DEGRADED_BACKENDS", "true");
}
let runtime = live_runtime().await;
let bucket = std::env::var("UDB_STORAGE_BUCKET").unwrap_or_else(|_| "udb-storage".to_string());
let key = format!("presign/{}.txt", Uuid::new_v4());
let http = reqwest::Client::new();
let (put_url, _) = runtime
.presign_object_backend_target("minio", "default", &bucket, &key, "PUT", "text/plain", 300)
.await
.expect("presign PUT");
assert!(
put_url.starts_with("http"),
"presigned PUT must be an http url"
);
let resp = http
.put(&put_url)
.header("content-type", "text/plain")
.body("via-presign")
.send()
.await
.expect("http PUT");
assert!(
resp.status().is_success(),
"presigned PUT failed: {}",
resp.status()
);
let got = runtime
.get_object_backend_target(
"minio",
None,
&object_request_json("get", &bucket, &key, ""),
)
.await
.expect("get after presigned put");
assert_eq!(got, b"via-presign");
let (get_url, _) = runtime
.presign_object_backend_target("minio", "default", &bucket, &key, "GET", "", 300)
.await
.expect("presign GET");
let body = http
.get(&get_url)
.send()
.await
.expect("http GET")
.bytes()
.await
.expect("http GET body");
assert_eq!(&body[..], b"via-presign");
let _ = runtime
.delete_object_backend_target(
"minio",
None,
"default",
&object_request_json("delete", &bucket, &key, ""),
)
.await;
}