|
| 1 | +use crate::DependencyContainer; |
| 2 | +use serde::{Deserialize, Serialize}; |
| 3 | +use std::sync::Arc; |
| 4 | +use warp::Filter; |
| 5 | + |
| 6 | +use super::middlewares; |
| 7 | + |
| 8 | +#[derive(Debug, Serialize, Deserialize, PartialEq)] |
| 9 | +pub struct RootRouteMessage { |
| 10 | + pub open_api_version: String, |
| 11 | + pub documentation_url: String, |
| 12 | +} |
| 13 | + |
| 14 | +pub fn routes( |
| 15 | + dependency_manager: Arc<DependencyContainer>, |
| 16 | +) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone { |
| 17 | + root(dependency_manager) |
| 18 | +} |
| 19 | + |
| 20 | +/// GET / |
| 21 | +fn root( |
| 22 | + dependency_manager: Arc<DependencyContainer>, |
| 23 | +) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone { |
| 24 | + warp::path::end() |
| 25 | + .and(middlewares::with_api_version_provider(dependency_manager)) |
| 26 | + .and_then(handlers::root) |
| 27 | +} |
| 28 | + |
| 29 | +mod handlers { |
| 30 | + use mithril_common::api_version::APIVersionProvider; |
| 31 | + use reqwest::StatusCode; |
| 32 | + use slog_scope::{debug, warn}; |
| 33 | + |
| 34 | + use crate::http_server::routes::{ |
| 35 | + reply::{self, json}, |
| 36 | + root_routes::RootRouteMessage, |
| 37 | + }; |
| 38 | + use std::{convert::Infallible, sync::Arc}; |
| 39 | + |
| 40 | + /// Root |
| 41 | + pub async fn root( |
| 42 | + api_version_provider: Arc<APIVersionProvider>, |
| 43 | + ) -> Result<impl warp::Reply, Infallible> { |
| 44 | + debug!("⇄ HTTP SERVER: root"); |
| 45 | + |
| 46 | + match api_version_provider.compute_current_version() { |
| 47 | + Ok(open_api_version) => Ok(json( |
| 48 | + &RootRouteMessage { |
| 49 | + open_api_version: open_api_version.to_string(), |
| 50 | + documentation_url: env!("CARGO_PKG_HOMEPAGE").to_string(), |
| 51 | + }, |
| 52 | + StatusCode::OK, |
| 53 | + )), |
| 54 | + Err(err) => { |
| 55 | + warn!("root::error"; "error" => ?err); |
| 56 | + Ok(reply::internal_server_error(err.to_string())) |
| 57 | + } |
| 58 | + } |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +#[cfg(test)] |
| 63 | +mod tests { |
| 64 | + use crate::http_server::SERVER_BASE_PATH; |
| 65 | + use crate::{initialize_dependencies, DependencyContainer}; |
| 66 | + use reqwest::StatusCode; |
| 67 | + use std::sync::Arc; |
| 68 | + use warp::http::Method; |
| 69 | + use warp::test::request; |
| 70 | + use warp::Filter; |
| 71 | + |
| 72 | + use super::*; |
| 73 | + |
| 74 | + fn setup_router( |
| 75 | + dependency_manager: Arc<DependencyContainer>, |
| 76 | + ) -> impl Filter<Extract = (impl warp::Reply,), Error = warp::Rejection> + Clone { |
| 77 | + let cors = warp::cors() |
| 78 | + .allow_any_origin() |
| 79 | + .allow_headers(vec!["content-type"]) |
| 80 | + .allow_methods(vec![Method::GET, Method::POST, Method::OPTIONS]); |
| 81 | + |
| 82 | + warp::any() |
| 83 | + .and(warp::path(SERVER_BASE_PATH)) |
| 84 | + .and(routes(dependency_manager).with(cors)) |
| 85 | + } |
| 86 | + |
| 87 | + #[tokio::test] |
| 88 | + async fn test_root_route_ok() { |
| 89 | + let method = Method::GET.as_str(); |
| 90 | + let path = "/"; |
| 91 | + let dependency_manager = initialize_dependencies().await; |
| 92 | + let expected_open_api_version = dependency_manager |
| 93 | + .api_version_provider |
| 94 | + .clone() |
| 95 | + .compute_current_version() |
| 96 | + .unwrap() |
| 97 | + .to_string(); |
| 98 | + |
| 99 | + let response = request() |
| 100 | + .method(method) |
| 101 | + .path(&format!("/{SERVER_BASE_PATH}{path}")) |
| 102 | + .reply(&setup_router(Arc::new(dependency_manager))) |
| 103 | + .await; |
| 104 | + |
| 105 | + let response_body: RootRouteMessage = serde_json::from_slice(response.body()).unwrap(); |
| 106 | + |
| 107 | + assert_eq!(response.status(), StatusCode::OK); |
| 108 | + |
| 109 | + assert_eq!( |
| 110 | + response_body, |
| 111 | + RootRouteMessage { |
| 112 | + open_api_version: expected_open_api_version, |
| 113 | + documentation_url: env!("CARGO_PKG_HOMEPAGE").to_string(), |
| 114 | + } |
| 115 | + ); |
| 116 | + } |
| 117 | +} |
0 commit comments