#![allow(clippy::needless_range_loop)]
#[cfg(test)]
mod tests {
use crate::common::{TestMessage, test_utils};
use tokio::runtime::Runtime;
use tonic::{Request, Status, Streaming, metadata::MetadataValue};
use tonic_mock::{
request_with_interceptor, streaming_request, streaming_request_with_interceptor,
};
async fn extract_messages(
request: Request<Streaming<TestMessage>>,
) -> Result<Vec<TestMessage>, Status> {
let mut stream = request.into_inner();
let mut messages = Vec::new();
while let Some(message) = stream.message().await? {
messages.push(message);
}
Ok(messages)
}
#[test]
fn test_streaming_request_empty() {
let rt = Runtime::new().unwrap();
let empty_messages: Vec<TestMessage> = Vec::new();
let request = streaming_request(empty_messages);
let messages = rt.block_on(extract_messages(request)).unwrap();
assert!(messages.is_empty());
}
#[test]
fn test_streaming_request_single() {
let rt = Runtime::new().unwrap();
let message = TestMessage::new("single_id", "single_data");
let messages = vec![message];
let request = streaming_request(messages);
let extracted = rt.block_on(extract_messages(request)).unwrap();
assert_eq!(extracted.len(), 1);
test_utils::assert_message_eq(&extracted[0], "single_id", "single_data");
}
#[test]
fn test_streaming_request_multiple() {
let rt = Runtime::new().unwrap();
let messages = test_utils::create_test_messages(5);
let request = streaming_request(messages);
let extracted = rt.block_on(extract_messages(request)).unwrap();
assert_eq!(extracted.len(), 5);
#[allow(clippy::needless_range_loop)]
for i in 0..5 {
test_utils::assert_message_eq(&extracted[i], i.to_string(), format!("test_data_{}", i));
}
}
#[test]
fn test_request_metadata() {
let messages = test_utils::create_test_messages(1);
let mut request = streaming_request(messages);
let metadata = request.metadata_mut();
metadata.insert("key1", "value1".parse().unwrap());
metadata.insert("key2", "value2".parse().unwrap());
let metadata = request.metadata();
assert_eq!(metadata.get("key1").unwrap(), "value1");
assert_eq!(metadata.get("key2").unwrap(), "value2");
}
#[test]
fn test_streaming_request_with_interceptor() {
let messages = test_utils::create_test_messages(3);
let request = streaming_request_with_interceptor(messages, |req| {
req.metadata_mut()
.insert("auth", MetadataValue::from_static("Bearer test-token"));
req.metadata_mut()
.insert("custom-header", MetadataValue::from_static("custom-value"));
});
let metadata = request.metadata();
assert_eq!(
metadata.get("auth").unwrap().to_str().unwrap(),
"Bearer test-token"
);
assert_eq!(
metadata.get("custom-header").unwrap().to_str().unwrap(),
"custom-value"
);
let rt = Runtime::new().unwrap();
let extracted = rt.block_on(extract_messages(request)).unwrap();
assert_eq!(extracted.len(), 3);
for i in 0..3 {
test_utils::assert_message_eq(&extracted[i], i.to_string(), format!("test_data_{}", i));
}
}
#[test]
fn test_request_with_interceptor() {
let message = TestMessage::new("test_id", "test_data");
let request = request_with_interceptor(message, |req| {
req.metadata_mut()
.insert("auth", MetadataValue::from_static("Bearer different-token"));
});
let metadata = request.metadata();
assert_eq!(
metadata.get("auth").unwrap().to_str().unwrap(),
"Bearer different-token"
);
let inner_message = request.into_inner();
test_utils::assert_message_eq(&inner_message, "test_id", "test_data");
}
}