// Shared test helpers. Each integration test binary picks the subset it needs, // so dead-code lints on the unused helpers fire per-binary; suppress at the // module level. #![allow(dead_code)] use std::sync::Arc; use axum::body::Body; use axum::http::Request; use axum::Router; use http_body_util::BodyExt; use sqlx::PgPool; use tempfile::TempDir; use mangalord::app::{router, AppState}; use mangalord::storage::LocalStorage; pub struct Harness { pub app: Router, // Kept alive for the lifetime of the test so the temp dir is not dropped. pub _storage_dir: TempDir, } pub fn harness(pool: PgPool) -> Harness { let storage_dir = tempfile::tempdir().expect("tempdir"); let state = AppState { db: pool, storage: Arc::new(LocalStorage::new(storage_dir.path())), }; Harness { app: router(state), _storage_dir: storage_dir } } pub async fn body_json(response: axum::response::Response) -> serde_json::Value { let bytes = response.into_body().collect().await.unwrap().to_bytes(); serde_json::from_slice(&bytes).expect("body is JSON") } pub fn get(uri: &str) -> Request { Request::builder().uri(uri).body(Body::empty()).unwrap() } pub fn post_json(uri: &str, body: serde_json::Value) -> Request { Request::builder() .method("POST") .uri(uri) .header("content-type", "application/json") .body(Body::from(body.to_string())) .unwrap() }