@@ -138,6 +138,10 @@ TEST_CASE("Group Members", "[config][groups][members]") {
138138                CHECK (gmem2.get_status (m) ==
139139                      session::config::groups::member::Status::promotion_accepted);
140140            } else  {
141+                 //  on gmem1, our local extra data marks m as invite_sending
142+                 CHECK (gmem1.get_status (m) ==
143+                       session::config::groups::member::Status::invite_sending);
144+                 //  that extra data is not pushed, so gmem2 doesn't know about it
141145                CHECK (gmem2.get_status (m) ==
142146                      session::config::groups::member::Status::invite_not_sent);
143147                CHECK_FALSE (m.admin );
@@ -330,3 +334,43 @@ TEST_CASE("Group Members", "[config][groups][members]") {
330334          " 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678" 
331335          " 901234567890" 
332336}
337+ 
338+ TEST_CASE (" Group Members restores extra data" " [config][groups][members]" 
339+ 
340+     const  auto  seed = " 0123456789abcdef0123456789abcdeffedcba9876543210fedcba9876543210" 
341+     std::array<unsigned  char , 32 > ed_pk;
342+     std::array<unsigned  char , 64 > ed_sk;
343+     crypto_sign_ed25519_seed_keypair (
344+             ed_pk.data (), ed_sk.data (), reinterpret_cast <const  unsigned  char *>(seed.data ()));
345+ 
346+     REQUIRE (oxenc::to_hex (ed_pk.begin (), ed_pk.end ()) ==
347+             " cbd569f56fb13ea95a3f0c05c331cc24139c0090feb412069dc49fab34406ece" 
348+     CHECK (oxenc::to_hex (seed.begin (), seed.end ()) ==
349+           oxenc::to_hex (ed_sk.begin (), ed_sk.begin () + 32 ));
350+ 
351+     groups::Members gmem1{to_usv (ed_pk), to_usv (ed_sk), std::nullopt };
352+ 
353+     auto  memberId1 = " 050000000000000000000000000000000000000000000000000000000000000000" 
354+     auto  memberId2 = " 051111111111111111111111111111111111111111111111111111111111111111" 
355+ 
356+     auto  member1 = gmem1.get_or_construct (memberId1);
357+     auto  member2 = gmem1.get_or_construct (memberId2);
358+ 
359+     member2.set_promoted ();
360+     gmem1.set (member1);  //  should be marked as "invite sending" right away
361+     gmem1.set (member2);  //  should be marked as "promotion sending" right away
362+ 
363+     CHECK (gmem1.get_status (gmem1.get_or_construct (memberId1)) ==
364+           groups::member::Status::invite_sending);
365+     CHECK (gmem1.get_status (gmem1.get_or_construct (memberId2)) ==
366+           groups::member::Status::promotion_sending);
367+ 
368+     auto  dumped = gmem1.dump ();
369+ 
370+     groups::Members gmem2{to_usv (ed_pk), to_usv (ed_sk), dumped};
371+ 
372+     CHECK (gmem2.get_status (gmem1.get_or_construct (memberId1)) ==
373+           groups::member::Status::invite_sending);
374+     CHECK (gmem2.get_status (gmem1.get_or_construct (memberId2)) ==
375+           groups::member::Status::promotion_sending);
376+ }
0 commit comments