use super::super::ctx;
use super::rt;
use crate::boundary::line::{Context, parse};
use crate::boundary::{Gesture, Query};
fn at() -> (String, String) {
("ws".to_owned(), "c-1".to_owned())
}
#[test]
fn every_conversation_read_round_trips() {
let (workspace, agent) = at();
for query in [
Query::Transcript {
workspace: workspace.clone(),
agent: agent.clone(),
},
Query::Follow {
workspace: workspace.clone(),
agent: agent.clone(),
},
Query::Steps {
workspace: workspace.clone(),
agent: agent.clone(),
},
Query::Rail {
workspace: workspace.clone(),
agent: agent.clone(),
},
Query::Inbox {
workspace: workspace.clone(),
agent: agent.clone(),
},
Query::Step {
workspace: workspace.clone(),
agent: agent.clone(),
seq: "003".to_owned(),
},
Query::Agent {
workspace: workspace.clone(),
agent: agent.clone(),
},
] {
rt(Gesture::Ask(query));
}
for path in [None, Some("src/a.rs".to_owned())] {
for at in [None, Some("abcdef1234".to_owned())] {
rt(Gesture::Ask(Query::Files {
workspace: workspace.clone(),
agent: agent.clone(),
path: path.clone(),
at,
}));
}
}
for at in [None, Some("abcdef1234".to_owned())] {
rt(Gesture::Ask(Query::Governing {
workspace: workspace.clone(),
agent: agent.clone(),
at,
}));
}
}
#[test]
fn a_conversation_read_at_an_unaimed_seat_refuses_by_name() {
for verb in ["transcript", "steps", "rail", "inbox", "files", "governing"] {
let unfocused =
parse(&format!("/{verb}"), &Context::default()).expect_err("no workspace is focused");
assert!(unfocused.contains("no workspace in context"), "{unfocused}");
let unselected = parse(
&format!("/{verb}"),
&Context {
workspace: Some("ws".to_owned()),
..Context::default()
},
)
.expect_err("no conversation is selected");
assert!(
unselected.contains("no conversation is selected"),
"{unselected}"
);
}
}
#[test]
fn the_bare_reads_take_no_words_and_a_step_names_its_step() {
for verb in ["transcript", "steps", "rail", "inbox", "governing"] {
let extra = parse(&format!("/{verb} 003"), &ctx()).expect_err("it takes no arguments");
assert!(extra.contains("takes no arguments"), "{extra}");
}
let bare = parse("/step", &ctx()).expect_err("some step is not a question");
assert!(bare.contains("usage: /step <seq>"), "{bare}");
let two = parse("/files a b", &ctx()).expect_err("a path is one word");
assert!(two.contains("at most one word"), "{two}");
let word = parse("/governing abcdef1", &ctx()).expect_err("the commit rides --at");
assert!(word.contains("takes no arguments"), "{word}");
}