axum-cometd 0.7.1

Framework for CometD server creation
Documentation
use axum_cometd::{LongPollingServiceContextBuilder, RouterBuilder};
use core::time::Duration;
use serde_json::json;
use std::sync::Arc;
use test_common::ClientMock;

const TIMEOUT_MS: u64 = 1000;
const MAX_INTERVAL_MS: u64 = 2000;

fn build_mock_client() -> ClientMock {
    let context = LongPollingServiceContextBuilder::new()
        .timeout_ms(TIMEOUT_MS)
        .max_interval_ms(MAX_INTERVAL_MS)
        .build();
    let router = RouterBuilder::new().build(Arc::clone(&context));

    ClientMock::create("", "/", "", "", router)
}

#[tokio::test]
async fn test_client_timeout() {
    let mut mock_client = build_mock_client();
    mock_client.handshake().await;

    tokio::time::sleep(Duration::from_millis(MAX_INTERVAL_MS + 500)).await;

    let json_body = mock_client.subscribe(&["/topic"]).await.unwrap_err();
    assert_eq!(
        json_body,
        json!([{
            "id": mock_client.last_id(),
            "channel": "/meta/subscribe",
            "error": "402::session_unknown",
            "successful": false
        }])
    );
}