use super::aimed;
use crate::channel::entries::WORKSPACE;
use crate::cli::Stream;
use crate::render::Form;
use crate::test_support::Scratch;
use crate::test_support::wire::{entry, flat, wired, yes};
use serde_json::json;
fn bound() -> serde_json::Value {
json!({"op": "ceiling", "usd": 25})
}
#[test]
fn a_box_holding_one_channel_writes_it_unnamed() {
let scratch = Scratch::new();
let alpha = wired(&scratch, &entry("alpha"), vec![vec![yes()]]);
let verdict = aimed(scratch.path(), None, &bound(), Form::Json);
assert_eq!(verdict.code, 0, "{}", verdict.text);
assert_eq!(verdict.text, yes().to_string());
assert!(alpha.heard().contains(&bound()));
}
#[test]
fn a_box_holding_two_channels_refuses_an_unnamed_write_naming_both() {
let scratch = Scratch::new();
let own = wired(&scratch, &flat(), vec![vec![yes()]]);
let alpha = wired(&scratch, &entry("alpha"), vec![vec![yes()]]);
let verdict = aimed(scratch.path(), None, &bound(), Form::Json);
assert_eq!(verdict.code, 1);
assert_eq!(verdict.stream, Stream::Err);
for named in [
"2 channels",
"`ceiling`",
"--on <channel>",
"(this box's own engine)",
"alpha",
] {
assert!(verdict.text.contains(named), "{named}: {}", verdict.text);
}
assert!(!own.heard().contains(&bound()));
assert!(!alpha.heard().contains(&bound()));
}
#[test]
fn a_named_entry_is_the_only_channel_written() {
let scratch = Scratch::new();
let own = wired(&scratch, &flat(), vec![vec![yes()]]);
let alpha = wired(&scratch, &entry("alpha"), vec![vec![yes()]]);
let verdict = aimed(scratch.path(), Some("alpha"), &bound(), Form::Json);
assert_eq!(verdict.code, 0, "{}", verdict.text);
assert!(alpha.heard().contains(&bound()));
assert!(!own.heard().contains(&bound()));
}
#[test]
fn a_workspace_held_on_an_entry_is_reached_by_its_leaf_unrewritten() {
let scratch = Scratch::new();
wired(&scratch, &flat(), vec![vec![yes()]]);
let alpha = wired(&scratch, &entry("alpha"), vec![vec![yes()]]);
std::fs::write(
scratch.path().join(entry("alpha")).join(WORKSPACE),
"personal",
)
.expect("the workspace file");
let verdict = aimed(scratch.path(), Some("alpha"), &bound(), Form::Json);
assert_eq!(verdict.code, 0, "{}", verdict.text);
assert!(alpha.heard().contains(&bound()));
}
#[test]
fn a_name_no_channel_answers_to_is_refused_naming_the_held_ones() {
let scratch = Scratch::new();
let own = wired(&scratch, &flat(), vec![vec![yes()]]);
wired(&scratch, &entry("alpha"), vec![vec![yes()]]);
let verdict = aimed(scratch.path(), Some("beta"), &bound(), Form::Json);
assert_eq!(verdict.code, 1);
assert!(
verdict.text.contains(r#"no channel named "beta""#),
"{}",
verdict.text
);
assert!(verdict.text.contains(r#""alpha""#), "{}", verdict.text);
assert!(!own.heard().contains(&bound()));
}