use axum::body::Body; use axum::http::{Request, StatusCode}; use tower::ServiceExt; use crate::support::api::{read_json, small_plan, test_app}; #[tokio::test] async fn demo_data_and_static_assets_match_current_contract() { let app = test_app(); let demo_response = app .clone() .oneshot(Request::get("/demo-data").body(Body::empty()).unwrap()) .await .unwrap(); assert_eq!(demo_response.status(), StatusCode::OK); let demos = read_json(demo_response).await; assert_eq!( demos, serde_json::json!(["PHILADELPHIA", "HARTFORD", "FIRENZE"]) ); let demo_plan_response = app .clone() .oneshot( Request::get("/demo-data/PHILADELPHIA") .body(Body::empty()) .unwrap(), ) .await .unwrap(); assert_eq!(demo_plan_response.status(), StatusCode::OK); let demo_plan = read_json(demo_plan_response).await; assert_eq!(demo_plan["name"], "Philadelphia"); assert_eq!(demo_plan["routingMode"], "road_network"); assert!(!demo_plan["viewState"]["preview"]["vehicles"] .as_array() .expect("preview vehicles should exist") .is_empty()); let asset_response = app .clone() .oneshot(Request::get("/sf/sf.js").body(Body::empty()).unwrap()) .await .unwrap(); assert_eq!(asset_response.status(), StatusCode::OK); let no_legacy_response = app .clone() .oneshot(Request::get("/webjars/").body(Body::empty()).unwrap()) .await .unwrap(); assert_eq!(no_legacy_response.status(), StatusCode::NOT_FOUND); } #[tokio::test] async fn recommendations_endpoint_returns_ranked_preview_plans() { let app = test_app(); let mut plan = small_plan(); if let Some(order) = plan["vehicles"][0]["deliveryOrder"].as_array_mut() { order.clear(); } let response = app .clone() .oneshot( Request::post("/recommendations/delivery-insertions") .header("content-type", "application/json") .body(Body::from( serde_json::json!({ "plan": plan, "deliveryId": 0, "limit": 5 }) .to_string(), )) .unwrap(), ) .await .unwrap(); assert_eq!(response.status(), StatusCode::OK); let json = read_json(response).await; let candidates = json["candidates"] .as_array() .expect("candidates should be an array"); assert!(!candidates.is_empty()); assert!(candidates[0]["previewPlan"]["viewState"]["preview"].is_object()); }