use super::super::*;
use super::{enrolled, provisioned, request};
use crate::registry::Grade;
use serde_json::{Value, json};
use tempfile::tempdir;
const CAPACITY: [(&str, usize); 4] = [("L", 2953), ("M", 2331), ("Q", 1663), ("H", 1273)];
fn envelope(enrolled: &Enrolled) -> String {
let value: Value = json!({
"yog-enroll": 1,
"grade": enrolled.grade.word(),
"name": enrolled.name,
"address": enrolled.address,
"ca": enrolled.ca,
"cert": enrolled.cert,
"key": enrolled.key,
});
value.to_string()
}
#[test]
fn the_envelope_fits_a_version_40_qr_code() {
let tmp = tempdir().expect("tmp");
let (deps, _) = provisioned(&tmp);
let answer = enrolled(enroll(&deps, "7", &request("phone-1", Grade::Foot)).expect("act"));
let size = envelope(&answer).len();
assert!(
(1400..1700).contains(&size),
"the envelope measured {size} bytes; REMOTE §1.4 records ~1.6 kB, so the encoding \
ruling needs re-taking"
);
for (level, capacity) in CAPACITY {
assert_eq!(
size <= capacity,
level != "H",
"level {level} carries {capacity} bytes and the envelope is {size}"
);
}
}
#[test]
fn the_envelope_carries_exactly_the_six_facts_and_a_version() {
let tmp = tempdir().expect("tmp");
let (deps, _) = provisioned(&tmp);
let answer = enrolled(enroll(&deps, "7", &request("phone-1", Grade::Operator)).expect("act"));
let value: Value = serde_json::from_str(&envelope(&answer)).expect("compact JSON");
let object = value.as_object().expect("an object");
assert_eq!(object.get("yog-enroll"), Some(&json!(1)), "the marker");
let mut keys: Vec<&str> = object.keys().map(String::as_str).collect();
keys.sort_unstable();
assert_eq!(
keys,
[
"address",
"ca",
"cert",
"grade",
"key",
"name",
"yog-enroll"
]
);
assert!(answer.ca.contains("-----BEGIN CERTIFICATE-----\n"));
assert!(envelope(&answer).contains("-----BEGIN CERTIFICATE-----\\n"));
}