use axum::extract::State;
use crate::adapter_http_server::{ServerState, handler::ApiError};
#[tracing::instrument(skip_all, err(Debug))]
pub async fn handler<AR>(State(state): State<ServerState<AR>>) -> Result<String, ApiError>
where
AR: crate::domain::prelude::AptRepositoryReader + Clone,
{
match state.apt_repository.signed_release_metadata().await {
Ok(Some(value)) => Ok(value),
Ok(None) => Err(ApiError::not_found("release not found")),
Err(err) => Err(ApiError::internal(err.to_string())),
}
}
#[cfg(test)]
mod tests {
use crate::domain::prelude::MockAptRepositoryService;
#[tokio::test]
async fn should_return_error_if_empty() {
let mut apt_repository = MockAptRepositoryService::new();
apt_repository
.expect_signed_release_metadata()
.once()
.return_once(|| Box::pin(async move { Ok(None) }));
let state = crate::adapter_http_server::ServerState { apt_repository };
let err = super::handler(axum::extract::State(state))
.await
.unwrap_err();
assert_eq!(err.status_code, axum::http::StatusCode::NOT_FOUND);
}
#[tokio::test]
async fn should_return_payload() {
let mut apt_repository = MockAptRepositoryService::new();
apt_repository
.expect_signed_release_metadata()
.once()
.return_once(|| {
Box::pin(async move {
Ok(Some(String::from(
"foo -----BEGIN PGP SIGNATURE-----\n\n-----END PGP SIGNATURE-----\n",
)))
})
});
let state = crate::adapter_http_server::ServerState { apt_repository };
let value = super::handler(axum::extract::State(state)).await.unwrap();
assert_eq!(
value,
"foo -----BEGIN PGP SIGNATURE-----\n\n-----END PGP SIGNATURE-----\n"
);
}
}