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.
52 lines
1.9 KiB
Rust
52 lines
1.9 KiB
Rust
//! Integration tests for the markdown action-table parser.
|
|
|
|
use kei_decision::{parse_master_report, ParseError};
|
|
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 valid_master_extracts_five_actions() {
|
|
let actions = parse_master_report(&fixture("valid-master.md")).expect("parse ok");
|
|
assert_eq!(actions.len(), 5, "expected 5 rows in fixture, got {:?}", actions);
|
|
assert_eq!(actions[0].id, "1");
|
|
assert!(actions[0].title.contains("Refactor 4 hooks"));
|
|
assert_eq!(actions[0].severity, "LOW");
|
|
assert_eq!(actions[0].effort, "1-2d");
|
|
}
|
|
|
|
#[test]
|
|
fn deps_hint_parsed_when_present() {
|
|
let actions = parse_master_report(&fixture("valid-master.md")).expect("parse ok");
|
|
let migrate = actions.iter().find(|a| a.id == "3").expect("row 3 present");
|
|
assert_eq!(migrate.deps, vec!["1".to_string()]);
|
|
let new_prim = actions.iter().find(|a| a.id == "4").expect("row 4 present");
|
|
assert_eq!(new_prim.deps, vec!["3".to_string()]);
|
|
}
|
|
|
|
#[test]
|
|
fn no_actions_returns_no_actions_found() {
|
|
let err = parse_master_report(&fixture("no-actions.md")).expect_err("should fail");
|
|
assert!(matches!(err, ParseError::NoActionsFound), "got {:?}", err);
|
|
}
|
|
|
|
#[test]
|
|
fn malformed_table_skips_gracefully() {
|
|
// The malformed fixture has a 1-column table — parser should accept rows
|
|
// (since "Action" header present), defaulting severity/effort to empty.
|
|
let actions = parse_master_report(&fixture("malformed-table.md")).expect("parse ok");
|
|
assert_eq!(actions.len(), 2);
|
|
assert!(actions[0].severity.is_empty());
|
|
assert!(actions[0].effort.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn missing_file_returns_file_not_found() {
|
|
let err = parse_master_report(&fixture("DOES-NOT-EXIST.md")).expect_err("should fail");
|
|
assert!(matches!(err, ParseError::FileNotFound(_)), "got {:?}", err);
|
|
}
|