liminal-server 0.24.9

Standalone server for the liminal messaging bus
Documentation
//! SRV-041 R4: the startup draft pull behind the listening door.
use super::pull_at_start;
use crate::auth_lys::drafts::DraftPuller;
use crate::auth_lys::drafts::PullSignal;
use crate::auth_lys::drafts::admin::{AdminDrafts, AdminLimits};
use crate::auth_lys::live::drafts::tests::{Issuer, TargetStore, limits};
use crate::auth_lys::lys_pass_adapter::LysPassAdapter;
use std::sync::Arc;

type TestResult<T = ()> = Result<T, Box<dyn std::error::Error>>;

fn route(
    issuer: &Issuer,
    dir: &std::path::Path,
) -> TestResult<tokio::sync::Mutex<AdminDrafts<TargetStore>>> {
    let puller = DraftPuller::new(
        &issuer.api,
        TargetStore::new(dir.join("site.json")),
        limits()?,
    )?;
    let adapter = Arc::new(LysPassAdapter::from_keys_json(
        "{\"keys\":[]}",
        "https://issuer.example".to_owned(),
    )?);
    let limits = AdminLimits {
        credential_bytes: limits()?.metadata_bytes,
        body_bytes: limits()?.metadata_bytes,
    };
    Ok(tokio::sync::Mutex::new(AdminDrafts::new(
        puller,
        adapter,
        "network-a".to_owned(),
        limits,
    )?))
}

fn lys_runtime() -> TestResult<tokio::runtime::Runtime> {
    Ok(tokio::runtime::Builder::new_multi_thread()
        .worker_threads(1)
        .enable_all()
        .build()?)
}

#[test]
fn a_startup_pull_lys_refuses_is_logged_and_the_next_signal_pulls() -> TestResult {
    let dir = tempfile::tempdir()?;
    let issuer = Issuer::new(vec![
        (
            503,
            serde_json::json!({"refusal":"fixture_issuer_unavailable",
                "reason":"The fixture issuer is unavailable."}),
        ),
        (200, serde_json::json!({"drafts":[],"next":null,"total":0})),
    ])?;
    let route = route(&issuer, dir.path())?;
    let runtime = lys_runtime()?;
    assert!(
        !pull_at_start(&route, "connector-fixture", runtime.handle()),
        "a pull Lys refused was reported complete"
    );
    let report = runtime.block_on(async {
        route
            .lock()
            .await
            .signal("connector-fixture", PullSignal::Console, 2)
            .await
    })?;
    assert_eq!(
        report.pages, 1,
        "the console pull after a refused start did not pull"
    );
    assert_eq!(issuer.calls()?, 2);
    issuer.finish()
}

#[test]
fn a_console_pull_after_the_startup_pull_is_answered_and_never_repeats_it() -> TestResult {
    let dir = tempfile::tempdir()?;
    let empty = serde_json::json!({"drafts":[],"next":null,"total":0});
    let issuer = Issuer::new(vec![(200, empty.clone()), (200, empty)])?;
    let route = route(&issuer, dir.path())?;
    let runtime = lys_runtime()?;
    assert!(pull_at_start(&route, "connector-fixture", runtime.handle()));
    let report = runtime.block_on(async {
        route
            .lock()
            .await
            .signal("connector-fixture", PullSignal::Console, 3)
            .await
    })?;
    assert_eq!(report.pages, 1);
    assert_eq!(issuer.calls()?, 2);
    issuer.finish()
}