use super::*;
use tempfile::TempDir;
fn client(name: &str) -> Client {
Client::parse(name).expect("a usable identity")
}
#[test]
fn an_identity_that_is_not_a_plain_component_is_refused() {
for name in ["", ".", "..", "a/b", "..\\..\\etc", "nul\0byte"] {
let refusal = Client::parse(name).expect_err("refused");
assert!(refusal.contains("client identity"), "{refusal}");
}
assert_eq!(client("yog-client").name(), "yog-client");
}
#[test]
fn the_reserved_local_identity_is_not_parseable() {
assert!(Client::parse(LOCAL).is_err());
assert!(Client::local().is_local());
assert_eq!(Client::local().name(), LOCAL);
assert!(!client("yog-client").is_local());
}
#[test]
fn the_layout_is_the_client_directory_and_its_registrations() {
let root = std::path::Path::new("/home/u/state/yog");
let c = client("phone");
assert_eq!(dir(root, &c), root.join(CLIENTS).join("phone"));
assert_eq!(registrations(root, &c), dir(root, &c).join(WORKSPACES));
}
#[test]
fn a_client_with_no_directory_is_registered_nowhere() {
let tmp = TempDir::new().expect("tmp");
assert!(registered(tmp.path(), &client("phone")).is_empty());
assert!(registered(tmp.path(), &Client::local()).is_empty());
}
#[test]
fn registering_seats_a_client_and_deleting_the_file_revokes_it() {
let tmp = TempDir::new().expect("tmp");
let c = client("phone");
register(tmp.path(), &c, "home").expect("seated");
register(tmp.path(), &c, "corp").expect("seated");
register(tmp.path(), &c, "home").expect("seated");
assert_eq!(
registered(tmp.path(), &c),
BTreeSet::from(["home".to_owned(), "corp".to_owned()])
);
assert_eq!(
std::fs::read(registrations(tmp.path(), &c).join("home")).expect("read"),
Vec::<u8>::new()
);
std::fs::remove_file(registrations(tmp.path(), &c).join("corp")).expect("revoked");
assert_eq!(
registered(tmp.path(), &c),
BTreeSet::from(["home".to_owned()])
);
assert!(registered(tmp.path(), &client("laptop")).is_empty());
}
#[test]
fn a_workspace_name_that_is_not_a_plain_component_is_refused() {
let tmp = TempDir::new().expect("tmp");
let refused = register(tmp.path(), &client("phone"), "../elsewhere").expect_err("refused");
assert!(refused.to_string().contains("workspace name"), "{refused}");
}
#[test]
fn an_unmakeable_registration_directory_refuses() {
let tmp = TempDir::new().expect("tmp");
std::fs::write(tmp.path().join(CLIENTS), b"not a directory").expect("write");
assert!(register(tmp.path(), &client("phone"), "home").is_err());
assert!(registered(tmp.path(), &client("phone")).is_empty());
}