Testing with atrg-testing
The atrg-testing crate provides utilities for fast, deterministic handler tests.
Setup
[dev-dependencies]
atrg-testing = "0.1"
Test State
use atrg_testing::{test_state, seed_session};
#[tokio::test]
async fn test_my_handler() {
let state = test_state().await; // in-memory SQLite, all migrations applied
// Seed an authenticated session
let session_id = seed_session(&state.db, "did:plc:test", "test.user").await;
// Build router and test with oneshot
let app = Router::new()
.route("/api/me", get(my_handler))
.with_state(state);
let resp = app.oneshot(
Request::get("/api/me")
.header("authorization", format!("Bearer {session_id}"))
.body(Body::empty())
.unwrap()
).await.unwrap();
assert_eq!(resp.status(), 200);
}
Mock Client
use atrg_testing::MockAtprotoClient;
let mock = MockAtprotoClient::new();
mock.returns("get_record", "app.bsky.feed.post/abc", json!({"text": "hello"}));
let result = mock.get_record("app.bsky.feed.post", "abc").unwrap();
mock.assert_called("get_record", "app.bsky.feed.post/abc", 1);
Fake Jetstream
use atrg_testing::FakeJetstream;
let mut fake = FakeJetstream::new(10);
let mut rx = fake.take_receiver().unwrap();
fake.emit_post("did:plc:test", "abc123", "hello world").await.unwrap();
let event = rx.recv().await.unwrap();