KeiSeiKit-1.0/_primitives/_rust/kei-decision/tests/emit_smoke.rs
Parfii-bot 0be354a920 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

50 lines
2.2 KiB
Rust

//! Smoke: full plan pipeline emits N task.toml files; each is valid TOML.
use kei_decision::{classify, emit_task_toml, parse_master_report, rank_actions};
use std::path::PathBuf;
fn fixture(name: &str) -> PathBuf {
let mut p = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
p.push("tests/fixtures");
p.push(name);
p
}
#[test]
fn emit_writes_one_task_per_action_and_each_parses_as_toml() {
let master = fixture("valid-master.md");
let raws = parse_master_report(&master).expect("parse");
let kinds: Vec<_> = raws.iter().map(classify).collect();
let ranked = rank_actions(raws, kinds);
let tmp = tempfile::tempdir().expect("tempdir");
let mut paths = Vec::new();
for action in &ranked {
let out = emit_task_toml(action, tmp.path(), &master).expect("emit");
paths.push(out.path);
}
assert_eq!(paths.len(), 5, "expected one task per ranked action");
for path in &paths {
let body = std::fs::read_to_string(path).expect("read emitted file");
let parsed: toml::Value = toml::from_str(&body).expect("emitted file must be valid TOML");
let task_section = parsed.get("task").expect("[task] section present");
assert!(task_section.get("role").is_some(), "[task].role required");
assert!(task_section.get("description").is_some(), "[task].description required");
let scope = parsed.get("scope").expect("[scope] section present");
assert!(scope.get("files-whitelist").is_some(), "[scope].files-whitelist required");
}
}
#[test]
fn emit_filename_includes_action_id_and_slug() {
let master = fixture("valid-master.md");
let raws = parse_master_report(&master).expect("parse");
let kinds: Vec<_> = raws.iter().map(classify).collect();
let ranked = rank_actions(raws, kinds);
let tmp = tempfile::tempdir().expect("tempdir");
let action = &ranked[0];
let out = emit_task_toml(action, tmp.path(), &master).expect("emit");
let name = out.path.file_name().unwrap().to_str().unwrap();
assert!(name.starts_with(&format!("action-{}", action.raw.id)),
"filename should start with action-{}; got {}", action.raw.id, name);
assert!(name.ends_with(".toml"));
}