use super::*;
#[test]
fn recovery_re_targets_the_recorded_task_queue_not_default() -> TestResult {
let history = scheduled_started_on(0, "work", "claude", None);
assert_eq!(scheduled_task_queue(&history, 0).as_deref(), Some("claude"));
let work = spec("work");
let members = [(0u64, &work)];
let items = fan_out_items_recovered(&members, "remote", &history, "recovery")
.map_err(|reason| -> Box<dyn std::error::Error> { reason.into() })?;
assert_eq!(items.len(), 1);
assert_eq!(
items[0].namespace, "remote",
"recovery keeps the workflow namespace"
);
assert_eq!(
items[0].task_queue, "claude",
"recovery must re-target the RECORDED task queue, never the default"
);
Ok(())
}
#[test]
fn recovery_from_pre_field_history_defaults_task_queue() -> TestResult {
let current = &scheduled_started_on(0, "work", "ignored-when-stripped", None)[0];
let mut value = serde_json::to_value(current)?;
let data = value
.get_mut("data")
.and_then(serde_json::Value::as_object_mut)
.ok_or("ActivityScheduled must serialize to a tagged object with a `data` map")?;
assert!(data.remove("task_queue").is_some());
let old_event: Event = serde_json::from_value(value)?;
let history = vec![old_event];
let work = spec("work");
let members = [(0u64, &work)];
let items = fan_out_items_recovered(&members, "remote", &history, "recovery")
.map_err(|reason| -> Box<dyn std::error::Error> { reason.into() })?;
assert_eq!(
items[0].task_queue, "default",
"an old history with no recorded task_queue must recover as the named default"
);
Ok(())
}
#[test]
fn recovery_re_targets_the_recorded_node_not_none() -> TestResult {
let history = scheduled_started_on(0, "work", "claude", Some("box-7"));
assert_eq!(scheduled_node(&history, 0).as_deref(), Some("box-7"));
let work = spec("work");
let members = [(0u64, &work)];
let items = fan_out_items_recovered(&members, "remote", &history, "recovery")
.map_err(|reason| -> Box<dyn std::error::Error> { reason.into() })?;
assert_eq!(items.len(), 1);
assert_eq!(
items[0].node.as_deref(),
Some("box-7"),
"recovery must re-target the RECORDED node, never silently drop affinity"
);
Ok(())
}
#[test]
fn recovery_from_pre_field_history_has_no_node() -> TestResult {
let current = &scheduled_started_on(0, "work", "claude", Some("ignored-when-stripped"))[0];
let mut value = serde_json::to_value(current)?;
let data = value
.get_mut("data")
.and_then(serde_json::Value::as_object_mut)
.ok_or("ActivityScheduled must serialize to a tagged object with a `data` map")?;
assert!(data.remove("node").is_some());
let old_event: Event = serde_json::from_value(value)?;
let history = vec![old_event];
assert_eq!(scheduled_node(&history, 0), None);
let work = spec("work");
let members = [(0u64, &work)];
let items = fan_out_items_recovered(&members, "remote", &history, "recovery")
.map_err(|reason| -> Box<dyn std::error::Error> { reason.into() })?;
assert_eq!(
items[0].node, None,
"an old history with no recorded node must recover as no affinity (None)"
);
Ok(())
}