distributed-systems-challenge/tests/uid.rs

151 lines
4.0 KiB
Rust

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_single() {
let app = app().into_service();
let response = {
let request: Message = {
let src = "c1".to_string();
let dest = "n1".to_string();
let body = {
let msg_id = 1;
MessageBody::Generate { msg_id }
};
Message { src, dest, body }
};
let response = app
.oneshot(
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(),
)
.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": "generate_ok",
"msg_id": 1,
"in_reply_to": 1,
"id": 0
}
}
);
assert_eq!(body, expected);
}
}
#[tokio::test]
async fn test_multiple() {
let mut app = app().into_service();
let request_count = 3;
let response = {
for i in 0..request_count {
let request: Message = {
let src = "c1".to_string();
let dest = "n1".to_string();
let body = {
let msg_id = i;
MessageBody::Generate { 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::<Request<String>>::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 = request_count;
MessageBody::Generate { 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::<Request<String>>::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": "generate_ok",
"msg_id": request_count,
"in_reply_to": request_count,
"id": request_count
}
}
);
assert_eq!(body, expected);
}
}