road-runner-common 0.12.1

Shared Rust utilities for exchange ecosystem backend services.
Documentation
#![cfg(feature = "web")]

use actix_web::{test, web, App, HttpMessage, HttpRequest, HttpResponse};
use road_runner_common::middleware::{RequestId, RequestIdMiddleware, REQUEST_ID_HEADER};

async fn echo_request_id(req: HttpRequest) -> HttpResponse {
    let request_id = req.extensions().get::<RequestId>().unwrap().as_str().to_string();
    HttpResponse::Ok().body(request_id)
}

#[actix_web::test]
async fn request_id_middleware_preserves_valid_incoming_header() {
    // Arrange
    let app = test::init_service(
        App::new().wrap(RequestIdMiddleware).route("/", web::get().to(echo_request_id)),
    )
    .await;
    let req = test::TestRequest::get()
        .uri("/")
        .insert_header((REQUEST_ID_HEADER, "rid-in"))
        .to_request();

    // Act
    let response = test::call_service(&app, req).await;
    let header = response.headers().get(REQUEST_ID_HEADER).unwrap().to_str().unwrap().to_string();
    let body = test::read_body(response).await;

    // Assert
    assert_eq!(header, "rid-in");
    assert_eq!(body, "rid-in");
}

#[actix_web::test]
async fn request_id_middleware_generates_id_when_header_missing_or_blank() {
    // Arrange
    let app = test::init_service(
        App::new().wrap(RequestIdMiddleware).route("/", web::get().to(echo_request_id)),
    )
    .await;
    let req = test::TestRequest::get().uri("/").insert_header((REQUEST_ID_HEADER, " ")).to_request();

    // Act
    let response = test::call_service(&app, req).await;
    let header = response.headers().get(REQUEST_ID_HEADER).unwrap().to_str().unwrap().to_string();
    let body = test::read_body(response).await;

    // Assert
    assert!(uuid::Uuid::parse_str(&header).is_ok());
    assert_eq!(body, header);
}