huskies: merge 868

This commit is contained in:
dave
2026-04-29 23:28:57 +00:00
parent e02e566648
commit 1d86202abb
15 changed files with 135 additions and 60 deletions
+53
View File
@@ -655,4 +655,57 @@ fn regression_freeze_unfreeze_restores_crdt_stage() {
);
}
// ── Story 868: MergeFailure regression ─────────────────────────────
/// Regression test (story 868): applying `PipelineEvent::MergeFailed` to a story
/// in `Stage::Merge` transitions it to `Stage::MergeFailure` and the emitted
/// `TransitionFired` event carries the full reason string in its payload.
#[test]
fn merge_failure_transition_emits_event_with_full_reason() {
crate::crdt_state::init_for_test();
crate::db::ensure_content_store();
let story_id = "99868_story_merge_failure_event";
crate::db::write_item_with_content(
story_id,
"4_merge",
"---\nname: Merge Failure Event Test\n---\n# Story\n",
);
let reason = "Conflict in server/src/main.rs: both modified";
let fired = super::apply::apply_transition(
story_id,
PipelineEvent::MergeFailed {
reason: reason.to_string(),
},
None,
)
.expect("MergeFailed transition should succeed");
// The emitted event payload carries the full reason string.
match &fired.event {
PipelineEvent::MergeFailed { reason: r } => {
assert_eq!(r, reason, "emitted event should carry the full reason");
}
other => panic!("expected MergeFailed event, got: {other:?}"),
}
// The story transitioned to MergeFailure.
assert!(
matches!(fired.after, Stage::MergeFailure { .. }),
"after-stage should be MergeFailure: {:?}",
fired.after
);
// Verify CRDT reflects the new stage.
let item = read_typed(story_id)
.expect("CRDT read should succeed")
.expect("item should exist");
assert_eq!(
item.stage.dir_name(),
"4_merge_failure",
"CRDT stage should be 4_merge_failure"
);
}
// ── ProjectionError Display ─────────────────────────────────────────