im-core 0.1.0

Rust IM SDK for Awiki clients built on Agent Network Protocol (ANP)
Documentation
use super::*;
use serde_json::json;

fn assert_transport_unavailable<T>(result: crate::ImResult<T>, expected: &str) {
    match result {
        Err(crate::ImError::TransportUnavailable { detail }) => {
            assert_eq!(detail, expected);
        }
        Err(err) => panic!("expected transport unavailable, got {err:?}"),
        Ok(_) => panic!("expected transport unavailable, got success"),
    }
}

#[tokio::test]
async fn async_unavailable_transport_errors_match_sync_shape() {
    let mut transport = UnavailableTransport;
    assert_transport_unavailable(
        AsyncAuthenticatedRpcTransport::authenticated_rpc(
            &mut transport,
            "/im/rpc",
            "direct.send",
            json!({}),
        )
        .await,
        "direct.send transport is not configured for /im/rpc",
    );
    assert_transport_unavailable(
        AsyncRpcTransport::rpc(
            &mut transport,
            "/user-service/handle/rpc",
            "lookup",
            json!({}),
        )
        .await,
        "lookup transport is not configured for /user-service/handle/rpc",
    );
    assert_transport_unavailable(
        AsyncRestTransport::rest_post(
            &mut transport,
            "/user-service/auth/email-send",
            "POST",
            json!({}),
        )
        .await,
        "POST transport is not configured for /user-service/auth/email-send",
    );
    assert_transport_unavailable(
        AsyncRestTransport::rest_get(
            &mut transport,
            "/user-service/auth/email-status",
            "GET",
            &BTreeMap::new(),
        )
        .await,
        "GET transport is not configured for /user-service/auth/email-status",
    );
    assert_transport_unavailable(
        AsyncAuthenticatedRestTransport::authenticated_rest_post(
            &mut transport,
            "/user-service/did/profile",
            "PATCH",
            json!({}),
        )
        .await,
        "PATCH transport is not configured for /user-service/did/profile",
    );
    assert_transport_unavailable(
        AsyncAuthenticatedRestTransport::authenticated_rest_get(
            &mut transport,
            "/user-service/did/profile",
            "GET",
            &BTreeMap::new(),
        )
        .await,
        "GET transport is not configured for /user-service/did/profile",
    );
    assert_transport_unavailable(
        AsyncRawJsonTransport::get_json_url(
            &mut transport,
            "https://example.test/did.json",
            BTreeMap::new(),
        )
        .await,
        "GET transport is not configured for https://example.test/did.json",
    );
    assert_transport_unavailable(
        AsyncAttachmentObjectTransport::put_attachment_object(
            &mut transport,
            "https://object.test/upload",
            BTreeMap::new(),
            b"body".to_vec(),
        )
        .await,
        "PUT transport is not configured for https://object.test/upload",
    );
    assert_transport_unavailable(
        AsyncAttachmentObjectTransport::get_attachment_object(
            &mut transport,
            "https://object.test/download",
            "ticket",
        )
        .await,
        "GET transport is not configured for https://object.test/download",
    );
}