haematite-cli 0.21.7

The haematite command: serve a store, its door and Studio, answer MCP, query with jq, and host the store's assistant seat
Documentation
use super::LysSignIn;
use crate::door::config::Lys;
use std::net::TcpListener;
use std::sync::mpsc;
use std::time::Duration;
type TestResult = Result<(), Box<dyn std::error::Error>>;
#[test]
fn signin_discovery_has_a_total_deadline() -> TestResult {
    let listener = TcpListener::bind("127.0.0.1:0")?;
    let issuer = format!("http://{}/", listener.local_addr()?);
    let (release, released) = mpsc::channel();
    let server = std::thread::spawn(move || -> std::io::Result<()> {
        let (_stream, _) = listener.accept()?;
        released.recv().map_err(std::io::Error::other)?;
        Ok(())
    });
    let dir = tempfile::tempdir()?;
    let secret_file = dir.path().join("secret");
    std::fs::write(&secret_file, "fixture")?;
    let lys = Lys {
        issuer,
        secret_file,
        client_id: "fixture".into(),
        redirect: "https://studio.example/callback".into(),
    };
    let (send, receive) = mpsc::channel();
    let worker = std::thread::spawn(move || {
        send.send(
            LysSignIn::connect_with_timeouts(
                &lys,
                Duration::from_millis(50),
                Duration::from_millis(50),
            )
            .err(),
        )
    });
    let result = receive.recv_timeout(Duration::from_secs(2));
    release.send(())?;
    server.join().map_err(|_| "issuer panicked")??;
    worker.join().map_err(|_| "client panicked")??;
    assert!(
        result.is_ok(),
        "sign-in discovery outlived the configured total timeout"
    );
    assert!(result?.is_some_and(|message| message.contains("lys_could_not_be_asked")));
    Ok(())
}