storkit: merge 464_bug_timer_rejects_backlog_stories_should_move_to_current_on_fire

This commit is contained in:
dave
2026-04-03 12:05:26 +00:00
parent 199c8eb448
commit 1bf32c6537
+46
View File
@@ -935,4 +935,50 @@ mod tests {
assert!(result.contains("421_story_foo"), "unexpected: {result}"); assert!(result.contains("421_story_foo"), "unexpected: {result}");
assert!(result.contains("Pending timers"), "unexpected: {result}"); assert!(result.contains("Pending timers"), "unexpected: {result}");
} }
// ── AC: firing a timer for a backlog story moves it to current ───────
/// When a timer fires for a story in backlog, the tick loop calls
/// `move_story_to_current` before `start_agent`. This test exercises
/// that exact sequence (minus the agent pool) to prove the story ends
/// up in `2_current/` after firing.
#[test]
fn fired_timer_for_backlog_story_moves_to_current() {
use std::fs;
let dir = TempDir::new().unwrap();
let root = dir.path();
let backlog = root.join(".storkit/work/1_backlog");
let current = root.join(".storkit/work/2_current");
fs::create_dir_all(&backlog).unwrap();
fs::create_dir_all(&current).unwrap();
fs::write(backlog.join("421_story_foo.md"), "---\nname: Foo\n---\n").unwrap();
// Add a past timer so take_due returns it immediately.
let store = TimerStore::load(root.join("timers.json"));
let past = Utc::now() - Duration::seconds(1);
store.add("421_story_foo".to_string(), past).unwrap();
// Drain due timers — same as the tick loop does.
let due = store.take_due(Utc::now());
assert_eq!(due.len(), 1, "expected one fired timer");
// Apply the move-to-current step the tick loop performs.
for entry in &due {
crate::agents::lifecycle::move_story_to_current(root, &entry.story_id)
.expect("move_story_to_current should succeed for backlog story");
}
// Story must now be in 2_current/, not in 1_backlog/.
assert!(
current.join("421_story_foo.md").exists(),
"story should be in 2_current/ after timer fires"
);
assert!(
!backlog.join("421_story_foo.md").exists(),
"story should no longer be in 1_backlog/ after timer fires"
);
// Timer was consumed.
assert!(store.list().is_empty(), "fired timer should be removed from store");
}
} }