sim-lib-agent 0.1.3

Agent runtime surfaces for SIM.
Documentation
use super::capsule::{
    CapsuleJobOutcome, GeneratedArtifact, JobSite, PinPlanEntry, fake_change_capsule,
    review_change_capsule,
};

#[test]
fn successful_capsule_replays_and_accepts() {
    let capsule = fake_change_capsule().unwrap();
    let review = review_change_capsule(&capsule).unwrap();

    assert!(review.accepted, "{:?}", review.failure_reasons);
    assert_eq!(review.content_hash, review.replay_content_hash);
    assert!(review.preview_repos.contains(&"sim-agent-net".to_owned()));
}

#[test]
fn failed_validation_rejects_capsule() {
    let mut capsule = fake_change_capsule().unwrap();
    capsule.validations[0].outcome = CapsuleJobOutcome::Failed;

    let review = review_change_capsule(&capsule).unwrap();
    assert!(!review.accepted);
    assert!(
        review
            .failure_reasons
            .iter()
            .any(|reason| reason.contains("validation job"))
    );
}

#[test]
fn stale_pin_is_refused_before_pin_update() {
    let mut capsule = fake_change_capsule().unwrap();
    capsule.pin_plan = vec![PinPlanEntry {
        repo: "sim-agent-net".to_owned(),
        current_commit: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb".to_owned(),
        new_commit: "cccccccccccccccccccccccccccccccccccccccc".to_owned(),
        pushed_commit_exists: false,
    }];

    let review = review_change_capsule(&capsule).unwrap();
    assert!(!review.accepted);
    assert!(
        review
            .failure_reasons
            .iter()
            .any(|reason| reason.contains("pushed upstream commit"))
    );
}

#[test]
fn generated_doc_hand_edit_is_refused() {
    let mut capsule = fake_change_capsule().unwrap();
    capsule.generated_artifacts = vec![GeneratedArtifact {
        repo: "sim-web".to_owned(),
        path: "docs/generated/contract.md".to_owned(),
        generator: "manual edit".to_owned(),
        generated_public_doc: true,
        hand_edited: true,
    }];

    let review = review_change_capsule(&capsule).unwrap();
    assert!(!review.accepted);
    assert!(
        review
            .failure_reasons
            .iter()
            .any(|reason| reason.contains("must be regenerated"))
    );
}

#[test]
fn validation_jobs_must_be_realized_on_process_or_fabric_sites() {
    let mut capsule = fake_change_capsule().unwrap();
    capsule.validations[0].site = JobSite::LocalCoroutine;

    let review = review_change_capsule(&capsule).unwrap();
    assert!(!review.accepted);
    assert!(
        review
            .failure_reasons
            .iter()
            .any(|reason| reason.contains("process or fabric"))
    );
}