unified-agent-api-codex 0.3.5

Async wrapper around the Codex CLI for programmatic prompting
Documentation
use super::*;

#[test]
fn parses_version_output_fields() {
    let parsed = version::parse_version_output("codex v3.4.5-nightly (commit abc1234)");
    assert_eq!(parsed.semantic, Some((3, 4, 5)));
    assert_eq!(parsed.channel, CodexReleaseChannel::Nightly);
    assert_eq!(parsed.commit.as_deref(), Some("abc1234"));
    assert_eq!(
        parsed.raw,
        "codex v3.4.5-nightly (commit abc1234)".to_string()
    );
}

#[test]
fn update_advisory_detects_newer_release() {
    let capabilities = capabilities_with_version("codex 1.0.0");
    let latest = CodexLatestReleases {
        stable: Some(Version::parse("1.1.0").unwrap()),
        ..Default::default()
    };
    let advisory = update_advisory_from_capabilities(&capabilities, &latest);
    assert_eq!(advisory.status, CodexUpdateStatus::UpdateRecommended);
    assert!(advisory.is_update_recommended());
    assert_eq!(
        advisory
            .latest_release
            .as_ref()
            .map(|release| release.version.clone()),
        latest.stable
    );
}

#[test]
fn update_advisory_handles_unknown_local_version() {
    let capabilities = capabilities_without_version();
    let latest = CodexLatestReleases {
        stable: Some(Version::parse("3.2.1").unwrap()),
        ..Default::default()
    };
    let advisory = update_advisory_from_capabilities(&capabilities, &latest);
    assert_eq!(advisory.status, CodexUpdateStatus::UnknownLocalVersion);
    assert!(advisory.is_update_recommended());
    assert!(advisory
        .notes
        .iter()
        .any(|note| note.contains("could not be parsed")));
}

#[test]
fn update_advisory_marks_up_to_date() {
    let capabilities = capabilities_with_version("codex 2.0.1");
    let latest = CodexLatestReleases {
        stable: Some(Version::parse("2.0.1").unwrap()),
        ..Default::default()
    };
    let advisory = update_advisory_from_capabilities(&capabilities, &latest);
    assert_eq!(advisory.status, CodexUpdateStatus::UpToDate);
    assert!(!advisory.is_update_recommended());
}

#[test]
fn update_advisory_falls_back_when_channel_missing() {
    let capabilities = capabilities_with_version("codex 2.0.0-beta");
    let latest = CodexLatestReleases {
        stable: Some(Version::parse("2.0.1").unwrap()),
        ..Default::default()
    };
    let advisory = update_advisory_from_capabilities(&capabilities, &latest);
    assert_eq!(advisory.comparison_channel, CodexReleaseChannel::Stable);
    assert_eq!(advisory.status, CodexUpdateStatus::UpdateRecommended);
    assert!(advisory
        .notes
        .iter()
        .any(|note| note.contains("comparing against stable")));
}

#[test]
fn update_advisory_handles_local_newer_than_known() {
    let capabilities = capabilities_with_version("codex 2.0.0");
    let latest = CodexLatestReleases {
        stable: Some(Version::parse("1.9.9").unwrap()),
        ..Default::default()
    };
    let advisory = update_advisory_from_capabilities(&capabilities, &latest);
    assert_eq!(advisory.status, CodexUpdateStatus::LocalNewerThanKnown);
    assert!(!advisory.is_update_recommended());
    assert!(advisory
        .notes
        .iter()
        .any(|note| note.contains("newer than provided")));
}

#[test]
fn update_advisory_handles_missing_latest_metadata() {
    let capabilities = capabilities_with_version("codex 1.0.0");
    let latest = CodexLatestReleases::default();
    let advisory = update_advisory_from_capabilities(&capabilities, &latest);
    assert_eq!(advisory.status, CodexUpdateStatus::UnknownLatestVersion);
    assert!(!advisory.is_update_recommended());
    assert!(advisory
        .notes
        .iter()
        .any(|note| note.contains("advisory unavailable")));
}