55use std:: sync:: LazyLock ;
66
77use catalyst_signed_doc:: {
8- doc_types:: deprecated, providers:: tests:: TestCatalystSignedDocumentProvider , * ,
8+ doc_types:: deprecated,
9+ providers:: tests:: { TestCatalystSignedDocumentProvider , TestVerifyingKeyProvider } ,
10+ * ,
911} ;
12+ use catalyst_types:: catalyst_id:: role_index:: RoleId ;
13+ use ed25519_dalek:: ed25519:: signature:: Signer ;
14+
15+ use crate :: common:: create_dummy_key_pair;
16+
17+ mod common;
1018
1119#[ allow( clippy:: unwrap_used) ]
1220static DUMMY_PROPOSAL_DOC : LazyLock < CatalystSignedDocument > = LazyLock :: new ( || {
@@ -107,6 +115,10 @@ static COMMENT_REF_DOC: LazyLock<CatalystSignedDocument> = LazyLock::new(|| {
107115// The rule requires that the `ref` field in `ref_doc` must match the `ref` field in `doc`
108116#[ tokio:: test]
109117async fn test_valid_comment_doc ( ) {
118+ let ( sk, pk, kid) = create_dummy_key_pair ( RoleId :: Role0 ) . unwrap ( ) ;
119+ let mut key_provider = TestVerifyingKeyProvider :: default ( ) ;
120+ key_provider. add_pk ( kid. clone ( ) , pk) ;
121+
110122 // Create a main comment doc, contain all fields mention in the document (except
111123 // revocations and section)
112124 let doc = Builder :: new ( )
@@ -136,6 +148,8 @@ async fn test_valid_comment_doc() {
136148 . unwrap ( )
137149 . with_json_content ( & serde_json:: json!( { } ) )
138150 . unwrap ( )
151+ . add_signature ( |m| sk. sign ( & m) . to_vec ( ) , kid)
152+ . unwrap ( )
139153 . build ( )
140154 . unwrap ( ) ;
141155
@@ -147,6 +161,59 @@ async fn test_valid_comment_doc() {
147161
148162 let is_valid = validator:: validate ( & doc, & provider) . await . unwrap ( ) ;
149163 assert ! ( is_valid, "{:?}" , doc. problem_report( ) ) ;
164+
165+ let is_valid = validator:: validate_signatures ( & doc, & key_provider)
166+ . await
167+ . unwrap ( ) ;
168+ assert ! ( is_valid) ;
169+ }
170+
171+ #[ tokio:: test]
172+ async fn test_invalid_comment_doc_wrong_role ( ) {
173+ let ( sk, _pk, kid) = create_dummy_key_pair ( RoleId :: Proposer ) . unwrap ( ) ;
174+
175+ // Create a main comment doc, contain all fields mention in the document (except
176+ // revocations and section)
177+ let doc = Builder :: new ( )
178+ . with_json_metadata ( serde_json:: json!( {
179+ "content-type" : ContentType :: Json . to_string( ) ,
180+ "content-encoding" : ContentEncoding :: Brotli . to_string( ) ,
181+ "type" : doc_types:: PROPOSAL_COMMENT . clone( ) ,
182+ "id" : UuidV7 :: new( ) ,
183+ "ver" : UuidV7 :: new( ) ,
184+ "ref" : {
185+ "id" : DUMMY_PROPOSAL_DOC . doc_id( ) . unwrap( ) ,
186+ "ver" : DUMMY_PROPOSAL_DOC . doc_ver( ) . unwrap( ) ,
187+ } ,
188+ "template" : {
189+ "id" : COMMENT_TEMPLATE_DOC . doc_id( ) . unwrap( ) ,
190+ "ver" : COMMENT_TEMPLATE_DOC . doc_ver( ) . unwrap( ) ,
191+ } ,
192+ "reply" : {
193+ "id" : COMMENT_REF_DOC . doc_id( ) . unwrap( ) ,
194+ "ver" : COMMENT_REF_DOC . doc_ver( ) . unwrap( )
195+ } ,
196+ "parameters" : {
197+ "id" : DUMMY_BRAND_DOC . doc_id( ) . unwrap( ) ,
198+ "ver" : DUMMY_BRAND_DOC . doc_ver( ) . unwrap( ) ,
199+ }
200+ } ) )
201+ . unwrap ( )
202+ . with_json_content ( & serde_json:: json!( { } ) )
203+ . unwrap ( )
204+ . add_signature ( |m| sk. sign ( & m) . to_vec ( ) , kid)
205+ . unwrap ( )
206+ . build ( )
207+ . unwrap ( ) ;
208+
209+ let mut provider = TestCatalystSignedDocumentProvider :: default ( ) ;
210+ provider. add_document ( None , & DUMMY_BRAND_DOC ) . unwrap ( ) ;
211+ provider. add_document ( None , & DUMMY_PROPOSAL_DOC ) . unwrap ( ) ;
212+ provider. add_document ( None , & COMMENT_REF_DOC ) . unwrap ( ) ;
213+ provider. add_document ( None , & COMMENT_TEMPLATE_DOC ) . unwrap ( ) ;
214+
215+ let is_valid = validator:: validate ( & doc, & provider) . await . unwrap ( ) ;
216+ assert ! ( !is_valid, "{:?}" , doc. problem_report( ) ) ;
150217}
151218
152219// The same as above but test with the old type
0 commit comments