use super::*;
use crate::cli_outbound::Cli;
use crate::test_support::spawn_guard;
use crate::xdg::Os;
use std::fs;
use std::os::unix::fs::PermissionsExt;
use tempfile::tempdir;
fn ambient() -> Env {
Env::from_pairs([
("HOME", "/h"),
("XDG_DATA_HOME", "/d"),
("XDG_CACHE_HOME", "/c"),
("LERNIE_HOME", "/ambient/lernie"),
("XDG_STATE_HOME", "/ambient/state"),
("BRAZEN_CONFIG", "/ambient/brazen.toml"),
("USER", "alice"),
])
}
type Case = (fn(&Env) -> PathBuf, &'static str);
#[test]
fn overrides_win_and_every_substrate_fold_nests() {
let world = compose(&ambient());
let cases: &[Case] = &[
(Env::lernie_config_root, "/d/yog/world/lernie"),
(Env::lernie_data_root, "/d/yog/world/lernie"),
(Env::balls_state_root, "/d/yog/world/state/balls"),
(Env::balls_clones_dir, "/d/yog/world/state/balls/clones"),
(Env::yog_state_root, "/d/yog/world/state/yog"),
(Env::yog_stage_root, "/d/yog/world/state/yog/stage"),
];
for &(fold, expect) in cases {
assert_eq!(fold(&world), PathBuf::from(expect));
}
assert_eq!(
world.yog_state_root().join("ui.json"),
PathBuf::from("/d/yog/world/state/yog/ui.json")
);
assert_eq!(
world.yog_state_root().join("ops.jsonl"),
PathBuf::from("/d/yog/world/state/yog/ops.jsonl")
);
}
#[test]
fn shared_folds_and_anchor_stay_ambient_under_the_world() {
let amb = ambient();
let world = compose(&amb);
assert_eq!(world.brazen_config_path(), amb.brazen_config_path());
assert_eq!(
world.brazen_config_path(),
PathBuf::from("/ambient/brazen.toml")
);
for os in [Os::Linux, Os::MacOs] {
assert_eq!(
world.brazen_credentials_dir(os),
amb.brazen_credentials_dir(os)
);
assert_eq!(
world.brazen_models_cache_dir(os),
amb.brazen_models_cache_dir(os)
);
}
assert_eq!(
world.brazen_credentials_dir(Os::Linux),
PathBuf::from("/d/brazen/credentials")
);
assert_eq!(
world.brazen_models_cache_dir(Os::Linux),
PathBuf::from("/c/brazen/models")
);
assert_eq!(world.yog_data_root(), amb.yog_data_root());
assert_eq!(layout(&world).root, layout(&amb).root);
assert_eq!(world.user(), Some("alice".to_owned()));
}
#[test]
fn layout_names_the_world_subtree() {
let l = layout(&ambient());
assert_eq!(l.root, PathBuf::from("/d/yog/world"));
assert_eq!(l.lernie, PathBuf::from("/d/yog/world/lernie"));
assert_eq!(l.state, PathBuf::from("/d/yog/world/state"));
assert_eq!(l.tools, PathBuf::from("/d/yog/world/tools"));
}
#[test]
fn watched_clones_dir_equals_the_dir_a_world_spawned_bl_writes() {
let g = spawn_guard();
let data = tempdir().unwrap();
let bin = tempdir().unwrap();
let log = bin.path().join("state");
let data_s = data.path().to_string_lossy().into_owned();
let amb = Env::from_pairs([("HOME", "/h"), ("XDG_DATA_HOME", data_s.as_str())]);
let world = compose(&amb);
let ov = overrides(&amb);
let path = bin.path().join("bl");
fs::write(
&path,
format!(
"#!/bin/sh\nprintf '%s' \"$XDG_STATE_HOME\" > '{}'\n",
log.display()
),
)
.unwrap();
let mut perms = fs::metadata(&path).unwrap().permissions();
perms.set_mode(0o755);
fs::set_permissions(&path, perms).unwrap();
let stream = Cli::new(path).with_env(ov).run(&[]).unwrap();
drop(g);
for _ in stream {}
let child_state = fs::read_to_string(&log).unwrap();
assert_eq!(Path::new(&child_state), layout(&amb).state);
let spawned_clones = Path::new(&child_state).join("balls").join("clones");
assert_eq!(spawned_clones, world.balls_clones_dir());
}