use super::*;
const DOGS_TOML: &str = "\
# kelpie reads the repo it was adopted into
[kelpie]
repo = \"/srv/project\"
# what it may fetch
[kelpie.worker]
allowed_domains = [\"github.com\"]
timeout = 30
# a key spelled with a dot in it, quoted in the file
[kelpie.\"api.token\"]
\"auth.key\" = 42
";
#[test]
fn shep_get_reads_a_sheeps_settings_and_a_dogs_own_section() {
let dir = tempfile::tempdir().unwrap();
let home = dir.path();
let script = write_test_script(&dir);
let flockfile = write_flockfile(
&dir,
&format!(
"[[app]]\nname = \"api\"\nscript = '{}'\nmax_memory = \"1G\"\n\n\
[app.dogs.kelpie.git]\ncheckout = \"/srv/api\"\nmerging = \"ff\"\n\n\
[app.dogs.kelpie.options]\n\n\
[app.dogs.kelpie.\"api.token\"]\n\"auth.key\" = 42\n",
script.display()
),
);
std::fs::write(home.join("dogs.toml"), DOGS_TOML).unwrap();
let mut guard = DaemonGuard::default();
let boot = shep(home).arg("start").arg(&flockfile).output().unwrap();
guard.adopt_home(home);
assert_success(&boot);
poll_flock(home, |info| info["status"] == "online");
let whole = shep(home).arg("get").arg("api").output().unwrap();
assert_success(&whole);
let text = String::from_utf8_lossy(&whole.stdout);
assert!(text.contains("max_memory = \"1G\""), "{text}");
assert!(text.contains("[dogs.kelpie.git]"), "{text}");
assert!(text.contains("checkout = \"/srv/api\""), "{text}");
let field = shep(home)
.arg("get")
.arg("api.max_memory")
.output()
.unwrap();
assert_success(&field);
assert_eq!(
String::from_utf8_lossy(&field.stdout),
"max_memory = \"1G\"\n"
);
let git = shep(home)
.arg("get")
.arg("api.dogs.kelpie.git")
.output()
.unwrap();
assert_success(&git);
assert_eq!(
String::from_utf8_lossy(&git.stdout),
"[dogs.kelpie.git]\ncheckout = \"/srv/api\"\nmerging = \"ff\"\n"
);
let dog = shep(home).arg("get").arg("kelpie").output().unwrap();
assert_success(&dog);
let text = String::from_utf8_lossy(&dog.stdout);
assert!(text.starts_with("[kelpie]\n"), "{text}");
assert!(text.contains("# what it may fetch"), "{text}");
let worker = shep(home).arg("get").arg("kelpie.worker").output().unwrap();
assert_success(&worker);
assert_eq!(
String::from_utf8_lossy(&worker.stdout),
"[kelpie.worker]\nallowed_domains = [\"github.com\"]\ntimeout = 30\n"
);
let missing = shep(home).arg("get").arg("nosuch.key").output().unwrap();
assert_eq!(missing.status.code(), Some(3), "NotFound; {missing:?}");
let stderr = String::from_utf8_lossy(&missing.stderr);
assert!(stderr.contains("shep kv get"), "{stderr}");
let silent = shep(home).arg("get").arg("bark.interval").output().unwrap();
assert_eq!(silent.status.code(), Some(3), "NotFound; {silent:?}");
let stderr = String::from_utf8_lossy(&silent.stderr);
assert!(
stderr.contains("`bark` is a dog with nothing set"),
"{stderr}"
);
assert!(stderr.contains("default"), "{stderr}");
assert!(stderr.contains("shep enable bark`"), "{stderr}");
assert!(!stderr.contains("shep enable bark.interval`"), "{stderr}");
let leaf = shep(home)
.arg("get")
.arg("kelpie.worker.timeout")
.output()
.unwrap();
assert_success(&leaf);
assert_eq!(
String::from_utf8_lossy(&leaf.stdout),
"[kelpie.worker]\ntimeout = 30\n"
);
let quoted = shep(home)
.arg("get")
.arg("kelpie.api.token.auth.key")
.output()
.unwrap();
assert_success("ed);
assert_eq!(
String::from_utf8_lossy("ed.stdout),
"[kelpie.\"api.token\"]\n\"auth.key\" = 42\n"
);
let empty = shep(home)
.arg("get")
.arg("api.dogs.kelpie.options")
.output()
.unwrap();
assert_success(&empty);
assert_eq!(
String::from_utf8_lossy(&empty.stdout),
"[dogs.kelpie.options]\n"
);
let whole_text = String::from_utf8_lossy(&whole.stdout);
assert!(whole_text.contains("[dogs.kelpie.options]"), "{whole_text}");
let deep = shep(home)
.arg("get")
.arg("api.dogs.kelpie.api.token.auth.key")
.output()
.unwrap();
assert_success(&deep);
assert_eq!(
String::from_utf8_lossy(&deep.stdout),
"[dogs.kelpie.\"api.token\"]\n\"auth.key\" = 42\n"
);
let absent = shep(home)
.arg("get")
.arg("api.dogs.kelpie.git.remote")
.output()
.unwrap();
assert_eq!(absent.status.code(), Some(3), "NotFound; {absent:?}");
let env = shep(home).arg("get").arg("api.env").output().unwrap();
assert_eq!(env.status.code(), Some(4), "InvalidConfig; {env:?}");
let stderr = String::from_utf8_lossy(&env.stderr);
assert!(stderr.contains("shep import env"), "{stderr}");
assert!(stderr.contains("shep describe api"), "{stderr}");
let json = shep(home)
.arg("--format")
.arg("json")
.arg("get")
.arg("kelpie.worker")
.output()
.unwrap();
assert_success(&json);
let envelope: serde_json::Value = serde_json::from_slice(&json.stdout).unwrap();
assert_eq!(envelope["command"], "get");
assert_eq!(envelope["data"]["kind"], "dog");
assert_eq!(envelope["data"]["name"], "kelpie");
assert_eq!(envelope["data"]["path"], "worker");
assert_eq!(
envelope["data"]["toml"],
"[kelpie.worker]\nallowed_domains = [\"github.com\"]\ntimeout = 30\n"
);
let bare = shep(home).arg("get").output().unwrap();
assert_eq!(bare.status.code(), Some(2), "Usage; {bare:?}");
graceful_kill(home);
}