use super::super::fan;
use super::boom;
use super::{advertised, aside, echo, engine_at, receipt, refusal, restored, row, set, work};
use crate::channel::entries;
use crate::test_support::{Notices, Scratch, unwaited};
#[test]
fn every_entry_is_served_and_each_answers_under_its_own_name() {
let scratch = Scratch::new();
let _one = engine_at(
&scratch.join("north"),
vec![
advertised(),
work(vec![row("i-1", "Bash")]),
refusal("north stopped"),
],
);
let _two = engine_at(&scratch.join("south"), vec![refusal("south stopped")]);
std::fs::create_dir_all(scratch.join("empty")).expect("mkdir");
let said = fan(
entries::read_dir(scratch.path()),
set(),
echo,
&aside(),
&unwaited(),
);
assert_eq!(said.len(), 3);
assert!(said[0].starts_with("empty: "), "{said:?}");
assert!(said[0].contains("is an empty entry"), "{said:?}");
assert_eq!(said[1], "north: north stopped");
assert_eq!(said[2], "south: south stopped");
}
#[test]
fn a_box_with_no_entry_has_nothing_to_report() {
let scratch = Scratch::new();
assert_eq!(
fan(
entries::read_dir(scratch.path()),
set(),
echo,
&aside(),
&unwaited()
),
Vec::<String>::new()
);
}
#[test]
fn a_notice_names_the_channel_that_raised_it() {
let (notices, sink) = Notices::new();
let scratch = Scratch::new();
let _one = engine_at(
&scratch.join("north"),
vec![
advertised(),
work(vec![row("i-1", "Bash")]),
receipt("i-1"),
restored(),
work(vec![row("i-2", "Bash")]),
refusal("north stopped"),
],
);
let _two = engine_at(&scratch.join("south"), vec![refusal("south stopped")]);
let said = fan(
entries::read_dir(scratch.path()),
set(),
echo,
&sink,
&unwaited(),
);
assert_eq!(said, ["north: north stopped", "south: south stopped"]);
let heard = notices.heard();
let disarm: Vec<&String> = heard
.iter()
.filter(|line| line.contains("was not the set in force"))
.collect();
assert_eq!(disarm.len(), 1, "{heard:?}");
assert!(disarm[0].starts_with("north: "), "{heard:?}");
assert_eq!(heard.len(), 3, "{heard:?}");
assert!(
heard.contains(&"north: north stopped".to_owned()),
"{heard:?}"
);
assert!(
heard.contains(&"south: south stopped".to_owned()),
"{heard:?}"
);
}
#[test]
fn a_channel_that_dies_is_named_and_does_not_take_the_others_with_it() {
let scratch = Scratch::new();
let _one = engine_at(
&scratch.join("north"),
vec![advertised(), work(vec![row("i-1", "Bash")])],
);
let _two = engine_at(&scratch.join("south"), vec![refusal("south stopped")]);
let said = fan(
entries::read_dir(scratch.path()),
set(),
boom,
&aside(),
&unwaited(),
);
assert_eq!(
said,
[
"north: the channel ended by panicking",
"south: south stopped"
]
);
}