Story 28: Show remaining test TODOs in the UI
Add TodoPanel that displays unchecked acceptance criteria from current story files. Backend parses `- [ ]` lines from markdown, frontend shows them in a panel with refresh. Includes 4 Rust unit tests, 3 Vitest tests, 3 Playwright E2E tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -59,6 +59,18 @@ fn build_metadata(front: FrontMatter) -> StoryMetadata {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_unchecked_todos(contents: &str) -> Vec<String> {
|
||||
contents
|
||||
.lines()
|
||||
.filter_map(|line| {
|
||||
let trimmed = line.trim();
|
||||
trimmed
|
||||
.strip_prefix("- [ ] ")
|
||||
.map(|text| text.to_string())
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn parse_test_plan_status(value: &str) -> TestPlanStatus {
|
||||
match value {
|
||||
"approved" => TestPlanStatus::Approved,
|
||||
@@ -108,4 +120,31 @@ workflow: tdd
|
||||
Err(StoryMetaError::InvalidFrontMatter(_))
|
||||
));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_unchecked_todos_mixed() {
|
||||
let input = "## AC\n- [ ] First thing\n- [x] Done thing\n- [ ] Second thing\n";
|
||||
assert_eq!(
|
||||
parse_unchecked_todos(input),
|
||||
vec!["First thing", "Second thing"]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_unchecked_todos_all_checked() {
|
||||
let input = "- [x] Done\n- [x] Also done\n";
|
||||
assert!(parse_unchecked_todos(input).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_unchecked_todos_no_checkboxes() {
|
||||
let input = "# Story\nSome text\n- A bullet\n";
|
||||
assert!(parse_unchecked_todos(input).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_unchecked_todos_leading_whitespace() {
|
||||
let input = " - [ ] Indented item\n";
|
||||
assert_eq!(parse_unchecked_todos(input), vec!["Indented item"]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user