LeVCS/crates/levcs-instance/tests/health.rs

58 lines
1.7 KiB
Rust

//! `/health` operational endpoint smoke test.
//!
//! The reverse proxy in front of a deployed instance probes this for
//! liveness, so it has to be (a) cheap, (b) reachable without auth,
//! and (c) outside the `/levcs/v1` namespace so a future API change
//! can't accidentally affect it.
use std::net::SocketAddr;
use std::path::PathBuf;
use levcs_instance::{router, AppState, InstanceConfig};
fn tempdir(prefix: &str) -> PathBuf {
let mut p = std::env::temp_dir();
let n = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0);
p.push(format!("{prefix}-{n}-{}", std::process::id()));
std::fs::create_dir_all(&p).unwrap();
p
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn health_returns_ok_without_auth() {
let root = tempdir("levcs-health");
let cfg = InstanceConfig {
root: root.clone(),
storage_mode: "full".into(),
federation_peers: Vec::new(),
allowed_handlers: Vec::new(),
mirrors: Vec::new(),
};
let state = AppState::new(cfg);
let app = router(state);
let listener = tokio::net::TcpListener::bind::<SocketAddr>("127.0.0.1:0".parse().unwrap())
.await
.unwrap();
let addr = listener.local_addr().unwrap();
let task = tokio::spawn(async move {
axum::serve(listener, app).await.ok();
});
let resp = tokio::task::spawn_blocking(move || {
reqwest::blocking::get(format!("http://{addr}/health"))
.unwrap()
.text()
.unwrap()
})
.await
.unwrap();
assert!(resp.contains("\"status\""));
assert!(resp.contains("\"ok\""));
task.abort();
let _ = std::fs::remove_dir_all(root);
}