git-ents.gitmain
⌘K
foforge
unreadable.rs87 lines · 3.4 KB · rusthistorycomment on this file
1//! Coverage for [`ents_forge::comment::list_all`] and
2//! [`ents_forge::issue::list_all`]: a listing returns the refs it could
3//! not read back alongside its readable rows ([`ents_forge::Unreadable`])
4//! rather than dropping them on the floor — the fixture writes one
5//! good-shape entity and one wrong-shape ref (an empty tree no entity
6//! decoder accepts) under the same prefix and asserts both surface.
7
8#![allow(
9 clippy::expect_used,
10 clippy::indexing_slicing,
11 reason = "integration test: fixtures panic on setup failure"
12)]
13
14use ents_forge::Issue;
15use ents_forge::comment::Comment;
16use ents_model::MemberId;
17use ents_testutil::{CommitSpec, MemRefStore, ObjectStore, empty_tree, write_commit};
18
19/// A commit whose tree is empty — a shape no entity decoder reads back —
20/// landed on `refname`, standing in for a ref written by an older or
21/// unrelated schema.
22fn seed_wrong_shape_ref(refs: &MemRefStore, objects: &ObjectStore, refname: &str) {
23 let spec = CommitSpec {
24 tree: empty_tree(objects),
25 parents: vec![],
26 message: "Wrong-shape entity".into(),
27 seconds: 1_000,
28 };
29 let tip = write_commit(objects, &spec, None);
30 refs.set_str(refname, tip);
31}
32
33#[test]
34fn comment_list_all_returns_an_unreadable_ref_alongside_a_readable_row() {
35 let refs = MemRefStore::default();
36 let objects = ObjectStore::default();
37
38 let good = Comment {
39 body: "readable".to_owned(),
40 state: "open".to_owned(),
41 anchor: None,
42 context: Some("issues/42".to_owned()),
43 parent: None,
44 };
45 let name: gix::refs::FullName = "refs/meta/comments/good".try_into().expect("valid refname");
46 ents_testutil::write_meta_entity(&refs, &objects, name, &good, None, 1_000);
47 seed_wrong_shape_ref(&refs, &objects, "refs/meta/comments/legacy");
48
49 let (rows, unreadable) = ents_forge::comment::list_all(&refs, &objects).expect("listing reads");
50 assert_eq!(rows.len(), 1, "the readable comment still lists");
51 assert_eq!(rows[0].0, "good");
52 assert_eq!(unreadable.len(), 1, "the wrong-shape ref surfaces");
53 assert_eq!(unreadable[0].refname, "refs/meta/comments/legacy");
54 assert!(
55 !unreadable[0].error.is_empty(),
56 "the deserialization error text comes along for diagnosis"
57 );
58
59 // `list` stays the readable-rows-only view of the same walk: the
60 // wrong-shape ref is absent, and nothing errors.
61 let listed = ents_forge::comment::list(&refs, &objects).expect("listing reads");
62 assert_eq!(listed.len(), 1);
63 assert_eq!(listed[0].0, "good");
64}
65
66#[test]
67fn issue_list_all_returns_an_unreadable_ref_alongside_a_readable_row() {
68 let refs = MemRefStore::default();
69 let objects = ObjectStore::default();
70
71 let good = Issue {
72 title: "readable".to_owned(),
73 body: String::new(),
74 state: "open".to_owned(),
75 assignees: vec![MemberId::new("jdc")],
76 labels: vec![],
77 };
78 let name: gix::refs::FullName = "refs/meta/issues/good".try_into().expect("valid refname");
79 ents_testutil::write_meta_entity(&refs, &objects, name, &good, None, 1_000);
80 seed_wrong_shape_ref(&refs, &objects, "refs/meta/issues/legacy");
81
82 let (rows, unreadable) = ents_forge::issue::list_all(&refs, &objects).expect("listing reads");
83 assert_eq!(rows.len(), 1, "the readable issue still lists");
84 assert_eq!(rows[0].0, "good");
85 assert_eq!(unreadable.len(), 1, "the wrong-shape ref surfaces");
86 assert_eq!(unreadable[0].refname, "refs/meta/issues/legacy");
87}