use std::sync::Arc;
use std::time::Duration;
use async_trait::async_trait;
use camel_api::{BodyType, BoxProcessor, CamelError, Exchange};
use crate::ProducerContext;
use crate::consumer::Consumer;
use crate::runtime_observability::RuntimeObservability;
#[async_trait]
pub trait PollingConsumer: Send + Sync {
async fn receive(&mut self, timeout: Duration) -> Result<Option<Exchange>, CamelError>;
}
pub trait Endpoint: Send + Sync {
fn uri(&self) -> &str;
fn create_consumer(
&self,
rt: Arc<dyn RuntimeObservability>,
) -> Result<Box<dyn Consumer>, CamelError>;
fn create_producer(
&self,
rt: Arc<dyn RuntimeObservability>,
ctx: &ProducerContext,
) -> Result<BoxProcessor, CamelError>;
fn body_contract(&self) -> Option<BodyType> {
None
}
fn polling_consumer(&self) -> Option<Box<dyn PollingConsumer>> {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ComponentContext;
use crate::test_support::PanicRuntimeObservability;
struct MockEndpoint {
uri: String,
}
impl MockEndpoint {
fn new(uri: &str) -> Self {
Self {
uri: uri.to_string(),
}
}
}
impl Endpoint for MockEndpoint {
fn uri(&self) -> &str {
&self.uri
}
fn create_consumer(
&self,
_rt: Arc<dyn crate::RuntimeObservability>,
) -> Result<Box<dyn Consumer>, CamelError> {
Err(CamelError::EndpointCreationFailed("mock".into()))
}
fn create_producer(
&self,
_rt: Arc<dyn crate::RuntimeObservability>,
_ctx: &ProducerContext,
) -> Result<BoxProcessor, CamelError> {
Err(CamelError::ProcessorError("mock".into()))
}
}
#[test]
fn mock_endpoint_polling_consumer_returns_none() {
let ep = MockEndpoint::new("mock://test");
assert!(ep.polling_consumer().is_none());
}
#[test]
fn mock_endpoint_body_contract_default_is_none() {
let ep = MockEndpoint::new("mock://test");
assert!(ep.body_contract().is_none());
}
#[test]
fn mock_endpoint_uri() {
let ep = MockEndpoint::new("mock://test");
assert_eq!(ep.uri(), "mock://test");
}
#[test]
fn mock_endpoint_create_consumer_errors() {
let ep = MockEndpoint::new("mock://test");
let rt: Arc<dyn crate::RuntimeObservability> = Arc::new(PanicRuntimeObservability);
let result = ep.create_consumer(rt);
assert!(result.is_err());
}
#[test]
fn mock_endpoint_create_producer_errors() {
let ep = MockEndpoint::new("mock://test");
let ctx = ProducerContext::new();
let rt: Arc<dyn crate::RuntimeObservability> = Arc::new(PanicRuntimeObservability);
let result = ep.create_producer(rt, &ctx);
assert!(result.is_err());
}
#[test]
fn component_context_noop_can_be_constructed() {
let _ctx = crate::NoOpComponentContext;
}
#[test]
fn component_context_noop_resolve_returns_none() {
let ctx = crate::NoOpComponentContext;
assert!(ctx.resolve_component("anything").is_none());
assert!(ctx.resolve_language("anything").is_none());
}
}