use super::*;
use crate::git_tree::tests::fixture::Fixture;
use crate::model_pick::BRANCH;
use crate::test_support::TEMPLATE_PROVIDERS;
use crate::tool_host::engine_act;
#[test]
fn the_worker_gains_clients_and_authoring_is_a_fixed_point() {
let once = authored(TEMPLATE_PROVIDERS, &shipped());
assert_ne!(once, TEMPLATE_PROVIDERS, "the shipped template drifts");
let granted = entry_field(&once, ROLES, WORKER_ROLE, TOOLS)
.and_then(|v| flow_members(&v))
.expect("the worker's grant");
assert!(granted.iter().any(|n| n == clients::NAME), "{granted:?}");
for shipped in ["apply_patch", "bash", "dispatch", "read_file"] {
assert!(granted.iter().any(|n| n == shipped), "{granted:?}");
}
assert_eq!(authored(&once, &shipped()), once, "the fixed point");
}
#[test]
fn the_checkpoint_roles_are_left_exactly_as_they_were() {
let once = authored(TEMPLATE_PROVIDERS, &shipped());
assert_eq!(entry_field(&once, ROLES, "compactor", TOOLS), None);
assert_eq!(
entry_field(&once, ROLES, "reviewer", TOOLS),
entry_field(TEMPLATE_PROVIDERS, ROLES, "reviewer", TOOLS),
);
}
#[test]
fn a_file_this_has_nothing_to_say_about_is_unchanged() {
for base in [
"",
"roles:\n worker:\n provider: anthropic\n model: m\n",
"roles:\n worker:\n provider: anthropic\n model: m\n tools:\n - bash\n",
"roles:\n compactor:\n provider: anthropic\n model: m\n",
] {
assert_eq!(authored(base, &shipped()), base, "{base:?}");
}
}
fn shipped() -> Policy {
Policy::parse("")
}
fn staged(fixture: &Fixture) -> Vec<String> {
drift(&fixture.path, BRANCH)
.into_iter()
.map(|d| d.rel_path)
.collect()
}
#[test]
fn the_grant_and_the_description_it_is_worthless_without_move_together() {
let fixture = Fixture::new();
fixture.commit_other(PROVIDERS_YAML, TEMPLATE_PROVIDERS);
assert_eq!(staged(&fixture), [PROVIDERS_YAML, SCHEMA_PATH]);
fixture.commit_other(PROVIDERS_YAML, &authored(TEMPLATE_PROVIDERS, &shipped()));
assert_eq!(staged(&fixture), [SCHEMA_PATH]);
fixture.commit_other(SCHEMA_PATH, &described());
assert!(staged(&fixture).is_empty());
}
#[test]
fn the_description_is_the_declared_schema_verbatim() {
let said: serde_json::Value = serde_json::from_str(&described()).expect("valid JSON");
assert_eq!(said, clients::schema());
assert!(described().ends_with('\n'));
}
#[test]
fn no_grant_means_no_description_and_no_lineage_means_neither() {
let fixture = Fixture::new();
fixture.commit_other(
PROVIDERS_YAML,
"roles:\n worker:\n provider: anthropic\n model: m\n",
);
assert!(staged(&fixture).is_empty());
assert!(drift(&Fixture::new().path, BRANCH).is_empty());
}
#[test]
fn a_name_the_pinned_engine_no_longer_ships_is_pruned() {
let stale =
TEMPLATE_PROVIDERS.replace("tools: [apply_patch,", "tools: [multi_tool, apply_patch,");
assert_ne!(stale, TEMPLATE_PROVIDERS, "the stale lineage was planted");
let once = authored(&stale, &shipped());
let granted = entry_field(&once, ROLES, WORKER_ROLE, TOOLS)
.and_then(|v| flow_members(&v))
.expect("the worker's grant");
assert!(!granted.iter().any(|n| n == "multi_tool"), "{granted:?}");
assert!(granted.iter().any(|n| n == clients::NAME), "{granted:?}");
for shipped in ::litany::cmd::BUILTIN_TOOLS {
assert!(granted.iter().any(|n| n == shipped), "{granted:?}");
}
assert_eq!(authored(&once, &shipped()), once, "the fixed point");
}
#[test]
fn a_name_the_operator_stated_a_reach_for_is_kept() {
let stale =
TEMPLATE_PROVIDERS.replace("tools: [apply_patch,", "tools: [box2_shell, apply_patch,");
let stated = Policy::parse("rules:\n box2_shell: open-world\n");
let kept = authored(&stale, &stated);
let granted = entry_field(&kept, ROLES, WORKER_ROLE, TOOLS)
.and_then(|v| flow_members(&v))
.expect("the worker's grant");
assert!(granted.iter().any(|n| n == "box2_shell"), "{granted:?}");
let pruned = authored(&stale, &shipped());
assert!(!pruned.contains("box2_shell"), "{pruned}");
}
#[test]
fn the_kept_set_is_the_engine_s_own_plus_what_the_operator_states() {
for name in ::litany::cmd::BUILTIN_TOOLS
.into_iter()
.chain(engine_act::NAMES)
.chain([clients::NAME])
{
assert!(keep::keep(name, &shipped()), "{name}");
}
assert!(!keep::keep("multi_tool", &shipped()));
assert!(keep::keep(
"multi_tool",
&Policy::parse("rules:\n multi_tool: read\n")
));
}