notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 10b62a073b6acd5133d815e14987293f2b8f6a47
parent ac212b96a6b61db23d4b40cdf77126560d313997
Author: kernelkind <kernelkind@gmail.com>
Date:   Thu,  4 Sep 2025 15:41:33 -0400

test: NoteUnits repost test

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck_columns/src/timeline/note_units.rs | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 89 insertions(+), 2 deletions(-)

diff --git a/crates/notedeck_columns/src/timeline/note_units.rs b/crates/notedeck_columns/src/timeline/note_units.rs @@ -325,9 +325,9 @@ mod tests { use crate::timeline::{ unit::{ CompositeFragment, CompositeUnit, NoteUnit, NoteUnitFragment, Reaction, - ReactionFragment, ReactionUnit, + ReactionFragment, ReactionUnit, RepostFragment, }, - NoteUnits, + NoteUnits, RepostUnit, }; #[derive(Default)] @@ -365,6 +365,25 @@ mod tests { })) } + fn build_repost_frag(&mut self, reposting: NoteRef) -> NoteUnitFragment { + NoteUnitFragment::Composite(CompositeFragment::Repost(RepostFragment { + reposted_noteref: reposting, + repost_noteref: self.new_noteref(), + reposter: self.random_sender(), + })) + } + + fn insert_repost(&mut self, reposting: NoteRef) -> String { + let repost = self.build_repost_frag(reposting); + + let id = Uuid::new_v4().to_string(); + self.frags.insert(id.clone(), repost.clone()); + + self.units.merge_fragments(vec![repost]); + + id + } + fn insert_reac_frag(&mut self, reacted_to: NoteRef) -> String { let frag = self.build_reac_frag(reacted_to); let id = Uuid::new_v4().to_string(); @@ -442,6 +461,36 @@ mod tests { })) } + fn expected_reposts(&mut self, ids: Vec<&String>) -> NoteUnit { + let mut reposts = BTreeMap::new(); + let mut reposted_id = None; + let mut senders = HashSet::new(); + for id in ids { + let NoteUnitFragment::Composite(CompositeFragment::Repost(repost)) = + self.frags.get(id).unwrap() + else { + panic!("got something other than repost"); + }; + + if let Some(prev_reposted_id) = reposted_id { + if prev_reposted_id != repost.reposted_noteref { + panic!("internal error"); + } + } + + reposted_id = Some(repost.reposted_noteref); + + reposts.insert(repost.repost_noteref, repost.reposter); + senders.insert(repost.reposter); + } + + NoteUnit::Composite(CompositeUnit::Repost(RepostUnit { + note_reposted: reposted_id.unwrap(), + reposts, + senders, + })) + } + fn expected_single(&mut self, id: &String) -> NoteUnit { let Some(NoteUnitFragment::Single(note_ref)) = self.frags.get(id) else { panic!("fail"); @@ -460,6 +509,7 @@ mod tests { match expect { Expect::Single(id) => self.expected_single(id), Expect::Reaction(items) => self.expected_reactions(items), + Expect::Repost(items) => self.expected_reposts(items), } ); } @@ -468,6 +518,7 @@ mod tests { enum Expect<'a> { Single(&'a String), Reaction(Vec<&'a String>), + Repost(Vec<&'a String>), } #[test] @@ -578,4 +629,40 @@ mod tests { builder.aeq(1, Expect::Reaction(vec![&reac0, &reac1, &reac2])); builder.aeq(2, Expect::Single(&single1)); } + + #[test] + fn test_repost() { + let mut builder = UnitBuilder::default(); + let repost_note = builder.new_noteref(); + + let single1 = builder.insert_note(); + builder.aeq(0, Expect::Single(&single1)); + + let repost1 = builder.insert_repost(repost_note); + builder.aeq(0, Expect::Repost(vec![&repost1])); + builder.aeq(1, Expect::Single(&single1)); + + let single2 = builder.insert_note(); + builder.aeq(0, Expect::Single(&single2)); + builder.aeq(1, Expect::Repost(vec![&repost1])); + builder.aeq(2, Expect::Single(&single1)); + + let reac1 = builder.insert_reac_frag(repost_note); + builder.aeq(0, Expect::Reaction(vec![&reac1])); + builder.aeq(1, Expect::Single(&single2)); + builder.aeq(2, Expect::Repost(vec![&repost1])); + builder.aeq(3, Expect::Single(&single1)); + + let repost2 = builder.insert_repost(repost_note); + builder.aeq(0, Expect::Repost(vec![&repost1, &repost2])); + builder.aeq(1, Expect::Reaction(vec![&reac1])); + builder.aeq(2, Expect::Single(&single2)); + builder.aeq(3, Expect::Single(&single1)); + + let reac2 = builder.insert_reac_frag(repost_note); + builder.aeq(0, Expect::Reaction(vec![&reac1, &reac2])); + builder.aeq(1, Expect::Repost(vec![&repost1, &repost2])); + builder.aeq(2, Expect::Single(&single2)); + builder.aeq(3, Expect::Single(&single1)); + } }