use axum::http::StatusCode;
use axum::routing::get;
use axum::{Extension, Router};
use sqlx::PgPool;
use crate::API_PREFIX;
pub mod error;
pub mod food;
pub mod handler;
pub fn app(db: PgPool) -> Router {
Router::new()
.route(
format!("{API_PREFIX}/healthcheck").as_str(),
get(|| async { (StatusCode::OK, "OK") }),
)
.route(
format!("{API_PREFIX}/food").as_str(),
get(handler::list_food).post(handler::add_food),
)
.route(
format!("{API_PREFIX}/food/:id").as_str(),
get(handler::get_food)
.delete(handler::delete_food),
)
.layer(Extension(db)) }
#[cfg(test)]
mod tests {
use super::*;
use crate::db::get_db_url;
use axum::body::Body;
use axum::http::{Request, StatusCode};
use sqlx::postgres::PgPoolOptions;
use tower::util::ServiceExt;
#[tokio::test]
async fn axum_healthcheck() {
let db = PgPoolOptions::new()
.max_connections(5)
.connect(&get_db_url().unwrap())
.await
.unwrap();
let app = app(db);
let response = app
.oneshot(
Request::builder()
.uri("/api/v2/healthcheck")
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
let body = hyper::body::to_bytes(response.into_body()).await.unwrap();
assert_eq!(&body[..], b"OK");
}
#[tokio::test]
async fn axum_not_found() {
let db = PgPoolOptions::new()
.max_connections(5)
.connect(&get_db_url().unwrap())
.await
.unwrap();
let app = app(db);
let response = app
.oneshot(
Request::builder()
.uri("/does-not-exist")
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
assert_eq!(response.status(), StatusCode::NOT_FOUND);
let body = hyper::body::to_bytes(response.into_body()).await.unwrap();
assert!(body.is_empty());
}
}