use serde_json::json;
use super::call;
use crate::network::Rail as _;
use crate::network::fake::{Answer, FAKE_PASS_PREFIX, Fake};
#[test]
fn call_returns_the_workers_reply_as_structured_content() {
let rail = Fake::new(json!({}), &[("echo.request", Answer::Echo)]);
let answer = call(&rail, "echo.request", &json!({ "text": "hi" }), true, None);
assert!(!answer.is_error, "{:?}", answer.structured);
assert_eq!(answer.structured, json!({ "echoed": { "text": "hi" } }));
assert_eq!(
rail.pushed(),
vec![("echo.request".to_owned(), json!({ "text": "hi" }))]
);
assert_eq!(rail.counts().read(), [1, 1, 0, 0, 1, 1]);
}
#[test]
fn call_without_reply_is_one_push_and_no_wait() {
let rail = Fake::new(json!({}), &[("echo.request", Answer::Echo)]);
let answer = call(&rail, "echo.request", &json!({ "text": "hi" }), false, None);
assert!(!answer.is_error);
assert_eq!(
answer.structured,
json!({ "subject": "echo.request", "sent": true })
);
assert_eq!(rail.counts().read(), [1, 1, 0, 0, 1, 0]);
}
#[test]
fn a_refusal_is_the_servers_words_verbatim() {
let words = "the service serving echo.request left before answering";
let rail = Fake::new(
json!({}),
&[("echo.request", Answer::Refuse(words.to_owned()))],
);
let answer = call(&rail, "echo.request", &json!({}), true, None);
assert!(answer.is_error);
assert_eq!(answer.structured["error"], words);
assert_eq!(answer.structured["subject"], "echo.request");
}
#[test]
fn an_oversize_request_is_refused_before_anything_is_opened() {
let rail = Fake::new(json!({}), &[("echo.request", Answer::Echo)]);
let big = json!({ "text": "x".repeat(5000) });
let answer = call(&rail, "echo.request", &big, true, None);
assert!(answer.is_error);
assert_eq!(
answer.structured["error"],
"the request is over 4096 bytes and was not sent"
);
assert_eq!(rail.counts().read(), [0, 0, 0, 0, 0, 0]);
}
#[test]
fn pass_for_puts_the_seats_pass_for_that_audience_in_the_input_as_pass() {
let rail = Fake::new(json!({}), &[("echo.request", Answer::Echo)]);
let answer = call(
&rail,
"echo.request",
&json!({ "text": "hi" }),
true,
Some("haematite"),
);
assert!(!answer.is_error, "{:?}", answer.structured);
assert_eq!(
rail.pushed(),
vec![(
"echo.request".to_owned(),
json!({ "text": "hi", "pass": format!("{FAKE_PASS_PREFIX}haematite") })
)]
);
}
#[test]
fn an_input_already_carrying_a_pass_is_refused_with_pass_for_and_nothing_is_sent() {
let rail = Fake::new(json!({}), &[("echo.request", Answer::Echo)]);
let answer = call(
&rail,
"echo.request",
&json!({ "pass": "mine" }),
true,
Some("haematite"),
);
assert!(answer.is_error);
assert!(rail.pushed().is_empty());
assert_eq!(rail.counts().read(), [0, 0, 0, 0, 0, 0]);
}