biors 0.57.2

Command-line tools for bio-rs biological AI model input workflows.
use std::fs;

use serde_json::Value;

mod common;

use common::TempDir;

#[test]
fn report_generate_exports_shareable_json_and_markdown() {
    let temp = TempDir::new("biors-report");
    let input = temp.write(
        "workflow.json",
        r#"{
          "ok": true,
          "biors_version": "0.55.0",
          "input_hash": "fnv1a64:08a331cb13c7bd72",
          "data": {
            "workflow": "protein_model_input.v0",
            "model_ready": true,
            "provenance": {},
            "validation": {
              "valid": true,
              "records": 1,
              "valid_records": 1,
              "warning_count": 0,
              "error_count": 0
            },
            "tokenization": {
              "summary": {
                "records": 1,
                "tokens": 4
              },
              "records": []
            },
            "readiness_issues": []
          }
        }"#,
    );
    let markdown = temp.path().join("report.md");
    let shareable = temp.path().join("report.json");

    let output = common::run_biors(&[
        "report",
        "generate",
        input.to_str().expect("input path"),
        "--output",
        markdown.to_str().expect("markdown path"),
        "--shareable-json",
        shareable.to_str().expect("shareable path"),
    ]);
    common::assert_payload_matches_schema(&output.stdout, "schemas/report-output.v0.json");

    let envelope: Value = serde_json::from_slice(&output.stdout).expect("valid CLI JSON");
    assert_eq!(envelope["data"]["schema_version"], "biors.report.v0");
    assert_eq!(envelope["data"]["status"], "pass");
    assert_eq!(
        envelope["data"]["provenance"]["source_input_hash"],
        "fnv1a64:08a331cb13c7bd72"
    );

    let markdown = fs::read_to_string(markdown).expect("read markdown report");
    assert!(markdown.contains("# bio-rs Workflow Report"));
    assert!(markdown.contains("input raw SHA-256"));

    let shareable_json = fs::read(&shareable).expect("read shareable JSON");
    common::assert_json_matches_schema(&shareable_json, "schemas/report-output.v0.json");
}