use super::{FileRow, KIND, Listing, Preview, files};
use crate::reply::{Read, Reply, read};
use serde_json::json;
fn walked() -> serde_json::Value {
json!({
"kind": KIND, "ok": true, "worktree": true,
"rows": [{"path": "src/a.rs", "size": 12, "dir": false}],
"truncated": true,
"preview": {"kind": "text", "text": "body"},
"working_dir": "/home/u/proj",
})
}
#[test]
fn a_walked_worktree_reads_whole() {
let Read::Answer(Reply::Files(answer)) = read(&walked()) else {
panic!("a files frame is an answer: {:?}", read(&walked()));
};
assert_eq!(
answer.listing,
Some(Listing {
rows: vec![FileRow {
path: "src/a.rs".to_owned(),
size: 12,
dir: false
}],
truncated: true,
})
);
assert_eq!(answer.preview, Some(Preview::Text("body".to_owned())));
assert_eq!(answer.working_dir, Some("/home/u/proj".to_owned()));
}
#[test]
fn an_absent_worktree_is_no_listing_rather_than_an_empty_one() {
let torn = json!({"kind": KIND, "ok": true, "worktree": false,
"preview": {"kind": "binary", "size": 4}});
let Read::Answer(Reply::Files(answer)) = read(&torn) else {
panic!("an absent worktree is still an answer");
};
assert_eq!(answer.listing, None);
assert_eq!(answer.preview, Some(Preview::Binary { size: 4 }));
assert_eq!(answer.working_dir, None);
}
#[test]
fn every_required_field_refuses_and_says_which_one() {
for field in ["worktree", "truncated", "rows"] {
let mut frame = walked();
frame[field] = json!(7);
let Read::Unreadable(said) = read(&frame) else {
panic!("a broken {field} refuses");
};
assert!(said.contains(field), "{said}");
}
for (row, names) in [
(json!(7), "not an object"),
(json!({"path": "p", "size": 1}), "dir"),
(json!({"path": "p", "dir": true}), "size"),
(json!({"size": 1, "dir": true}), "path"),
] {
let mut frame = walked();
frame["rows"] = json!([row]);
let Read::Unreadable(said) = read(&frame) else {
panic!("a broken row refuses: {names}");
};
assert!(said.contains(names), "{said}");
}
}
#[test]
fn the_preview_reads_all_four_arms() {
let mut frame = walked();
frame["preview"] = json!({"kind": "truncated", "text": "head", "size": 999});
let Read::Answer(Reply::Files(answer)) = read(&frame) else {
panic!("a truncated preview reads");
};
assert_eq!(
answer.preview,
Some(Preview::Truncated {
text: "head".to_owned(),
size: 999
})
);
frame["preview"] = json!({"kind": "hologram"});
let Read::Answer(Reply::Files(answer)) = read(&frame) else {
panic!("an unknown preview class is rung 3, not a refusal");
};
assert_eq!(
answer.preview,
Some(Preview::Unknown("hologram".to_owned()))
);
frame["preview"] = json!(7);
let Read::Unreadable(said) = read(&frame) else {
panic!("a preview that is not an object refuses");
};
assert!(said.contains("not an object"), "{said}");
frame["preview"] = json!({"kind": "text"});
let Read::Unreadable(said) = read(&frame) else {
panic!("a text preview with no text refuses");
};
assert!(said.contains("text"), "{said}");
}
#[test]
fn the_reader_reads_the_object_the_dispatch_hands_it() {
let obj = json!({"worktree": true, "rows": [], "truncated": false});
let answer = files(obj.as_object().expect("an object")).expect("an answer");
assert_eq!(
answer.listing,
Some(Listing {
rows: Vec::new(),
truncated: false
})
);
}