motorcortex-rust 0.5.0

Motorcortex Rust: a Rust client for the Motorcortex Core real-time control system (async + blocking).
Documentation
//! Session-token RPCs: fetch a fresh token, restore a session from
//! it, check the driver's cache gets populated.

use motorcortex_rust::core::Request;
use motorcortex_rust::{ConnectionOptions, StatusCode};

use crate::{CERT_PATH, URL_REQ};

fn opts() -> ConnectionOptions {
    ConnectionOptions::new(CERT_PATH.to_string(), 5000, 5000)
}

#[tokio::test]
async fn test_get_session_token_returns_non_empty_string() {
    let req = Request::connect_to(URL_REQ, opts())
        .await
        .expect("connect");
    req.login("root", "vectioneer").await.expect("login");

    assert!(req.session_token().is_none(), "fresh handle has no token");

    let token = req
        .get_session_token()
        .await
        .expect("get_session_token must succeed against the test server");
    assert!(
        !token.is_empty(),
        "server should return a non-empty token, got {token:?}"
    );
    assert_eq!(
        req.session_token().as_deref(),
        Some(token.as_str()),
        "driver's cached token must match the one returned",
    );

    req.disconnect().await.expect("disconnect");
}

#[tokio::test]
async fn test_restore_session_with_valid_token_succeeds() {
    // Fetch a token on one handle, restore it on the same handle —
    // no drop in between, so the server still recognises the session.
    let req = Request::connect_to(URL_REQ, opts())
        .await
        .expect("connect");
    req.login("root", "vectioneer").await.expect("login");

    let token = req.get_session_token().await.expect("get_session_token");
    let status = req
        .restore_session(&token)
        .await
        .expect("restore_session RPC completes");
    assert!(
        matches!(status, StatusCode::Ok | StatusCode::ReadOnlyMode),
        "expected Ok / ReadOnlyMode, got {status:?}"
    );

    req.disconnect().await.expect("disconnect");
}

#[tokio::test]
async fn test_session_token_cleared_on_disconnect() {
    let req = Request::connect_to(URL_REQ, opts())
        .await
        .expect("connect");
    req.login("root", "vectioneer").await.expect("login");
    let _ = req
        .get_session_token()
        .await
        .expect("get_session_token");
    assert!(req.session_token().is_some());

    req.disconnect().await.expect("disconnect");
    assert!(
        req.session_token().is_none(),
        "disconnect must clear the token cache"
    );
}