use axum::http::{self, Request, StatusCode}; use echo::{ app, messages::{Message, MessageBody}, }; use http_body_util::BodyExt; use serde_json::{json, Value}; use tower::{Service, ServiceExt}; #[tokio::test] async fn test_rw() { let mut app = app().into_service(); let message = "test".to_string(); let response = { let request: Message = { let src = "c1".to_string(); let dest = "n1".to_string(); let body = { let msg_id = 1; let message = message.clone(); MessageBody::Broadcast { msg_id, message } }; Message { src, dest, body } }; let request = Request::builder() .method(http::Method::POST) .uri("/") .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) .body(serde_json::to_string(&request).unwrap()) .unwrap(); let response = ServiceExt::>::ready(&mut app) .await .unwrap() .call(request) .await .unwrap(); assert_eq!(response.status(), StatusCode::OK); let request: Message = { let src = "c1".to_string(); let dest = "n1".to_string(); let body = { let msg_id = 2; MessageBody::Read { msg_id } }; Message { src, dest, body } }; let request = Request::builder() .method(http::Method::POST) .uri("/") .header(http::header::CONTENT_TYPE, mime::APPLICATION_JSON.as_ref()) .body(serde_json::to_string(&request).unwrap()) .unwrap(); let response = ServiceExt::>::ready(&mut app) .await .unwrap() .call(request) .await .unwrap(); assert_eq!(response.status(), StatusCode::OK); response }; { let body: Value = { let body = response.into_body().collect().await.unwrap().to_bytes(); serde_json::from_slice(&body).unwrap() }; let expected = json!( { "src": "n1", "dest": "c1", "body": { "type": "read_ok", "msg_id": 2, "in_reply_to": 2, "message": vec![message] } } ); assert_eq!(body, expected); } }