Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/edda

crates/nornir-claude/src/selftest.rs

//! # Functional-status emit bridge — `nornir-claude` → test matrix
//!
//! The single internal call site this crate uses to push a *functional* row into
//! the [`nornir_testmatrix`] matrix, so `nornir test --features testmatrix`
//! records whether `nornir-claude`'s real surfaces — the deterministic
//! [`OfflineTransport`] send loop and the [`resolve_credential_from`] precedence —
//! ACTUALLY behave, without eyeballing.
//!
//! ## Release strips everything
//! The `testmatrix` cargo feature gates the whole bridge: with it OFF (the
//! release default) [`emit`] is an `#[inline]` no-op and `nornir-testmatrix` is
//! not even linked. Lit ONLY under `cargo … --features testmatrix`.
//!
//! [`OfflineTransport`]: crate::OfflineTransport
//! [`resolve_credential_from`]: crate::resolve_credential_from

/// The aspect tag every self-emitted row carries (matches `functional_row`).
pub const ASPECT_FUNCTIONAL: &str = "functional";

/// Push ONE functional-status row for a single real check (feature ON).
///
/// * `component` — the unit under test (becomes the row's `suite`).
/// * `check` — the specific assertion's name (becomes the row's `test_name`).
/// * `ok` — the **real** verdict.
/// * `detail` — the **measured** value.
#[cfg(feature = "testmatrix")]
#[inline]
pub fn emit(component: &str, check: &str, ok: bool, detail: &str) {
    nornir_testmatrix::functional_status(component, check, ok, detail);
}

/// No-op stub when the `testmatrix` feature is OFF (release builds). Inlined and
/// empty so the call — and, with the wrap-the-call-site pattern, the detail
/// string-building — is stripped entirely.
#[cfg(not(feature = "testmatrix"))]
#[inline]
pub fn emit(_component: &str, _check: &str, _ok: bool, _detail: &str) {}

/// `assert!`-with-emit: assert on the real return value / object state AND record
/// the verdict as a matrix row. The `assert!` is the test's actual gate; the emit
/// is the matrix observation.
#[macro_export]
macro_rules! claude_assert_emit {
    ($component:expr, $check:expr, $ok:expr, $($detail:tt)+) => {{
        let __ok: bool = $ok;
        let __detail = ::std::format!($($detail)+);
        $crate::selftest::emit($component, $check, __ok, &__detail);
        ::std::assert!(__ok, "{}::{} — {}", $component, $check, __detail);
    }};
}

// ─── drive-and-assert wiring test (feature ON only) ──────────────────────────
#[cfg(all(test, feature = "testmatrix"))]
mod wiring {
    use crate::{
        resolve_credential_from, ClaudeTransport, Credential, OfflineTransport, WireMsg,
    };

    /// Exercise the real offline send loop + credential precedence, emit an honest
    /// row per surface, then drain the process-global functional buffer and assert
    /// the rows landed — proving the emit bridge is wired end to end.
    #[test]
    fn emits_honest_rows_for_claude_surfaces() {
        // Real surface #1: the offline transport echoes the last user turn.
        let reply = OfflineTransport::echoing()
            .send(&crate::ClaudeRequest::new(
                "claude-opus-4-8",
                vec![WireMsg::user("2+2?")],
            ))
            .unwrap();
        claude_assert_emit!(
            "nornir-claude",
            "offline_transport_echoes_last_user",
            reply == "[offline · claude-opus-4-8] 2+2?",
            "reply={reply:?}"
        );

        // Real surface #2 (RED-when-broken): api-key env beats a bearer token, and
        // an all-blank chain resolves to no credential.
        let precedence_ok = resolve_credential_from(Some("k"), Some("t"), None)
            == Some(Credential::ApiKey("k".into()))
            && resolve_credential_from(None, None, None).is_none();
        claude_assert_emit!(
            "nornir-claude",
            "credential_precedence_api_key_wins",
            precedence_ok,
            "api_key>bearer and blank=>None: {precedence_ok}"
        );

        let drained = nornir_testmatrix::drain_functional_rows();
        let has = |t: &str| {
            drained
                .iter()
                .any(|r| r.suite == "nornir-claude" && r.test_name == t && r.status == "pass")
        };
        assert!(has("offline_transport_echoes_last_user"), "rows={drained:?}");
        assert!(has("credential_precedence_api_key_wins"), "rows={drained:?}");
        assert!(
            drained
                .iter()
                .filter(|r| r.suite == "nornir-claude")
                .all(|r| r.aspect == "functional"),
            "rows={drained:?}"
        );
    }
}