labscript 0.1.0

Prescription PDF generator with e-signature and QR verification
use assert_cmd::Command;
use predicates::prelude::*;
use tempfile::TempDir;

fn cmd() -> Command {
    Command::cargo_bin("labscript").unwrap()
}

#[test]
fn agent_info_returns_json() {
    cmd()
        .arg("agent-info")
        .assert()
        .success()
        .stdout(predicate::str::contains("\"name\": \"labscript\""))
        .stdout(predicate::str::contains("\"version\""))
        .stdout(predicate::str::contains("\"capabilities\""));
}

#[test]
fn generate_from_cli_args() {
    let dir = TempDir::new().unwrap();
    let output = dir.path().join("test-rx.pdf");

    cmd()
        .args([
            "generate",
            "--patient-name", "Jensen Fernandez",
            "--patient-dob", "2006-08-02",
            "--patient-address", "123 Main St, London",
            "--prescriber-name", "Dr. Boris Djordjevic",
            "--prescriber-credentials", "MD, PhD",
            "--prescriber-license", "GMC-1234567",
            "--prescriber-address", "199 Biotechnologies, London",
            "--drug", "Metformin",
            "--strength", "500mg",
            "--form", "tablet",
            "--quantity", "60",
            "--sig", "Take 1 tablet by mouth twice daily with meals",
            "--refills", "3",
            "--diagnosis", "Pre-diabetes management",
            "--notes", "Monitor HbA1c quarterly",
            "--output", output.to_str().unwrap(),
            "--json",
        ])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"status\": \"success\""))
        .stdout(predicate::str::contains("\"prescription_id\""))
        .stdout(predicate::str::contains("\"verification_hash\""));

    // Verify the PDF file was created
    assert!(output.exists(), "PDF file should exist");
    assert!(
        std::fs::metadata(&output).unwrap().len() > 0,
        "PDF file should not be empty"
    );
}

#[test]
fn generate_from_json_stdin() {
    let dir = TempDir::new().unwrap();
    let output = dir.path().join("stdin-rx.pdf");

    let json_input = serde_json::json!({
        "patient": {
            "name": "Jane Smith",
            "dob": "1990-05-15",
            "address": "456 Oak Ave"
        },
        "prescriber": {
            "name": "Dr. Alice Johnson",
            "credentials": "MD",
            "license": "GMC-7654321",
            "address": "London Medical Centre"
        },
        "medications": [
            {
                "drug": "Lisinopril",
                "strength": "10mg",
                "form": "tablet",
                "quantity": 30,
                "sig": "Take 1 tablet by mouth once daily",
                "refills": 5
            },
            {
                "drug": "Metformin",
                "strength": "500mg",
                "form": "tablet",
                "quantity": 60,
                "sig": "Take 1 tablet twice daily with meals",
                "refills": 3
            }
        ],
        "diagnosis": "Hypertension, Type 2 DM",
        "date": "2026-03-26"
    });

    cmd()
        .args([
            "generate",
            "--stdin",
            "--output", output.to_str().unwrap(),
            "--json",
        ])
        .write_stdin(serde_json::to_string(&json_input).unwrap())
        .assert()
        .success()
        .stdout(predicate::str::contains("\"status\": \"success\""))
        .stdout(predicate::str::contains("\"medication_count\": 2"));

    assert!(output.exists(), "PDF file should exist");
}

#[test]
fn verify_valid_qr() {
    // Build a valid QR string
    let uuid = "550e8400-e29b-41d4-a716-446655440000";
    let hash = "a".repeat(64);
    let ts = "2026-03-26T12:00:00Z";
    let qr = format!("labscript:v1:{uuid}:{hash}:{ts}");

    cmd()
        .args(["verify", &qr, "--json"])
        .assert()
        .success()
        .stdout(predicate::str::contains("\"valid\": true"))
        .stdout(predicate::str::contains("\"version\": \"v1\""))
        .stdout(predicate::str::contains(uuid));
}

#[test]
fn verify_invalid_qr() {
    // Too few fields
    cmd()
        .args(["verify", "labscript:v1:bad", "--json"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("\"status\": \"error\""));

    // Wrong prefix
    cmd()
        .args(["verify", "notlabscript:v1:a:b:c", "--json"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("\"status\": \"error\""));

    // Bad hash length
    let uuid = "550e8400-e29b-41d4-a716-446655440000";
    let qr = format!("labscript:v1:{uuid}:shorthash:2026-03-26T12:00:00Z");
    cmd()
        .args(["verify", &qr, "--json"])
        .assert()
        .failure()
        .stderr(predicate::str::contains("\"status\": \"error\""));
}