use super::*;
#[test]
fn a_landed_spawn_starts_a_drone_and_leaves_one_row() {
let root = tempdir().expect("tempdir");
let project = root.path().join("proj");
let ws = root.path().join("ws");
std::fs::create_dir_all(&project).expect("mkdir");
let mut ctx = ctx(root.path(), armed_world(&ws, &project, false, None));
let worktree = ctx
.deps
.world
.balls_state_root_for(&project)
.join("plugins/bl-delivery")
.join(project.strip_prefix("/").expect("absolute"))
.join("bl-1");
std::fs::create_dir_all(&worktree).expect("mkdir");
ctx.deps.bl = fake(
root.path(),
"bl",
&format!(
"#!/bin/sh\ncase \"$1\" in\n claim) printf '%s\\n' '{}' ;;\nesac\nexit 0\n",
worktree.display()
),
);
ctx.deps.litany = fake(
root.path(),
"litany",
&format!(
"#!/bin/sh\ncase \"$1\" in\n{}esac\nexit 0\n",
crate::test_support::authoring_new_arm()
),
);
let acted = ctx.pass();
let trail0 = std::fs::read_to_string(root.path().join("ops.jsonl")).unwrap_or_default();
assert!(acted, "a ready ball under the cap is taken: {trail0}");
let trail = std::fs::read_to_string(root.path().join("ops.jsonl")).expect("trail");
assert!(trail.contains("yog-fleet"), "{trail}");
assert!(trail.contains("spawn"), "{trail}");
assert!(trail.contains("bl-1"), "{trail}");
}
#[test]
fn a_birth_whose_fire_never_launches_gives_its_own_claim_back() {
let root = tempdir().expect("tempdir");
let project = root.path().join("proj");
let ws = root.path().join("ws");
std::fs::create_dir_all(&project).expect("mkdir");
let mut ctx = ctx(root.path(), armed_world(&ws, &project, false, None));
let worktree = ctx
.deps
.world
.balls_state_root_for(&project)
.join("plugins/bl-delivery")
.join(project.strip_prefix("/").expect("absolute"))
.join("bl-1");
std::fs::create_dir_all(&worktree).expect("mkdir");
let seen = root.path().join("bl.args");
ctx.deps.bl = fake(
root.path(),
"bl",
&format!(
"#!/bin/sh\nprintf '%s\\n' \"$*\" >>'{}'\ncase \"$1\" in\n \
claim) rm -rf '{}'; printf '%s\\n' '{}' ;;\nesac\nexit 0\n",
seen.display(),
ws.display(),
worktree.display()
),
);
ctx.deps.litany = fake(
root.path(),
"litany",
&format!(
"#!/bin/sh\ncase \"$1\" in\n{}esac\nexit 0\n",
crate::test_support::authoring_new_arm()
),
);
assert!(!ctx.pass(), "the fire never launched, so no birth landed");
let args = std::fs::read_to_string(&seen).expect("bl was called");
assert!(
args.contains("claim bl-1") && args.contains("unclaim bl-1"),
"the claim landed and was given straight back: {args}"
);
let trail = std::fs::read_to_string(root.path().join("ops.jsonl")).unwrap_or_default();
assert!(
!trail.contains("yog-fleet"),
"a birth that did not converge is not a spawn row: {trail}"
);
}
#[test]
fn a_refused_spawn_writes_no_loop_row() {
let root = tempdir().expect("tempdir");
let project = root.path().join("proj");
let ws = root.path().join("ws");
std::fs::create_dir_all(&project).expect("mkdir");
let mut ctx = ctx(root.path(), armed_world(&ws, &project, false, None));
ctx.deps.bl = fake(
root.path(),
"bl",
"#!/bin/sh\nprintf 'no\\n' 1>&2\nexit 3\n",
);
assert!(!ctx.pass());
let trail = std::fs::read_to_string(root.path().join("ops.jsonl")).unwrap_or_default();
assert!(!trail.contains("yog-fleet"), "{trail}");
}