pub use crate::generated::types::CloudIngestionRequest;
use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION, CONTENT_TYPE};
pub const CLOUDEVENTS_BATCH_CONTENT_TYPE: &str = "application/cloudevents-batch+json";
pub fn build_cloud_headers(
api_key: &secrecy::SecretString,
request_id: &str,
) -> reqwest::header::HeaderMap {
use secrecy::ExposeSecret;
let mut headers = HeaderMap::new();
let auth_value = format!("Bearer {}", api_key.expose_secret());
if let Ok(val) = HeaderValue::from_str(&auth_value) {
headers.insert(AUTHORIZATION, val);
}
headers.insert(
CONTENT_TYPE,
HeaderValue::from_static(CLOUDEVENTS_BATCH_CONTENT_TYPE),
);
if let Ok(val) = HeaderValue::from_str(env!("CARGO_PKG_VERSION")) {
headers.insert("X-Client-Version", val);
}
if let Ok(val) = HeaderValue::from_str(request_id) {
headers.insert("X-Request-ID", val);
}
headers
}
#[cfg(test)]
mod tests {
use super::*;
use secrecy::SecretString;
#[test]
fn test_build_cloud_headers_sets_authorization_bearer() {
let key = SecretString::from("test-api-key".to_string());
let headers = build_cloud_headers(&key, "req-id-123");
let auth = headers
.get("Authorization")
.expect("Authorization header must be present");
let auth_str = auth.to_str().unwrap();
assert!(
auth_str.starts_with("Bearer "),
"Authorization must start with 'Bearer ': {auth_str}"
);
assert!(
auth_str.contains("test-api-key"),
"Authorization must contain the API key"
);
}
#[test]
fn test_build_cloud_headers_sets_content_type_cloudevents_batch() {
let key = SecretString::from("key".to_string());
let headers = build_cloud_headers(&key, "req-id-456");
let ct = headers
.get("Content-Type")
.expect("Content-Type must be present");
assert_eq!(ct.to_str().unwrap(), "application/cloudevents-batch+json");
}
#[test]
fn test_build_cloud_headers_sets_x_client_version() {
let key = SecretString::from("key".to_string());
let headers = build_cloud_headers(&key, "req-id-789");
let ver = headers
.get("X-Client-Version")
.expect("X-Client-Version must be present");
assert!(!ver.to_str().unwrap().is_empty());
}
#[test]
fn test_build_cloud_headers_sets_x_request_id() {
let key = SecretString::from("key".to_string());
let request_id = "01234567-89ab-7cde-f012-3456789abcde";
let headers = build_cloud_headers(&key, request_id);
let rid = headers
.get("X-Request-ID")
.expect("X-Request-ID must be present");
assert_eq!(rid.to_str().unwrap(), request_id);
}
#[test]
fn test_cloud_ingestion_request_is_transparent_array_of_envelopes() {
let batch = CloudIngestionRequest(Vec::new());
let json = serde_json::to_value(&batch).unwrap();
assert!(json.is_array(), "batch must serialise to a JSON array");
assert_eq!(json.as_array().unwrap().len(), 0);
}
}