glass-browser 0.2.4

Local, revision-safe Chrome automation runtime for agents, with semantic observation, verified workflows, MCP, CLI, TUI, and Rust APIs
Documentation
use serde_json::Value;
use std::process::Command;

#[test]
fn release_certification_blocks_a_suite_without_observations() {
    let output = Command::new(env!("CARGO_BIN_EXE_glass"))
        .args([
            "certify",
            "release",
            "--version",
            "0.2.0",
            "--scenarios",
            "tests/fixtures/reliability-capability-suite-v1.json",
            "--observations",
            "tests/fixtures/reliability-observations-empty.json",
        ])
        .output()
        .unwrap();

    assert!(!output.status.success());
    let report: Value = serde_json::from_slice(&output.stdout).unwrap();
    assert_eq!(report["status"], "blocked");
    assert_eq!(report["gate"]["scenarioCount"], 6);
    assert_eq!(report["gate"]["certified"], false);
    assert_eq!(report["gate"]["failures"][0]["code"], "missing_evidence");
}

#[test]
fn execution_plan_command_is_browser_free_and_manifest_bound() {
    let output = Command::new(env!("CARGO_BIN_EXE_glass"))
        .args([
            "certify",
            "plan",
            "--scenario",
            "tests/fixtures/reliability-scenario-v1.json",
            "--fixture",
            "tests/fixtures/reliability-fixture-v1.json",
        ])
        .output()
        .unwrap();

    assert!(output.status.success());
    let report: Value = serde_json::from_slice(&output.stdout).unwrap();
    assert_eq!(report["status"], "valid");
    assert_eq!(
        report["plan"]["scenarioId"],
        "duplicate-submit-after-timeout"
    );
    assert_eq!(report["plan"]["fixtureId"], "checkout-submit");
    assert_eq!(report["plan"]["operations"].as_array().unwrap().len(), 3);
}