# camel-test
Testing utilities for [rust-camel](https://github.com/rust-camel/rust-camel).
## Overview
`camel-test` provides two main utilities:
1. **`CamelTestContext`** — a test harness that removes boilerplate: registers components, provides simple start/stop methods, and exposes a shared `MockComponent` for assertions.
2. **`TimeController`** — deterministic time control for timer-based tests using tokio's built-in mock clock (no real `sleep` calls).
## Basic usage
```rust
use camel_test::CamelTestContext;
use camel_builder::{RouteBuilder, StepAccumulator};
use std::time::Duration;
#[tokio::test]
async fn test_route() {
let h = CamelTestContext::builder()
.with_timer()
.with_mock()
.build()
.await;
let route = RouteBuilder::from("timer:tick?period=50&repeatCount=3")
.to("mock:result")
.build()
.unwrap();
h.add_route(route).await.unwrap();
h.start().await;
tokio::time::sleep(Duration::from_millis(300)).await;
h.mock().get_endpoint("result").unwrap().assert_exchange_count(3).await;
h.stop().await; // deterministic teardown (drop is best-effort fallback)
}
```
## With time control
```rust
use camel_test::CamelTestContext;
use camel_builder::{RouteBuilder, StepAccumulator};
use std::time::Duration;
#[tokio::test]
async fn test_route_fast() {
let (h, time) = CamelTestContext::builder()
.with_timer()
.with_mock()
.with_time_control()
.build()
.await;
let route = RouteBuilder::from("timer:tick?period=50&repeatCount=3")
.to("mock:result")
.build()
.unwrap();
h.add_route(route).await.unwrap();
h.start().await;
time.advance(Duration::from_millis(200)).await; // no real sleep
tokio::task::yield_now().await;
h.mock().get_endpoint("result").unwrap().assert_exchange_count(3).await;
}
```
## Available builder methods
| `.with_mock()` | Signals mock usage (always registered) |
| `.with_timer()` | Registers `TimerComponent` |
| `.with_log()` | Registers `LogComponent` |
| `.with_direct()` | Registers `DirectComponent` |
| `.with_component(c)` | Registers any custom component |
| `.with_time_control()` | Activates tokio mock clock; `build()` returns `(harness, TimeController)` |
## Installation
Add to your `Cargo.toml`:
```toml
[dev-dependencies]
camel-test = "0.5"
```