mod support;
use support::{FakeAgent, World, revert_trigger_rename, wait_until};
fn status(world: &World) -> serde_json::Value {
let output = world.sloop(&["status"]);
assert!(output.status.success());
World::json_stdout(&output)["data"].clone()
}
fn post_manual(world: &World, name: &str) -> String {
let ticket = world.write_ticket(name, "# Work\n");
let output = world.sloop(&["post", ticket.to_str().unwrap(), "--manual"]);
assert!(
output.status.success(),
"post failed: {}",
String::from_utf8_lossy(&output.stderr)
);
World::json_stdout(&output)["data"]["ticket"]["id"]
.as_str()
.expect("ticket id")
.to_owned()
}
fn plant_activation_shape(world: &World) {
revert_trigger_rename(world);
let connection = rusqlite::Connection::open(world.db_path()).expect("open state database");
connection
.pragma_update(None, "user_version", 15)
.expect("put the schema version back");
}
#[test]
fn queued_work_planted_before_the_rename_still_dispatches_after_it() {
let world = World::configured();
world.configure_fake_agent(FakeAgent::new().commit("work").exit(0));
world.commit_all("initial");
let daemon_pid = world.start_daemon()["data"]["pid"].as_u64().unwrap() as u32;
let ticket = post_manual(&world, "pending-work.md");
assert!(world.sloop(&["pause"]).status.success());
assert!(world.sloop(&["run", &ticket]).status.success());
let queued = status(&world)["queued_triggers"].clone();
assert_eq!(queued.as_array().unwrap().len(), 1);
assert_eq!(queued[0]["ticket"], ticket.as_str());
let id_before = queued[0]["id"].as_str().unwrap().to_owned();
assert!(id_before.starts_with("TR"), "{id_before}");
world.kill_daemon(daemon_pid);
plant_activation_shape(&world);
world.start_daemon();
let queued = status(&world)["queued_triggers"].clone();
assert_eq!(queued.as_array().unwrap().len(), 1);
assert_eq!(queued[0]["ticket"], ticket.as_str());
assert_eq!(queued[0]["id"], id_before.as_str());
assert!(world.sloop(&["resume"]).status.success());
wait_until("the migrated trigger dispatches and merges", || {
status(&world)["tickets"]["merged"] == 1
});
assert!(
status(&world)["queued_triggers"]
.as_array()
.unwrap()
.is_empty()
);
}
#[test]
fn the_dashboard_emits_the_deprecated_queued_activations_alias() {
let world = World::configured();
world.configure_fake_agent(FakeAgent::new().commit("work").exit(0));
world.commit_all("initial");
world.start_daemon();
let ticket = post_manual(&world, "aliased.md");
assert!(world.sloop(&["pause"]).status.success());
assert!(world.sloop(&["run", &ticket]).status.success());
let snapshot = status(&world);
assert_eq!(snapshot["queued_triggers"].as_array().unwrap().len(), 1);
assert_eq!(snapshot["queued_activations"], snapshot["queued_triggers"]);
let dashboard = World::json_stdout(&world.sloop(&["show"]))["data"].clone();
assert_eq!(dashboard["kind"], "dashboard");
assert_eq!(
dashboard["queued_activations"],
dashboard["queued_triggers"]
);
}