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\""));
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() {
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() {
cmd()
.args(["verify", "labscript:v1:bad", "--json"])
.assert()
.failure()
.stderr(predicate::str::contains("\"status\": \"error\""));
cmd()
.args(["verify", "notlabscript:v1:a:b:c", "--json"])
.assert()
.failure()
.stderr(predicate::str::contains("\"status\": \"error\""));
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\""));
}