use crate::application::lifecycle::Lifecycle;
use crate::axum::Extension;
use crate::axum::http::StatusCode;
use crate::axum::response::IntoResponse;
#[must_use]
pub fn live_response(lifecycle: &Lifecycle) -> (StatusCode, &'static str) {
if lifecycle.live() {
(StatusCode::OK, "live")
} else {
(StatusCode::SERVICE_UNAVAILABLE, "stopped")
}
}
pub(crate) async fn live(Extension(lifecycle): Extension<Lifecycle>) -> impl IntoResponse {
live_response(&lifecycle)
}
#[cfg(test)]
mod tests {
use super::live_response;
use crate::application::lifecycle::Lifecycle;
use crate::axum::http::StatusCode;
#[test]
fn live_returns_200_while_starting() {
let lifecycle = Lifecycle::new();
let (status, body) = live_response(&lifecycle);
assert_eq!(status, StatusCode::OK);
assert_eq!(body, "live");
}
#[test]
fn live_returns_200_while_ready() {
let lifecycle = Lifecycle::new();
lifecycle.mark_ready();
let (status, body) = live_response(&lifecycle);
assert_eq!(status, StatusCode::OK);
assert_eq!(body, "live");
}
#[test]
fn live_returns_200_while_draining() {
let lifecycle = Lifecycle::new();
lifecycle.mark_ready();
lifecycle.begin_drain();
let (status, body) = live_response(&lifecycle);
assert_eq!(status, StatusCode::OK);
assert_eq!(body, "live");
}
#[test]
fn live_returns_503_when_stopped() {
let lifecycle = Lifecycle::new();
lifecycle.mark_stopped();
let (status, body) = live_response(&lifecycle);
assert_eq!(status, StatusCode::SERVICE_UNAVAILABLE);
assert_eq!(body, "stopped");
}
}