@@ -110,6 +110,7 @@ mod tests {
110110 use std:: sync:: Arc ;
111111
112112 use super :: * ;
113+ use crate :: Credential ;
113114
114115 #[ apply( all_cred_cipher) ]
115116 async fn can_add_members_to_conversation ( case : TestContext ) {
@@ -158,6 +159,50 @@ mod tests {
158159 . await
159160 }
160161
162+ #[ apply( all_cred_cipher) ]
163+ async fn should_fail_on_duplicate_signatures ( case : TestContext ) {
164+ let [ alice, bob, carol] = case. sessions ( ) . await ;
165+ Box :: pin ( async move {
166+ let conversation = case. create_conversation ( [ & alice] ) . await ;
167+ let id = conversation. id . clone ( ) ;
168+ let bob_keypackage = bob. new_keypackage ( & case) . await ;
169+ let signature_key_pair = bob
170+ . find_any_credential ( case. ciphersuite ( ) , case. credential_type )
171+ . await
172+ . signature_key_pair
173+ . clone ( ) ;
174+ let credential = Credential {
175+ ciphersuite : case. ciphersuite ( ) ,
176+ credential_type : CredentialType :: Basic ,
177+ mls_credential : openmls:: credentials:: Credential :: new_basic (
178+ carol. get_client_id ( ) . await . into_inner ( ) ,
179+ ) ,
180+ signature_key_pair,
181+ earliest_validity : 0 ,
182+ } ;
183+ let cred_ref = carol. add_credential ( credential) . await . unwrap ( ) ;
184+ let carol_key_package = carol. new_keypackage_from_ref ( cred_ref, None ) . await ;
185+ let _affected_clients = [ ( carol. get_client_id ( ) . await , bob. get_client_id ( ) . await ) ] ;
186+
187+ let error = alice
188+ . transaction
189+ . conversation ( & id)
190+ . await
191+ . unwrap ( )
192+ . add_members ( vec ! [ bob_keypackage. clone( ) . into( ) , carol_key_package. clone( ) . into( ) ] )
193+ . await
194+ . unwrap_err ( ) ;
195+
196+ assert ! ( matches!(
197+ error,
198+ Error :: DuplicateSignature {
199+ affected_clients: _affected_clients
200+ }
201+ ) ) ;
202+ } )
203+ . await
204+ }
205+
161206 #[ apply( all_cred_cipher) ]
162207 async fn should_return_valid_welcome ( case : TestContext ) {
163208 let [ alice, bob] = case. sessions ( ) . await ;
0 commit comments