huskies: merge 984
This commit is contained in:
@@ -938,3 +938,127 @@ fn merge_failure_item_appears_in_merge_section_not_blocked() {
|
||||
"merge failure reason should be shown: {output}"
|
||||
);
|
||||
}
|
||||
|
||||
// -- Story 984: Abandoned / Superseded / Rejected appear in Closed section ----
|
||||
|
||||
#[test]
|
||||
fn abandoned_item_appears_in_closed_section_with_wastebasket() {
|
||||
use tempfile::TempDir;
|
||||
let tmp = TempDir::new().unwrap();
|
||||
|
||||
let items = vec![make_item(
|
||||
"984_story_abandoned",
|
||||
"Abandoned Story",
|
||||
Stage::Abandoned { ts: Utc::now() },
|
||||
)];
|
||||
|
||||
let agents = AgentPool::new_test(3000);
|
||||
let output = build_status_from_items(tmp.path(), &agents, &items);
|
||||
|
||||
assert!(
|
||||
output.contains("**Closed**"),
|
||||
"output must have a Closed section: {output}"
|
||||
);
|
||||
let closed_pos = output.find("**Closed**").unwrap();
|
||||
let story_pos = output
|
||||
.find("984 [story]")
|
||||
.expect("story must appear in output");
|
||||
assert!(
|
||||
story_pos > closed_pos,
|
||||
"abandoned story should be after Closed header: {output}"
|
||||
);
|
||||
assert!(
|
||||
output.contains("\u{1F5D1}\u{FE0F}"), // 🗑️
|
||||
"abandoned story should show wastebasket icon: {output}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn superseded_item_appears_in_closed_section_with_shuffle() {
|
||||
use tempfile::TempDir;
|
||||
let tmp = TempDir::new().unwrap();
|
||||
|
||||
let items = vec![make_item(
|
||||
"985_story_superseded",
|
||||
"Superseded Story",
|
||||
Stage::Superseded {
|
||||
ts: Utc::now(),
|
||||
superseded_by: crate::pipeline_state::StoryId("999_story_new".to_string()),
|
||||
},
|
||||
)];
|
||||
|
||||
let agents = AgentPool::new_test(3000);
|
||||
let output = build_status_from_items(tmp.path(), &agents, &items);
|
||||
|
||||
let closed_pos = output
|
||||
.find("**Closed**")
|
||||
.expect("Closed section must exist");
|
||||
let story_pos = output
|
||||
.find("985 [story]")
|
||||
.expect("story must appear in output");
|
||||
assert!(story_pos > closed_pos, "superseded story must be in Closed");
|
||||
assert!(
|
||||
output.contains("\u{1F500}"), // 🔀
|
||||
"superseded story should show shuffle icon: {output}"
|
||||
);
|
||||
assert!(
|
||||
output.contains("999_story_new"),
|
||||
"superseded story should show the replacement ID: {output}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejected_item_appears_in_closed_section_with_no_entry() {
|
||||
use tempfile::TempDir;
|
||||
let tmp = TempDir::new().unwrap();
|
||||
|
||||
let items = vec![make_item(
|
||||
"986_story_rejected",
|
||||
"Rejected Story",
|
||||
Stage::Rejected {
|
||||
ts: Utc::now(),
|
||||
reason: "not aligned with roadmap".to_string(),
|
||||
},
|
||||
)];
|
||||
|
||||
let agents = AgentPool::new_test(3000);
|
||||
let output = build_status_from_items(tmp.path(), &agents, &items);
|
||||
|
||||
let closed_pos = output
|
||||
.find("**Closed**")
|
||||
.expect("Closed section must exist");
|
||||
let story_pos = output
|
||||
.find("986 [story]")
|
||||
.expect("story must appear in output");
|
||||
assert!(story_pos > closed_pos, "rejected story must be in Closed");
|
||||
assert!(
|
||||
output.contains("\u{1F6AB}"), // 🚫
|
||||
"rejected story should show no-entry icon: {output}"
|
||||
);
|
||||
assert!(
|
||||
output.contains("not aligned with roadmap"),
|
||||
"rejected story should show the rejection reason: {output}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn display_section_returns_closed_for_new_terminal_variants() {
|
||||
assert_eq!(
|
||||
display_section(&Stage::Abandoned { ts: Utc::now() }),
|
||||
Some("Closed")
|
||||
);
|
||||
assert_eq!(
|
||||
display_section(&Stage::Superseded {
|
||||
ts: Utc::now(),
|
||||
superseded_by: crate::pipeline_state::StoryId("1".to_string()),
|
||||
}),
|
||||
Some("Closed")
|
||||
);
|
||||
assert_eq!(
|
||||
display_section(&Stage::Rejected {
|
||||
ts: Utc::now(),
|
||||
reason: "x".to_string(),
|
||||
}),
|
||||
Some("Closed")
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user