rho-coding-agent 2.16.0

A fast Rust agent harness with a small footprint and opinionated defaults
use pretty_assertions::assert_eq;
use rho_providers::model::ModelError;

use super::{is_interactive_startup_unavailable_error, parse_first_run_override, SetupEntry};

// Covers: missing credentials or an unsupported provider must not abort
// interactive startup; the TUI opens so the user can log in or switch.
// Owner: app bootstrap policy
#[test]
fn provider_setup_errors_are_nonfatal_for_interactive_startup() {
    for (case, error) in [
        (
            "missing credentials",
            ModelError::missing_credentials("missing xAI API key"),
        ),
        (
            "unsupported provider",
            ModelError::UnsupportedProvider("anthropic".into()),
        ),
    ] {
        assert!(is_interactive_startup_unavailable_error(&error), "{case}");
    }
}

/// The override has to be able to name a step. A configured machine already
/// lists models, so an on/off flag would always land on the model step and
/// leave the provider menu unreachable.
#[test]
fn the_first_run_override_selects_a_setup_step() {
    let cases = [
        ("", None),
        ("0", None),
        ("false", None),
        ("no", None),
        ("signin", Some(SetupEntry::SignIn)),
        ("sign-in", Some(SetupEntry::SignIn)),
        ("login", Some(SetupEntry::SignIn)),
        ("  SignIn  ", Some(SetupEntry::SignIn)),
        ("model", Some(SetupEntry::ChooseModel)),
        ("models", Some(SetupEntry::ChooseModel)),
        ("MODEL", Some(SetupEntry::ChooseModel)),
        ("1", Some(SetupEntry::Auto)),
        ("true", Some(SetupEntry::Auto)),
        ("yes please", Some(SetupEntry::Auto)),
    ];

    for (value, expected) in cases {
        assert_eq!(
            parse_first_run_override(value),
            expected,
            "override value {value:?}"
        );
    }
}