notedeck

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

commit 5c9eb492b65466e77fddba5ed1dbee1520954a12
parent 0b584a773f2a67cf330fe8cbfcdbcc12cdfb4bf7
Author: kernelkind <kernelkind@gmail.com>
Date:   Mon, 25 Aug 2025 17:04:23 -0400

introduce failing test for reaction duplication bug

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

Diffstat:
Mcrates/notedeck_columns/src/timeline/note_units.rs | 47++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 44 insertions(+), 3 deletions(-)

diff --git a/crates/notedeck_columns/src/timeline/note_units.rs b/crates/notedeck_columns/src/timeline/note_units.rs @@ -322,8 +322,8 @@ mod tests { Pubkey::new(out) } - fn fragment(&mut self, reacted_to: NoteRef) -> String { - let frag = NoteUnitFragment::Composite(CompositeFragment::Reaction(ReactionFragment { + fn build_fragment(&mut self, reacted_to: NoteRef) -> NoteUnitFragment { + NoteUnitFragment::Composite(CompositeFragment::Reaction(ReactionFragment { noteref_reacted_to: reacted_to, reaction_note_ref: NoteRef { key: NoteKey::new(self.counter()), @@ -333,7 +333,11 @@ mod tests { reaction: "+".to_owned(), sender: self.random_sender(), }, - })); + })) + } + + fn fragment(&mut self, reacted_to: NoteRef) -> String { + let frag = self.build_fragment(reacted_to); let id = Uuid::new_v4().to_string(); self.frags.insert(id.clone(), frag.clone()); @@ -342,6 +346,21 @@ mod tests { id } + fn fragments_pair(&mut self, reacted_to: NoteRef) -> (String, String) { + let frag1 = self.build_fragment(reacted_to); + let frag2 = self.build_fragment(reacted_to); + + self.units + .merge_fragments(vec![frag1.clone(), frag2.clone()]); + + let id1 = Uuid::new_v4().to_string(); + self.frags.insert(id1.clone(), frag1); + let id2 = Uuid::new_v4().to_string(); + self.frags.insert(id2.clone(), frag2); + + (id1, id2) + } + fn generate_reaction_note(&mut self) -> NoteRef { NoteRef { key: NoteKey::new(self.counter()), @@ -508,4 +527,26 @@ mod tests { builder.aeq(3, Expect::Single(&single1)); builder.aeq(4, Expect::Single(&single0)); } + + #[test] + fn test3() { + let mut builder = UnitBuilder::default(); + let reaction_note1 = builder.generate_reaction_note(); + + let single1 = builder.insert_note(); + builder.aeq(0, Expect::Single(&single1)); + + let reac0 = builder.fragment(reaction_note1); + builder.aeq(0, Expect::Reaction(vec![&reac0])); + builder.aeq(1, Expect::Single(&single1)); + + let (reac1, reac2) = builder.fragments_pair(reaction_note1); + builder.aeq(0, Expect::Reaction(vec![&reac0, &reac1, &reac2])); + builder.aeq(1, Expect::Single(&single1)); + + let single2 = builder.insert_note(); + builder.aeq(0, Expect::Single(&single2)); + builder.aeq(1, Expect::Reaction(vec![&reac0, &reac1, &reac2])); + builder.aeq(2, Expect::Single(&single1)); + } }