use serde_json::{Value, json};
use super::super::{INDOUBT, enroll};
use super::{minted, spent, tree};
use crate::cli::Stream;
use crate::test_support::{Scratch, wire};
#[test]
fn a_destination_that_refuses_still_says_the_material_and_fails() {
let scratch = Scratch::new();
let _engine = wire::wired(&scratch, &wire::flat(), vec![vec![minted()]]);
let blocked = scratch.path().join("occupied");
std::fs::write(&blocked, "notreal").expect("the blocker was written");
let verdict = enroll(
scratch.path(),
"home",
"phone-1",
"foot",
Some(&blocked.join("under")),
);
assert_eq!(verdict.code, 1, "{}", verdict.text);
assert_eq!(
verdict.stream,
Stream::Out,
"the product is still a product"
);
assert!(verdict.text.contains("not filed"), "{}", verdict.text);
assert!(verdict.text.contains("yog-enroll"), "{}", verdict.text);
}
#[test]
fn a_refusal_is_answered_rather_than_drawn() {
let (verdict, ..) = spent(vec![json!({"ok": false, "error": "not operator-grade"})]);
assert_eq!(verdict.stream, Stream::Out);
assert_eq!(verdict.code, 1);
assert!(
verdict.text.contains("not operator-grade"),
"{}",
verdict.text
);
}
#[test]
fn an_unreadable_frame_fails_in_this_seat_s_own_words() {
let (verdict, ..) = spent(vec![json!({"ok": true, "kind": "enrolled"})]);
assert_eq!(verdict.stream, Stream::Err);
assert!(verdict.text.contains("grade"), "{}", verdict.text);
}
#[test]
fn an_answer_of_another_kind_says_nothing_was_minted() {
let (verdict, ..) = spent(vec![json!({"ok": true, "kind": "nudged"})]);
assert_eq!(verdict.stream, Stream::Err);
assert!(verdict.text.contains("did not mint"), "{}", verdict.text);
}
#[test]
fn a_root_with_no_channel_fails_before_anything_is_asked() {
let scratch = Scratch::new();
let verdict = enroll(scratch.path(), "home", "phone-1", "foot", None);
assert_eq!(verdict.stream, Stream::Err);
assert_eq!(verdict.code, 1);
assert_eq!(tree(scratch.path()), Vec::<String>::new());
}
#[test]
fn material_too_big_for_a_symbol_says_so_and_still_says_the_material() {
let mut oversized = minted();
oversized["ca"] = Value::String("notreal".repeat(400));
let (verdict, before, after) = spent(vec![oversized]);
assert_eq!(verdict.stream, Stream::Out);
assert_eq!(verdict.code, 0, "{}", verdict.text);
assert!(verdict.text.contains("will not fit"), "{}", verdict.text);
assert!(
verdict.text.contains("2331"),
"the ceiling: {}",
verdict.text
);
assert!(verdict.text.contains("yog-enroll"), "{}", verdict.text);
assert_eq!(before, after, "it still wrote nothing");
}
#[test]
fn an_enrollment_that_crossed_with_no_answer_is_in_doubt_and_says_not_to_repeat() {
let scratch = Scratch::new();
let _engine = wire::wired(
&scratch,
&wire::flat(),
vec![crate::test_support::engine::Answer::Hangup],
);
let verdict = enroll(scratch.path(), "home", "phone", "seat", None);
assert_eq!(verdict.code, 1);
assert!(verdict.text.contains(INDOUBT), "{}", verdict.text);
assert!(
verdict.text.contains("clients"),
"the recovery is a read, and it is named: {}",
verdict.text
);
}
#[test]
fn an_empty_stream_says_the_engine_answered_nothing() {
let (verdict, ..) = spent(Vec::new());
assert!(verdict.text.contains("nothing at all"), "{}", verdict.text);
}