use crate::channels::telegram::flow::progress_key;
#[test]
fn every_nudge_attempt_shares_one_key() {
let keys: Vec<_> = (1..=5)
.map(|n| {
progress_key(&format!(
"🔧 Model reasoned without answering — nudge {n}/5"
))
})
.collect();
assert!(keys.iter().all(|k| *k == Some("empty-answer-nudge")));
}
#[test]
fn every_fallback_attempt_shares_one_key() {
for p in ["zhipu/glm-4.5", "claude-cli/opus-5", "minimax/MiniMax-M3"] {
assert_eq!(
progress_key(&format!(
"🔧 Trying fallback '{p}' for empty-reasoning recovery..."
)),
Some("fallback-attempt")
);
}
}
#[test]
fn nudges_and_fallbacks_do_not_collapse_into_each_other() {
assert_ne!(
progress_key("🔧 Model reasoned without answering — nudge 5/5"),
progress_key("🔧 Trying fallback 'zhipu/glm-4.5' for empty-reasoning recovery...")
);
}
#[test]
fn ordinary_narration_always_appends() {
for text in [
"Let me check the schema before answering.",
"Done. The table is in Volume 2.",
"",
"🔧 Now using zhipu/glm-4.5",
] {
assert_eq!(progress_key(text), None, "must not supersede: {text:?}");
}
}
#[test]
fn the_leading_emoji_is_not_required() {
assert_eq!(
progress_key("Model reasoned without answering — nudge 2/5"),
Some("empty-answer-nudge")
);
}
#[test]
fn provider_retries_also_supersede() {
assert_eq!(
progress_key("⏳ Retry 2/5 — connection reset"),
Some("provider-retry")
);
}