From 027b1c235d419760c9456440cc8e4da41b9329e7 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 15:22:53 +0400 Subject: [PATCH 01/15] wip --- .../tests/common/proposal_form_template.rs | 9 +- rust/signed_doc/tests/proposal.rs | 14 +- rust/signed_doc/tests/proposal_comment.rs | 18 +- .../tests/proposal_form_template.rs | 194 ++++++++++++++++++ .../tests/proposal_submission_action.rs | 16 +- 5 files changed, 226 insertions(+), 25 deletions(-) create mode 100644 rust/signed_doc/tests/proposal_form_template.rs diff --git a/rust/signed_doc/tests/common/proposal_form_template.rs b/rust/signed_doc/tests/common/proposal_form_template.rs index c3c477aa805..664d06ba5a8 100644 --- a/rust/signed_doc/tests/common/proposal_form_template.rs +++ b/rust/signed_doc/tests/common/proposal_form_template.rs @@ -1,9 +1,15 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + use super::*; pub fn proposal_form_template_doc( - parameters_doc: &CatalystSignedDocument + parameters_doc: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, ) -> anyhow::Result { let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ "content-type": ContentType::SchemaJson.to_string(), @@ -17,5 +23,6 @@ pub fn proposal_form_template_doc( }, }))? .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? .build() } diff --git a/rust/signed_doc/tests/proposal.rs b/rust/signed_doc/tests/proposal.rs index 70a130f500e..0907710598f 100644 --- a/rust/signed_doc/tests/proposal.rs +++ b/rust/signed_doc/tests/proposal.rs @@ -17,7 +17,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_doc(&template, ¶meters, provider) } => true @@ -27,7 +27,7 @@ mod common; #[test_case( |provider| { let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_doc(&template, ¶meters, provider) } => true @@ -37,7 +37,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_doc(&template, ¶meters, provider) } => true @@ -47,7 +47,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() @@ -77,7 +77,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() @@ -107,7 +107,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() @@ -161,7 +161,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() diff --git a/rust/signed_doc/tests/proposal_comment.rs b/rust/signed_doc/tests/proposal_comment.rs index 73e121837ad..d44460545a4 100644 --- a/rust/signed_doc/tests/proposal_comment.rs +++ b/rust/signed_doc/tests/proposal_comment.rs @@ -18,7 +18,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_doc(&proposal, &template, ¶meters, provider) @@ -30,7 +30,7 @@ mod common; #[test_case( |provider| { let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_doc(&proposal, &template, ¶meters, provider) @@ -42,7 +42,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_doc(&proposal, &template, ¶meters, provider) @@ -54,7 +54,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; let comment = proposal_comment_doc(&proposal, &template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -96,7 +96,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -133,7 +133,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -171,7 +171,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -208,7 +208,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) @@ -241,7 +241,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); diff --git a/rust/signed_doc/tests/proposal_form_template.rs b/rust/signed_doc/tests/proposal_form_template.rs new file mode 100644 index 00000000000..257b17a5efc --- /dev/null +++ b/rust/signed_doc/tests/proposal_form_template.rs @@ -0,0 +1,194 @@ +//! Integration test for proposal form template document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, + proposal_form_template_doc, +}; + +mod common; + +#[test_case( + |provider| { + let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + proposal_form_template_doc(¶meters, provider) + } + => true + ; + "valid document with brand 'parameters'" +)] +#[test_case( + |provider| { + let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + proposal_form_template_doc(¶meters, provider) + } + => true + ; + "valid document with campaign 'parameters'" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + proposal_form_template_doc(¶meters, provider) + } + => true + ; + "valid document with category 'parameters'" +)] +// #[test_case( +// |provider| { +// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, +// v).unwrap())?; let template = +// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, +// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = +// create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid. +// clone(), *pk))?; Builder::new() +// .with_json_metadata(serde_json::json!({ "content-type": +// ContentType::Json.to_string(), "content-encoding": +// ContentEncoding::Brotli.to_string(), "type": +// doc_types::PROPOSAL.clone(), "id": id, +// "ver": id, +// "template": { +// "id": template.doc_id()?, +// "ver": template.doc_ver()?, +// }, +// "parameters": { +// "id": parameters.doc_id()?, +// "ver": parameters.doc_ver()?, +// } +// }))? +// .with_json_content(&serde_json::json!({}))? +// .add_signature(|m| sk.sign(&m).to_vec(), kid)? +// .build() +// } +// => false +// ; +// "wrong role" +// )] +// #[test_case( +// |provider| { +// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, +// v).unwrap())?; let template = +// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, +// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = +// create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid. +// clone(), *pk))?; Builder::new() +// .with_json_metadata(serde_json::json!({ "content-type": +// ContentType::Json.to_string(), "content-encoding": +// ContentEncoding::Brotli.to_string(), "type": +// doc_types::PROPOSAL.clone(), "id": id, +// "ver": id, +// "template": { +// "id": template.doc_id()?, +// "ver": template.doc_ver()?, +// }, +// "parameters": { +// "id": parameters.doc_id()?, +// "ver": parameters.doc_ver()?, +// } +// }))? +// .empty_content()? +// .add_signature(|m| sk.sign(&m).to_vec(), kid)? +// .build() +// } +// => false +// ; +// "empty content" +// )] +// #[test_case( +// |provider| { +// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, +// v).unwrap())?; let template = +// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, +// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = +// create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid. +// clone(), *pk))?; Builder::new() +// .with_json_metadata(serde_json::json!({ "content-type": +// ContentType::Json.to_string(), "type": doc_types::PROPOSAL.clone(), +// "id": id, +// "ver": id, +// "template": { +// "id": template.doc_id()?, +// "ver": template.doc_ver()?, +// }, +// "parameters": { +// "id": parameters.doc_id()?, +// "ver": parameters.doc_ver()?, +// } +// }))? +// .with_json_content(&serde_json::json!({}))? +// .add_signature(|m| sk.sign(&m).to_vec(), kid)? +// .build() +// } +// => true +// ; +// "missing 'content-encoding' (optional)" +// )] +// #[test_case( +// |provider| { +// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, +// v).unwrap())?; let id = UuidV7::new(); +// let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, +// kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() +// .with_json_metadata(serde_json::json!({ +// "content-type": ContentType::Json.to_string(), +// "content-encoding": ContentEncoding::Brotli.to_string(), +// "type": doc_types::PROPOSAL.clone(), +// "id": id, +// "ver": id, +// "parameters": { +// "id": parameters.doc_id()?, +// "ver": parameters.doc_ver()?, +// } +// }))? +// .with_json_content(&serde_json::json!({}))? +// .add_signature(|m| sk.sign(&m).to_vec(), kid)? +// .build() +// } +// => false +// ; +// "missing template" +// )] +// #[test_case( +// |provider| { +// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, +// v).unwrap())?; let template = +// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, +// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = +// create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid. +// clone(), *pk))?; Builder::new() +// .with_json_metadata(serde_json::json!({ "content-type": +// ContentType::Json.to_string(), "content-encoding": +// ContentEncoding::Brotli.to_string(), "type": +// doc_types::PROPOSAL.clone(), "id": id, +// "ver": id, +// "template": { +// "id": template.doc_id()?, +// "ver": template.doc_ver()?, +// }, +// }))? +// .with_json_content(&serde_json::json!({}))? +// .add_signature(|m| sk.sign(&m).to_vec(), kid)? +// .build() +// } +// => false +// ; +// "missing parameters" +// )] +#[tokio::test] +// #[allow(clippy::unwrap_used)] +async fn test_proposal_form_template_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} diff --git a/rust/signed_doc/tests/proposal_submission_action.rs b/rust/signed_doc/tests/proposal_submission_action.rs index 176ee9ee86b..606e18ff2a3 100644 --- a/rust/signed_doc/tests/proposal_submission_action.rs +++ b/rust/signed_doc/tests/proposal_submission_action.rs @@ -17,7 +17,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_submission_action_doc(&proposal, ¶meters, provider) } @@ -28,7 +28,7 @@ mod common; #[test_case( |provider| { let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_submission_action_doc(&proposal, ¶meters, provider) } @@ -39,7 +39,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_submission_action_doc(&proposal, ¶meters, provider) } @@ -50,7 +50,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -83,7 +83,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -115,7 +115,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -147,7 +147,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -208,7 +208,7 @@ mod common; #[test_case( |provider| { let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; From 22360258bf6a496af8e33a1f67e8a3f9b7bdec41 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 15:30:52 +0400 Subject: [PATCH 02/15] update ContentTypeRule, add ContentType::SchemaJson validation --- .../src/validator/rules/content_type.rs | 76 +++++++++---------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/rust/signed_doc/src/validator/rules/content_type.rs b/rust/signed_doc/src/validator/rules/content_type.rs index 4806f6bdbf3..552c2f0de8a 100644 --- a/rust/signed_doc/src/validator/rules/content_type.rs +++ b/rust/signed_doc/src/validator/rules/content_type.rs @@ -1,6 +1,6 @@ //! `content-type` rule type impl. -use crate::{metadata::ContentType, CatalystSignedDocument}; +use crate::{metadata::ContentType, validator::json_schema::JsonSchema, CatalystSignedDocument}; /// `content-type` field validation rule #[derive(Debug)] @@ -83,7 +83,7 @@ impl ContentTypeRule { ); return Ok(false); }; - if self.validate(&content).is_err() { + if !validate(exp, &content) { doc.report().invalid_value( "payload", &hex::encode(content), @@ -95,45 +95,43 @@ impl ContentTypeRule { } Ok(true) } +} - /// Validates the provided `content` bytes to be a defined `ContentType`. - fn validate( - &self, - content: &[u8], - ) -> anyhow::Result<()> { - if let Self::Specified { exp } = self { - match exp { - ContentType::Json => { - if let Err(e) = serde_json::from_slice::<&serde_json::value::RawValue>(content) - { - anyhow::bail!("Invalid {exp} content: {e}") - } - }, - ContentType::Cbor => { - let mut decoder = minicbor::Decoder::new(content); - - decoder.skip()?; - - if decoder.position() != content.len() { - anyhow::bail!("Unused bytes remain in the input after decoding") - } - }, - ContentType::Cddl - | ContentType::SchemaJson - | ContentType::Css - | ContentType::CssHandlebars - | ContentType::Html - | ContentType::HtmlHandlebars - | ContentType::Markdown - | ContentType::MarkdownHandlebars - | ContentType::Plain - | ContentType::PlainHandlebars => { - // TODO: not implemented yet - anyhow::bail!("`{exp}` is valid but unavailable yet") - }, +/// Validates the provided `content` bytes to be a defined `ContentType`. +fn validate( + content_type: &ContentType, + content: &[u8], +) -> bool { + match content_type { + ContentType::Json => { + serde_json::from_slice::<&serde_json::value::RawValue>(content).is_ok() + }, + ContentType::Cbor => { + let mut decoder = minicbor::Decoder::new(content); + if decoder.skip().is_ok() && decoder.position() == content.len() { + true + } else { + false } - } - Ok(()) + }, + ContentType::SchemaJson => { + let Ok(template_json_schema) = serde_json::from_slice(content) else { + return false; + }; + JsonSchema::try_from(&template_json_schema).is_ok() + }, + ContentType::Cddl + | ContentType::Css + | ContentType::CssHandlebars + | ContentType::Html + | ContentType::HtmlHandlebars + | ContentType::Markdown + | ContentType::MarkdownHandlebars + | ContentType::Plain + | ContentType::PlainHandlebars => { + // TODO: not implemented yet + false + }, } } From 0fb5ab952a0261177d1c4247336766fe541ad98a Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 15:39:23 +0400 Subject: [PATCH 03/15] wip --- .../tests/proposal_form_template.rs | 244 ++++++++---------- 1 file changed, 102 insertions(+), 142 deletions(-) diff --git a/rust/signed_doc/tests/proposal_form_template.rs b/rust/signed_doc/tests/proposal_form_template.rs index 257b17a5efc..46d0543d5cb 100644 --- a/rust/signed_doc/tests/proposal_form_template.rs +++ b/rust/signed_doc/tests/proposal_form_template.rs @@ -2,10 +2,12 @@ //! use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; use test_case::test_case; use crate::common::{ - brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, + brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, proposal_form_template_doc, }; @@ -38,148 +40,106 @@ mod common; ; "valid document with category 'parameters'" )] -// #[test_case( -// |provider| { -// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, -// v).unwrap())?; let template = -// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, -// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = -// create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid. -// clone(), *pk))?; Builder::new() -// .with_json_metadata(serde_json::json!({ "content-type": -// ContentType::Json.to_string(), "content-encoding": -// ContentEncoding::Brotli.to_string(), "type": -// doc_types::PROPOSAL.clone(), "id": id, -// "ver": id, -// "template": { -// "id": template.doc_id()?, -// "ver": template.doc_ver()?, -// }, -// "parameters": { -// "id": parameters.doc_id()?, -// "ver": parameters.doc_ver()?, -// } -// }))? -// .with_json_content(&serde_json::json!({}))? -// .add_signature(|m| sk.sign(&m).to_vec(), kid)? -// .build() -// } -// => false -// ; -// "wrong role" -// )] -// #[test_case( -// |provider| { -// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, -// v).unwrap())?; let template = -// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, -// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = -// create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid. -// clone(), *pk))?; Builder::new() -// .with_json_metadata(serde_json::json!({ "content-type": -// ContentType::Json.to_string(), "content-encoding": -// ContentEncoding::Brotli.to_string(), "type": -// doc_types::PROPOSAL.clone(), "id": id, -// "ver": id, -// "template": { -// "id": template.doc_id()?, -// "ver": template.doc_ver()?, -// }, -// "parameters": { -// "id": parameters.doc_id()?, -// "ver": parameters.doc_ver()?, -// } -// }))? -// .empty_content()? -// .add_signature(|m| sk.sign(&m).to_vec(), kid)? -// .build() -// } -// => false -// ; -// "empty content" -// )] -// #[test_case( -// |provider| { -// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, -// v).unwrap())?; let template = -// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, -// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = -// create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid. -// clone(), *pk))?; Builder::new() -// .with_json_metadata(serde_json::json!({ "content-type": -// ContentType::Json.to_string(), "type": doc_types::PROPOSAL.clone(), -// "id": id, -// "ver": id, -// "template": { -// "id": template.doc_id()?, -// "ver": template.doc_ver()?, -// }, -// "parameters": { -// "id": parameters.doc_id()?, -// "ver": parameters.doc_ver()?, -// } -// }))? -// .with_json_content(&serde_json::json!({}))? -// .add_signature(|m| sk.sign(&m).to_vec(), kid)? -// .build() -// } -// => true -// ; -// "missing 'content-encoding' (optional)" -// )] -// #[test_case( -// |provider| { -// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, -// v).unwrap())?; let id = UuidV7::new(); -// let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, -// kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() -// .with_json_metadata(serde_json::json!({ -// "content-type": ContentType::Json.to_string(), -// "content-encoding": ContentEncoding::Brotli.to_string(), -// "type": doc_types::PROPOSAL.clone(), -// "id": id, -// "ver": id, -// "parameters": { -// "id": parameters.doc_id()?, -// "ver": parameters.doc_ver()?, -// } -// }))? -// .with_json_content(&serde_json::json!({}))? -// .add_signature(|m| sk.sign(&m).to_vec(), kid)? -// .build() -// } -// => false -// ; -// "missing template" -// )] -// #[test_case( -// |provider| { -// let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, -// v).unwrap())?; let template = -// proposal_form_template_doc(¶meters).inspect(|v| provider.add_document(None, -// v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = -// create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid. -// clone(), *pk))?; Builder::new() -// .with_json_metadata(serde_json::json!({ "content-type": -// ContentType::Json.to_string(), "content-encoding": -// ContentEncoding::Brotli.to_string(), "type": -// doc_types::PROPOSAL.clone(), "id": id, -// "ver": id, -// "template": { -// "id": template.doc_id()?, -// "ver": template.doc_ver()?, -// }, -// }))? -// .with_json_content(&serde_json::json!({}))? -// .add_signature(|m| sk.sign(&m).to_vec(), kid)? -// .build() -// } -// => false -// ; -// "missing parameters" -// )] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "type": doc_types::PROPOSAL_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "type": doc_types::PROPOSAL_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + }, + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "type": doc_types::PROPOSAL_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "type": doc_types::PROPOSAL_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing parameters" +)] #[tokio::test] -// #[allow(clippy::unwrap_used)] +#[allow(clippy::unwrap_used)] async fn test_proposal_form_template_doc( doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result ) -> bool { From aaee88d7f0fbb9c9cb6a7199775505827ab6f784 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 15:51:20 +0400 Subject: [PATCH 04/15] add proposa comment form template integration tests --- .../common/proposal_comment_form_template.rs | 14 +- .../tests/proposal_comment_form_template.rs | 154 ++++++++++++++++++ 2 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 rust/signed_doc/tests/proposal_comment_form_template.rs diff --git a/rust/signed_doc/tests/common/proposal_comment_form_template.rs b/rust/signed_doc/tests/common/proposal_comment_form_template.rs index 694277e7c24..70ea0c4468a 100644 --- a/rust/signed_doc/tests/common/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/common/proposal_comment_form_template.rs @@ -1,20 +1,28 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + use super::*; pub fn proposal_comment_form_template_doc( - parameters_doc: &CatalystSignedDocument + parameters_doc: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, ) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ "content-type": ContentType::SchemaJson.to_string(), "content-encoding": ContentEncoding::Brotli.to_string(), "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), - "id": UuidV7::new(), - "ver": UuidV7::new(), + "id": id, + "ver": id, "parameters": { "id": parameters_doc.doc_id()?, "ver": parameters_doc.doc_ver()?, } }))? .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? .build() } diff --git a/rust/signed_doc/tests/proposal_comment_form_template.rs b/rust/signed_doc/tests/proposal_comment_form_template.rs new file mode 100644 index 00000000000..c1241ff2772 --- /dev/null +++ b/rust/signed_doc/tests/proposal_comment_form_template.rs @@ -0,0 +1,154 @@ +//! Integration test for proposal comment form template document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, + proposal_comment_form_template_doc, +}; + +mod common; + +#[test_case( + |provider| { + let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + proposal_comment_form_template_doc(¶meters, provider) + } + => true + ; + "valid document with brand 'parameters'" +)] +#[test_case( + |provider| { + let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + proposal_comment_form_template_doc(¶meters, provider) + } + => true + ; + "valid document with campaign 'parameters'" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + proposal_comment_form_template_doc(¶meters, provider) + } + => true + ; + "valid document with category 'parameters'" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + }, + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), + "id": id, + "ver": id, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing parameters" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_proposal_comment_form_template_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} From 08378aa2287386f7d2017bcc0a0fb029312fc6df Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 16:03:08 +0400 Subject: [PATCH 05/15] wip --- rust/signed_doc/tests/proposal.rs | 1 + rust/signed_doc/tests/proposal_comment.rs | 22 +++++++++++-------- .../tests/proposal_comment_form_template.rs | 4 ++++ .../tests/proposal_form_template.rs | 4 ++++ .../tests/proposal_submission_action.rs | 4 ++++ 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/rust/signed_doc/tests/proposal.rs b/rust/signed_doc/tests/proposal.rs index 0907710598f..f9e2c5afc46 100644 --- a/rust/signed_doc/tests/proposal.rs +++ b/rust/signed_doc/tests/proposal.rs @@ -192,6 +192,7 @@ async fn test_proposal_doc( let mut provider = TestCatalystProvider::default(); let doc = doc_gen(&mut provider).unwrap(); + assert_eq!(*doc.doc_type().unwrap(), doc_types::PROPOSAL.clone()); let is_valid = validator::validate(&doc, &provider).await.unwrap(); assert_eq!(is_valid, !doc.problem_report().is_problematic()); diff --git a/rust/signed_doc/tests/proposal_comment.rs b/rust/signed_doc/tests/proposal_comment.rs index d44460545a4..ecee574b83e 100644 --- a/rust/signed_doc/tests/proposal_comment.rs +++ b/rust/signed_doc/tests/proposal_comment.rs @@ -20,7 +20,7 @@ mod common; let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_doc(&proposal, &template, ¶meters, provider) } => true @@ -32,7 +32,7 @@ mod common; let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_doc(&proposal, &template, ¶meters, provider) } => true @@ -44,7 +44,7 @@ mod common; let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_doc(&proposal, &template, ¶meters, provider) } => true @@ -56,7 +56,7 @@ mod common; let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let comment = proposal_comment_doc(&proposal, &template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) @@ -98,7 +98,7 @@ mod common; let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -135,7 +135,7 @@ mod common; let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -173,7 +173,7 @@ mod common; let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -243,7 +243,7 @@ mod common; let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -275,7 +275,7 @@ mod common; #[test_case( |provider| { let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; - let template = proposal_comment_form_template_doc(¶meters).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -312,6 +312,10 @@ async fn test_proposal_comment_doc( let mut provider = TestCatalystProvider::default(); let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::PROPOSAL_COMMENT.clone() + ); let is_valid = validator::validate(&doc, &provider).await.unwrap(); assert_eq!(is_valid, !doc.problem_report().is_problematic()); diff --git a/rust/signed_doc/tests/proposal_comment_form_template.rs b/rust/signed_doc/tests/proposal_comment_form_template.rs index c1241ff2772..7adae38dbc7 100644 --- a/rust/signed_doc/tests/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/proposal_comment_form_template.rs @@ -146,6 +146,10 @@ async fn test_proposal_comment_form_template_doc( let mut provider = TestCatalystProvider::default(); let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone() + ); let is_valid = validator::validate(&doc, &provider).await.unwrap(); assert_eq!(is_valid, !doc.problem_report().is_problematic()); diff --git a/rust/signed_doc/tests/proposal_form_template.rs b/rust/signed_doc/tests/proposal_form_template.rs index 46d0543d5cb..3783c7968e4 100644 --- a/rust/signed_doc/tests/proposal_form_template.rs +++ b/rust/signed_doc/tests/proposal_form_template.rs @@ -146,6 +146,10 @@ async fn test_proposal_form_template_doc( let mut provider = TestCatalystProvider::default(); let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::PROPOSAL_FORM_TEMPLATE.clone() + ); let is_valid = validator::validate(&doc, &provider).await.unwrap(); assert_eq!(is_valid, !doc.problem_report().is_problematic()); diff --git a/rust/signed_doc/tests/proposal_submission_action.rs b/rust/signed_doc/tests/proposal_submission_action.rs index 606e18ff2a3..cc0d1f360c5 100644 --- a/rust/signed_doc/tests/proposal_submission_action.rs +++ b/rust/signed_doc/tests/proposal_submission_action.rs @@ -243,6 +243,10 @@ async fn test_proposal_submission_action_doc( let mut provider = TestCatalystProvider::default(); let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::PROPOSAL_SUBMISSION_ACTION.clone() + ); let is_valid = validator::validate(&doc, &provider).await.unwrap(); assert_eq!(is_valid, !doc.problem_report().is_problematic()); From 9be18cfded11dfe6eae1faa4ff9dbb662aa6a90d Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 16:16:54 +0400 Subject: [PATCH 06/15] add brand_parameters_form_template --- .../tests/brand_parameters_form_template.rs | 116 ++++++++++++++++++ .../common/brand_parameters_form_template.rs | 23 ++++ rust/signed_doc/tests/common/mod.rs | 2 + 3 files changed, 141 insertions(+) create mode 100644 rust/signed_doc/tests/brand_parameters_form_template.rs create mode 100644 rust/signed_doc/tests/common/brand_parameters_form_template.rs diff --git a/rust/signed_doc/tests/brand_parameters_form_template.rs b/rust/signed_doc/tests/brand_parameters_form_template.rs new file mode 100644 index 00000000000..994f4102584 --- /dev/null +++ b/rust/signed_doc/tests/brand_parameters_form_template.rs @@ -0,0 +1,116 @@ +//! Integration test for brand parameters form template document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{brand_parameters_form_template_doc, create_dummy_key_pair}; + +mod common; + +#[test_case( + |provider| { + brand_parameters_form_template_doc( provider) + } + => true + ; + "valid document with brand 'parameters'" +)] +#[test_case( + |provider| { + brand_parameters_form_template_doc(provider) + } + => true + ; + "valid document with campaign 'parameters'" +)] +#[test_case( + |provider| { + brand_parameters_form_template_doc(provider) + } + => true + ; + "valid document with category 'parameters'" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS_FORM_TEMPLATE.clone(), + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS_FORM_TEMPLATE.clone(), + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS_FORM_TEMPLATE.clone(), + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_brand_parameters_form_template_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::BRAND_PARAMETERS_FORM_TEMPLATE.clone() + ); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} diff --git a/rust/signed_doc/tests/common/brand_parameters_form_template.rs b/rust/signed_doc/tests/common/brand_parameters_form_template.rs new file mode 100644 index 00000000000..6f87fef50c8 --- /dev/null +++ b/rust/signed_doc/tests/common/brand_parameters_form_template.rs @@ -0,0 +1,23 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + +use super::*; + +pub fn brand_parameters_form_template_doc( + provider: &mut TestCatalystProvider +) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson.to_string(), + "content-encoding": ContentEncoding::Brotli.to_string(), + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS_FORM_TEMPLATE.clone(), + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() +} diff --git a/rust/signed_doc/tests/common/mod.rs b/rust/signed_doc/tests/common/mod.rs index eeb2959bb4a..e662a236588 100644 --- a/rust/signed_doc/tests/common/mod.rs +++ b/rust/signed_doc/tests/common/mod.rs @@ -1,6 +1,7 @@ #![allow(dead_code, unused_imports)] pub mod brand_parameters; +pub mod brand_parameters_form_template; pub mod campaign_parameters; pub mod category_parameters; pub mod proposal; @@ -12,6 +13,7 @@ pub mod proposal_submission_action; use std::str::FromStr; pub use brand_parameters::brand_parameters_doc; +pub use brand_parameters_form_template::brand_parameters_form_template_doc; pub use campaign_parameters::campaign_parameters_doc; use catalyst_signed_doc::*; use catalyst_types::catalyst_id::role_index::RoleId; From 6cdf9fea34f5f9e5c4f028e11f365eef798847f1 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 16:22:52 +0400 Subject: [PATCH 07/15] wip --- rust/signed_doc/tests/brand_parameters_form_template.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/signed_doc/tests/brand_parameters_form_template.rs b/rust/signed_doc/tests/brand_parameters_form_template.rs index 994f4102584..1c6e91c5b1e 100644 --- a/rust/signed_doc/tests/brand_parameters_form_template.rs +++ b/rust/signed_doc/tests/brand_parameters_form_template.rs @@ -12,7 +12,7 @@ mod common; #[test_case( |provider| { - brand_parameters_form_template_doc( provider) + brand_parameters_form_template_doc(provider) } => true ; From f3efa1f65fca2f39bd91452741199a4b3728d44b Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 16:28:19 +0400 Subject: [PATCH 08/15] cleanup --- .../tests/common/brand_parameters.rs | 2 +- .../common/brand_parameters_form_template.rs | 4 +-- .../tests/common/campaign_parameters.rs | 2 +- .../tests/common/category_parameters.rs | 2 +- rust/signed_doc/tests/common/proposal.rs | 4 +-- .../tests/common/proposal_comment.rs | 4 +-- .../common/proposal_comment_form_template.rs | 4 +-- .../tests/common/proposal_form_template.rs | 4 +-- .../common/proposal_submission_action.rs | 4 +-- rust/signed_doc/tests/proposal.rs | 18 ++++++------- rust/signed_doc/tests/proposal_comment.rs | 26 +++++++++---------- .../tests/proposal_comment_form_template.rs | 14 +++++----- .../tests/proposal_submission_action.rs | 18 ++++++------- 13 files changed, 53 insertions(+), 53 deletions(-) diff --git a/rust/signed_doc/tests/common/brand_parameters.rs b/rust/signed_doc/tests/common/brand_parameters.rs index c1354e7ae96..db6469b60de 100644 --- a/rust/signed_doc/tests/common/brand_parameters.rs +++ b/rust/signed_doc/tests/common/brand_parameters.rs @@ -3,7 +3,7 @@ use super::*; pub fn brand_parameters_doc() -> anyhow::Result { Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), + "content-type": ContentType::Json, "id": UuidV7::new(), "ver": UuidV7::new(), "type": doc_types::BRAND_PARAMETERS.clone(), diff --git a/rust/signed_doc/tests/common/brand_parameters_form_template.rs b/rust/signed_doc/tests/common/brand_parameters_form_template.rs index 6f87fef50c8..4878dec429f 100644 --- a/rust/signed_doc/tests/common/brand_parameters_form_template.rs +++ b/rust/signed_doc/tests/common/brand_parameters_form_template.rs @@ -11,8 +11,8 @@ pub fn brand_parameters_form_template_doc( .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, "id": id, "ver": id, "type": doc_types::BRAND_PARAMETERS_FORM_TEMPLATE.clone(), diff --git a/rust/signed_doc/tests/common/campaign_parameters.rs b/rust/signed_doc/tests/common/campaign_parameters.rs index 99ced28e6bd..c71c3b41fc8 100644 --- a/rust/signed_doc/tests/common/campaign_parameters.rs +++ b/rust/signed_doc/tests/common/campaign_parameters.rs @@ -3,7 +3,7 @@ use super::*; pub fn campaign_parameters_doc() -> anyhow::Result { Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), + "content-type": ContentType::Json, "id": UuidV7::new(), "ver": UuidV7::new(), "type": doc_types::CAMPAIGN_PARAMETERS.clone(), diff --git a/rust/signed_doc/tests/common/category_parameters.rs b/rust/signed_doc/tests/common/category_parameters.rs index cbd0bcb9c8b..9c18f4eb953 100644 --- a/rust/signed_doc/tests/common/category_parameters.rs +++ b/rust/signed_doc/tests/common/category_parameters.rs @@ -3,7 +3,7 @@ use super::*; pub fn category_parameters_doc() -> anyhow::Result { Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), + "content-type": ContentType::Json, "id": UuidV7::new(), "ver": UuidV7::new(), "type": doc_types::CATEGORY_PARAMETERS.clone(), diff --git a/rust/signed_doc/tests/common/proposal.rs b/rust/signed_doc/tests/common/proposal.rs index edd55ed84df..be73a7d35b5 100644 --- a/rust/signed_doc/tests/common/proposal.rs +++ b/rust/signed_doc/tests/common/proposal.rs @@ -15,8 +15,8 @@ pub fn proposal_doc( .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/common/proposal_comment.rs b/rust/signed_doc/tests/common/proposal_comment.rs index fdd9cba5e20..4c90d8f8ac0 100644 --- a/rust/signed_doc/tests/common/proposal_comment.rs +++ b/rust/signed_doc/tests/common/proposal_comment.rs @@ -15,8 +15,8 @@ pub fn proposal_comment_doc( .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/common/proposal_comment_form_template.rs b/rust/signed_doc/tests/common/proposal_comment_form_template.rs index 70ea0c4468a..6a39db4db56 100644 --- a/rust/signed_doc/tests/common/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/common/proposal_comment_form_template.rs @@ -12,8 +12,8 @@ pub fn proposal_comment_form_template_doc( .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/common/proposal_form_template.rs b/rust/signed_doc/tests/common/proposal_form_template.rs index 664d06ba5a8..2ba2f429a55 100644 --- a/rust/signed_doc/tests/common/proposal_form_template.rs +++ b/rust/signed_doc/tests/common/proposal_form_template.rs @@ -12,8 +12,8 @@ pub fn proposal_form_template_doc( .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_FORM_TEMPLATE.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/common/proposal_submission_action.rs b/rust/signed_doc/tests/common/proposal_submission_action.rs index 861ff36197f..3549fbda7d2 100644 --- a/rust/signed_doc/tests/common/proposal_submission_action.rs +++ b/rust/signed_doc/tests/common/proposal_submission_action.rs @@ -13,8 +13,8 @@ pub fn proposal_submission_action_doc( .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_SUBMISSION_ACTION.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/proposal.rs b/rust/signed_doc/tests/proposal.rs index f9e2c5afc46..251d27c43b1 100644 --- a/rust/signed_doc/tests/proposal.rs +++ b/rust/signed_doc/tests/proposal.rs @@ -52,8 +52,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL.clone(), "id": id, "ver": id, @@ -82,8 +82,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL.clone(), "id": id, "ver": id, @@ -112,7 +112,7 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), + "content-type": ContentType::Json, "type": doc_types::PROPOSAL.clone(), "id": id, "ver": id, @@ -140,8 +140,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL.clone(), "id": id, "ver": id, @@ -166,8 +166,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/proposal_comment.rs b/rust/signed_doc/tests/proposal_comment.rs index ecee574b83e..3052e9541c1 100644 --- a/rust/signed_doc/tests/proposal_comment.rs +++ b/rust/signed_doc/tests/proposal_comment.rs @@ -63,8 +63,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, @@ -104,8 +104,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, @@ -141,8 +141,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, @@ -179,7 +179,7 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), + "content-type": ContentType::Json, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, @@ -215,8 +215,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, @@ -249,8 +249,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, @@ -281,8 +281,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/proposal_comment_form_template.rs b/rust/signed_doc/tests/proposal_comment_form_template.rs index 7adae38dbc7..fe8436c9515 100644 --- a/rust/signed_doc/tests/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/proposal_comment_form_template.rs @@ -48,8 +48,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), "id": id, "ver": id, @@ -74,8 +74,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), "id": id, "ver": id, @@ -100,7 +100,7 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), + "content-type": ContentType::SchemaJson, "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), "id": id, "ver": id, @@ -124,8 +124,8 @@ mod common; .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::SchemaJson.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_COMMENT_FORM_TEMPLATE.clone(), "id": id, "ver": id, diff --git a/rust/signed_doc/tests/proposal_submission_action.rs b/rust/signed_doc/tests/proposal_submission_action.rs index cc0d1f360c5..0e6bca5344a 100644 --- a/rust/signed_doc/tests/proposal_submission_action.rs +++ b/rust/signed_doc/tests/proposal_submission_action.rs @@ -56,8 +56,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_SUBMISSION_ACTION.clone(), "id": id, "ver": id, @@ -89,8 +89,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_SUBMISSION_ACTION.clone(), "id": id, "ver": id, @@ -121,8 +121,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_SUBMISSION_ACTION.clone(), "id": id, "ver": id, @@ -153,7 +153,7 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), + "content-type": ContentType::Json, "type": doc_types::PROPOSAL_SUBMISSION_ACTION.clone(), "id": id, "ver": id, @@ -214,8 +214,8 @@ mod common; let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() .with_json_metadata(serde_json::json!({ - "content-type": ContentType::Json.to_string(), - "content-encoding": ContentEncoding::Brotli.to_string(), + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, "type": doc_types::PROPOSAL_SUBMISSION_ACTION.clone(), "id": id, "ver": id, From 777cb59fb9342ed1051c402f53d8645422ffb7d1 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Tue, 23 Sep 2025 17:57:54 +0400 Subject: [PATCH 09/15] add brand_parameters document tests --- rust/signed_doc/tests/brand_parameters.rs | 140 ++++++++++++++++++ .../tests/brand_parameters_form_template.rs | 18 +-- .../tests/common/brand_parameters.rs | 23 ++- rust/signed_doc/tests/proposal.rs | 22 ++- rust/signed_doc/tests/proposal_comment.rs | 30 ++-- .../tests/proposal_comment_form_template.rs | 7 +- .../tests/proposal_form_template.rs | 7 +- .../tests/proposal_submission_action.rs | 8 +- 8 files changed, 206 insertions(+), 49 deletions(-) create mode 100644 rust/signed_doc/tests/brand_parameters.rs diff --git a/rust/signed_doc/tests/brand_parameters.rs b/rust/signed_doc/tests/brand_parameters.rs new file mode 100644 index 00000000000..7771057dba0 --- /dev/null +++ b/rust/signed_doc/tests/brand_parameters.rs @@ -0,0 +1,140 @@ +//! Integration test for brand parameters document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, brand_parameters_form_template_doc, create_dummy_key_pair, +}; + +mod common; + +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + brand_parameters_doc(&template, provider) + } + => true + ; + "valid document" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::BRAND_PARAMETERS.clone(), + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'template'" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_brand_parameters_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::BRAND_PARAMETERS.clone() + ); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} diff --git a/rust/signed_doc/tests/brand_parameters_form_template.rs b/rust/signed_doc/tests/brand_parameters_form_template.rs index 1c6e91c5b1e..14923fc5f6d 100644 --- a/rust/signed_doc/tests/brand_parameters_form_template.rs +++ b/rust/signed_doc/tests/brand_parameters_form_template.rs @@ -16,23 +16,7 @@ mod common; } => true ; - "valid document with brand 'parameters'" -)] -#[test_case( - |provider| { - brand_parameters_form_template_doc(provider) - } - => true - ; - "valid document with campaign 'parameters'" -)] -#[test_case( - |provider| { - brand_parameters_form_template_doc(provider) - } - => true - ; - "valid document with category 'parameters'" + "valid document" )] #[test_case( |provider| { diff --git a/rust/signed_doc/tests/common/brand_parameters.rs b/rust/signed_doc/tests/common/brand_parameters.rs index db6469b60de..13e749a6bb6 100644 --- a/rust/signed_doc/tests/common/brand_parameters.rs +++ b/rust/signed_doc/tests/common/brand_parameters.rs @@ -1,13 +1,28 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + use super::*; -pub fn brand_parameters_doc() -> anyhow::Result { +pub fn brand_parameters_doc( + template: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, +) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ "content-type": ContentType::Json, - "id": UuidV7::new(), - "ver": UuidV7::new(), + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, "type": doc_types::BRAND_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, }))? - .empty_content()? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? .build() } diff --git a/rust/signed_doc/tests/proposal.rs b/rust/signed_doc/tests/proposal.rs index 251d27c43b1..5790477a9be 100644 --- a/rust/signed_doc/tests/proposal.rs +++ b/rust/signed_doc/tests/proposal.rs @@ -8,15 +8,16 @@ use ed25519_dalek::ed25519::signature::Signer; use test_case::test_case; use crate::common::{ - brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, - proposal_doc, proposal_form_template_doc, + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + category_parameters_doc, create_dummy_key_pair, proposal_doc, proposal_form_template_doc, }; mod common; #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_doc(&template, ¶meters, provider) } @@ -46,7 +47,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -76,7 +78,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -106,7 +109,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -135,7 +139,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() @@ -160,7 +165,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; diff --git a/rust/signed_doc/tests/proposal_comment.rs b/rust/signed_doc/tests/proposal_comment.rs index 3052e9541c1..e218d8bebee 100644 --- a/rust/signed_doc/tests/proposal_comment.rs +++ b/rust/signed_doc/tests/proposal_comment.rs @@ -8,16 +8,17 @@ use ed25519_dalek::ed25519::signature::Signer; use test_case::test_case; use crate::common::{ - brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, - proposal_comment_doc, proposal_comment_form_template_doc, proposal_doc, - proposal_form_template_doc, + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + category_parameters_doc, create_dummy_key_pair, proposal_comment_doc, + proposal_comment_form_template_doc, proposal_doc, proposal_form_template_doc, }; mod common; #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -53,7 +54,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -95,7 +97,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -132,7 +135,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -170,7 +174,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -207,7 +212,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -240,7 +246,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; @@ -274,7 +281,8 @@ mod common; )] #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) diff --git a/rust/signed_doc/tests/proposal_comment_form_template.rs b/rust/signed_doc/tests/proposal_comment_form_template.rs index fe8436c9515..cac685df91e 100644 --- a/rust/signed_doc/tests/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/proposal_comment_form_template.rs @@ -7,15 +7,16 @@ use ed25519_dalek::ed25519::signature::Signer; use test_case::test_case; use crate::common::{ - brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, - proposal_comment_form_template_doc, + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + category_parameters_doc, create_dummy_key_pair, proposal_comment_form_template_doc, }; mod common; #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_form_template_doc(¶meters, provider) } => true diff --git a/rust/signed_doc/tests/proposal_form_template.rs b/rust/signed_doc/tests/proposal_form_template.rs index 3783c7968e4..53ce65b52a4 100644 --- a/rust/signed_doc/tests/proposal_form_template.rs +++ b/rust/signed_doc/tests/proposal_form_template.rs @@ -7,15 +7,16 @@ use ed25519_dalek::ed25519::signature::Signer; use test_case::test_case; use crate::common::{ - brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, - proposal_form_template_doc, + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + category_parameters_doc, create_dummy_key_pair, proposal_form_template_doc, }; mod common; #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_form_template_doc(¶meters, provider) } => true diff --git a/rust/signed_doc/tests/proposal_submission_action.rs b/rust/signed_doc/tests/proposal_submission_action.rs index 0e6bca5344a..a6e7abebfde 100644 --- a/rust/signed_doc/tests/proposal_submission_action.rs +++ b/rust/signed_doc/tests/proposal_submission_action.rs @@ -8,15 +8,17 @@ use ed25519_dalek::ed25519::signature::Signer; use test_case::test_case; use crate::common::{ - brand_parameters_doc, campaign_parameters_doc, category_parameters_doc, create_dummy_key_pair, - proposal_doc, proposal_form_template_doc, proposal_submission_action_doc, + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + category_parameters_doc, create_dummy_key_pair, proposal_doc, proposal_form_template_doc, + proposal_submission_action_doc, }; mod common; #[test_case( |provider| { - let parameters = brand_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_submission_action_doc(&proposal, ¶meters, provider) From c41dbea6d2b33a60ac17a23ffe086300196f90eb Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Wed, 24 Sep 2025 10:28:10 +0400 Subject: [PATCH 10/15] add campaign_parameters_form_template integration tests --- .../src/validator/rules/content_type.rs | 2 +- .../campaign_parameters_form_template.rs | 144 ++++++++++++++++++ .../campaign_parameters_form_template.rs | 28 ++++ rust/signed_doc/tests/common/mod.rs | 2 + 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 rust/signed_doc/tests/campaign_parameters_form_template.rs create mode 100644 rust/signed_doc/tests/common/campaign_parameters_form_template.rs diff --git a/rust/signed_doc/src/validator/rules/content_type.rs b/rust/signed_doc/src/validator/rules/content_type.rs index 639ece07110..b5cf0c1e2b9 100644 --- a/rust/signed_doc/src/validator/rules/content_type.rs +++ b/rust/signed_doc/src/validator/rules/content_type.rs @@ -99,7 +99,7 @@ impl ContentTypeRule { /// Validates the provided `content` bytes to be a defined `ContentType`. fn validate( - content_type: &ContentType, + content_type: ContentType, content: &[u8], ) -> bool { match content_type { diff --git a/rust/signed_doc/tests/campaign_parameters_form_template.rs b/rust/signed_doc/tests/campaign_parameters_form_template.rs new file mode 100644 index 00000000000..639b0405690 --- /dev/null +++ b/rust/signed_doc/tests/campaign_parameters_form_template.rs @@ -0,0 +1,144 @@ +//! Integration test for campaign parameters form template document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, brand_parameters_form_template_doc, + campaign_parameters_form_template_doc, create_dummy_key_pair, +}; + +mod common; + +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + campaign_parameters_form_template_doc(¶meters, provider) + } + => true + ; + "valid document" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS_FORM_TEMPLATE.clone(), + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'parameters'" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_brand_parameters_form_template_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::CAMPAIGN_PARAMETERS_FORM_TEMPLATE.clone() + ); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} diff --git a/rust/signed_doc/tests/common/campaign_parameters_form_template.rs b/rust/signed_doc/tests/common/campaign_parameters_form_template.rs new file mode 100644 index 00000000000..7260d45fb22 --- /dev/null +++ b/rust/signed_doc/tests/common/campaign_parameters_form_template.rs @@ -0,0 +1,28 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + +use super::*; + +pub fn campaign_parameters_form_template_doc( + parameters: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, +) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() +} diff --git a/rust/signed_doc/tests/common/mod.rs b/rust/signed_doc/tests/common/mod.rs index e662a236588..7a532385406 100644 --- a/rust/signed_doc/tests/common/mod.rs +++ b/rust/signed_doc/tests/common/mod.rs @@ -3,6 +3,7 @@ pub mod brand_parameters; pub mod brand_parameters_form_template; pub mod campaign_parameters; +pub mod campaign_parameters_form_template; pub mod category_parameters; pub mod proposal; pub mod proposal_comment; @@ -15,6 +16,7 @@ use std::str::FromStr; pub use brand_parameters::brand_parameters_doc; pub use brand_parameters_form_template::brand_parameters_form_template_doc; pub use campaign_parameters::campaign_parameters_doc; +pub use campaign_parameters_form_template::campaign_parameters_form_template_doc; use catalyst_signed_doc::*; use catalyst_types::catalyst_id::role_index::RoleId; pub use category_parameters::category_parameters_doc; From 51d3522b0ee936b4369e43a6f21e9b5f6ae43311 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Wed, 24 Sep 2025 14:18:59 +0400 Subject: [PATCH 11/15] add campaign_parameters integration test --- rust/signed_doc/tests/campaign_parameters.rs | 195 ++++++++++++++++++ .../tests/common/campaign_parameters.rs | 28 ++- rust/signed_doc/tests/proposal.rs | 8 +- rust/signed_doc/tests/proposal_comment.rs | 10 +- .../tests/proposal_comment_form_template.rs | 8 +- .../tests/proposal_form_template.rs | 8 +- .../tests/proposal_submission_action.rs | 9 +- 7 files changed, 250 insertions(+), 16 deletions(-) create mode 100644 rust/signed_doc/tests/campaign_parameters.rs diff --git a/rust/signed_doc/tests/campaign_parameters.rs b/rust/signed_doc/tests/campaign_parameters.rs new file mode 100644 index 00000000000..70aba6d6a1a --- /dev/null +++ b/rust/signed_doc/tests/campaign_parameters.rs @@ -0,0 +1,195 @@ +//! Integration test for campaign parameters document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + create_dummy_key_pair, campaign_parameters_form_template_doc +}; + +mod common; + +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + campaign_parameters_doc(&template, ¶meters, provider) + + } + => true + ; + "valid document" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'template'" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CAMPAIGN_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'parameters'" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_campaign_parameters_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::CAMPAIGN_PARAMETERS.clone() + ); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} diff --git a/rust/signed_doc/tests/common/campaign_parameters.rs b/rust/signed_doc/tests/common/campaign_parameters.rs index c71c3b41fc8..2298f81473d 100644 --- a/rust/signed_doc/tests/common/campaign_parameters.rs +++ b/rust/signed_doc/tests/common/campaign_parameters.rs @@ -1,13 +1,33 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + use super::*; -pub fn campaign_parameters_doc() -> anyhow::Result { +pub fn campaign_parameters_doc( + template: &CatalystSignedDocument, + parameters: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, +) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ "content-type": ContentType::Json, - "id": UuidV7::new(), - "ver": UuidV7::new(), + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, "type": doc_types::CAMPAIGN_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } }))? - .empty_content()? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? .build() } diff --git a/rust/signed_doc/tests/proposal.rs b/rust/signed_doc/tests/proposal.rs index 5790477a9be..9a8e8544955 100644 --- a/rust/signed_doc/tests/proposal.rs +++ b/rust/signed_doc/tests/proposal.rs @@ -9,7 +9,8 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - category_parameters_doc, create_dummy_key_pair, proposal_doc, proposal_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, + proposal_doc, proposal_form_template_doc, }; mod common; @@ -27,7 +28,10 @@ mod common; )] #[test_case( |provider| { - let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_doc(&template, ¶meters, provider) } diff --git a/rust/signed_doc/tests/proposal_comment.rs b/rust/signed_doc/tests/proposal_comment.rs index e218d8bebee..ea0e0ba24f2 100644 --- a/rust/signed_doc/tests/proposal_comment.rs +++ b/rust/signed_doc/tests/proposal_comment.rs @@ -9,8 +9,9 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - category_parameters_doc, create_dummy_key_pair, proposal_comment_doc, - proposal_comment_form_template_doc, proposal_doc, proposal_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, + proposal_comment_doc, proposal_comment_form_template_doc, proposal_doc, + proposal_form_template_doc, }; mod common; @@ -30,7 +31,10 @@ mod common; )] #[test_case( |provider| { - let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; diff --git a/rust/signed_doc/tests/proposal_comment_form_template.rs b/rust/signed_doc/tests/proposal_comment_form_template.rs index cac685df91e..6b4a65140a3 100644 --- a/rust/signed_doc/tests/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/proposal_comment_form_template.rs @@ -8,7 +8,8 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - category_parameters_doc, create_dummy_key_pair, proposal_comment_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, + proposal_comment_form_template_doc, }; mod common; @@ -25,7 +26,10 @@ mod common; )] #[test_case( |provider| { - let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_form_template_doc(¶meters, provider) } => true diff --git a/rust/signed_doc/tests/proposal_form_template.rs b/rust/signed_doc/tests/proposal_form_template.rs index 53ce65b52a4..b58c385069d 100644 --- a/rust/signed_doc/tests/proposal_form_template.rs +++ b/rust/signed_doc/tests/proposal_form_template.rs @@ -8,7 +8,8 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - category_parameters_doc, create_dummy_key_pair, proposal_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, + proposal_form_template_doc, }; mod common; @@ -25,7 +26,10 @@ mod common; )] #[test_case( |provider| { - let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_form_template_doc(¶meters, provider) } => true diff --git a/rust/signed_doc/tests/proposal_submission_action.rs b/rust/signed_doc/tests/proposal_submission_action.rs index a6e7abebfde..3d509634c8d 100644 --- a/rust/signed_doc/tests/proposal_submission_action.rs +++ b/rust/signed_doc/tests/proposal_submission_action.rs @@ -9,8 +9,8 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - category_parameters_doc, create_dummy_key_pair, proposal_doc, proposal_form_template_doc, - proposal_submission_action_doc, + campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, + proposal_doc, proposal_form_template_doc, proposal_submission_action_doc, }; mod common; @@ -29,7 +29,10 @@ mod common; )] #[test_case( |provider| { - let parameters = campaign_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_submission_action_doc(&proposal, ¶meters, provider) From 133efa2ad3d66f471f36ffe8a2434f10ba1dcf8e Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Wed, 24 Sep 2025 15:48:36 +0400 Subject: [PATCH 12/15] fix fmt --- rust/signed_doc/tests/campaign_parameters.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rust/signed_doc/tests/campaign_parameters.rs b/rust/signed_doc/tests/campaign_parameters.rs index 70aba6d6a1a..c0583afb564 100644 --- a/rust/signed_doc/tests/campaign_parameters.rs +++ b/rust/signed_doc/tests/campaign_parameters.rs @@ -8,7 +8,7 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - create_dummy_key_pair, campaign_parameters_form_template_doc + campaign_parameters_form_template_doc, create_dummy_key_pair, }; mod common; @@ -19,7 +19,6 @@ mod common; let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; campaign_parameters_doc(&template, ¶meters, provider) - } => true ; From e9d1f45ca4936f755634269d74f9106de650259f Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Wed, 24 Sep 2025 16:57:25 +0400 Subject: [PATCH 13/15] add category parameters form template tests --- .../campaign_parameters_form_template.rs | 2 +- .../category_parameters_form_template.rs | 153 ++++++++++++++++++ .../category_parameters_form_template.rs | 28 ++++ rust/signed_doc/tests/common/mod.rs | 2 + 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 rust/signed_doc/tests/category_parameters_form_template.rs create mode 100644 rust/signed_doc/tests/common/category_parameters_form_template.rs diff --git a/rust/signed_doc/tests/campaign_parameters_form_template.rs b/rust/signed_doc/tests/campaign_parameters_form_template.rs index 639b0405690..b1a4636ef19 100644 --- a/rust/signed_doc/tests/campaign_parameters_form_template.rs +++ b/rust/signed_doc/tests/campaign_parameters_form_template.rs @@ -126,7 +126,7 @@ mod common; )] #[tokio::test] #[allow(clippy::unwrap_used)] -async fn test_brand_parameters_form_template_doc( +async fn test_campaign_parameters_form_template_doc( doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result ) -> bool { let mut provider = TestCatalystProvider::default(); diff --git a/rust/signed_doc/tests/category_parameters_form_template.rs b/rust/signed_doc/tests/category_parameters_form_template.rs new file mode 100644 index 00000000000..5664d5c82ac --- /dev/null +++ b/rust/signed_doc/tests/category_parameters_form_template.rs @@ -0,0 +1,153 @@ +//! Integration test for category parameters form template document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + campaign_parameters_form_template_doc, category_parameters_form_template_doc, + create_dummy_key_pair, +}; + +mod common; + +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(¶meters, &template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + category_parameters_form_template_doc(¶meters, provider) + } + => true + ; + "valid document" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(¶meters, &template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(¶meters, &template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(¶meters, &template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS_FORM_TEMPLATE.clone(), + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'parameters'" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_category_parameters_form_template_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::CATEGORY_PARAMETERS_FORM_TEMPLATE.clone() + ); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +} diff --git a/rust/signed_doc/tests/common/category_parameters_form_template.rs b/rust/signed_doc/tests/common/category_parameters_form_template.rs new file mode 100644 index 00000000000..4d511595914 --- /dev/null +++ b/rust/signed_doc/tests/common/category_parameters_form_template.rs @@ -0,0 +1,28 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + +use super::*; + +pub fn category_parameters_form_template_doc( + parameters: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, +) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::SchemaJson, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS_FORM_TEMPLATE.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() +} diff --git a/rust/signed_doc/tests/common/mod.rs b/rust/signed_doc/tests/common/mod.rs index 7a532385406..5e3b9b73ce7 100644 --- a/rust/signed_doc/tests/common/mod.rs +++ b/rust/signed_doc/tests/common/mod.rs @@ -5,6 +5,7 @@ pub mod brand_parameters_form_template; pub mod campaign_parameters; pub mod campaign_parameters_form_template; pub mod category_parameters; +pub mod category_parameters_form_template; pub mod proposal; pub mod proposal_comment; pub mod proposal_comment_form_template; @@ -20,6 +21,7 @@ pub use campaign_parameters_form_template::campaign_parameters_form_template_doc use catalyst_signed_doc::*; use catalyst_types::catalyst_id::role_index::RoleId; pub use category_parameters::category_parameters_doc; +pub use category_parameters_form_template::category_parameters_form_template_doc; pub use proposal::proposal_doc; pub use proposal_comment::proposal_comment_doc; pub use proposal_comment_form_template::proposal_comment_form_template_doc; From 1da1fa18e7f686de378094ec070217e32f78071d Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Wed, 24 Sep 2025 21:15:56 +0400 Subject: [PATCH 14/15] wip --- .../tests/common/category_parameters.rs | 28 ++++++++++++++--- rust/signed_doc/tests/proposal.rs | 12 ++++++-- rust/signed_doc/tests/proposal_comment.rs | 13 +++++--- .../tests/proposal_comment_form_template.rs | 19 ++++++++---- .../tests/proposal_form_template.rs | 20 +++++++++---- .../tests/proposal_submission_action.rs | 30 +++++++++++++------ 6 files changed, 91 insertions(+), 31 deletions(-) diff --git a/rust/signed_doc/tests/common/category_parameters.rs b/rust/signed_doc/tests/common/category_parameters.rs index 9c18f4eb953..654b9ea37bf 100644 --- a/rust/signed_doc/tests/common/category_parameters.rs +++ b/rust/signed_doc/tests/common/category_parameters.rs @@ -1,13 +1,33 @@ +use catalyst_signed_doc::providers::tests::TestCatalystProvider; +use ed25519_dalek::ed25519::signature::Signer; + use super::*; -pub fn category_parameters_doc() -> anyhow::Result { +pub fn category_parameters_doc( + template: &CatalystSignedDocument, + parameters: &CatalystSignedDocument, + provider: &mut TestCatalystProvider, +) -> anyhow::Result { + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; Builder::new() .with_json_metadata(serde_json::json!({ "content-type": ContentType::Json, - "id": UuidV7::new(), - "ver": UuidV7::new(), + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, "type": doc_types::CATEGORY_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } }))? - .empty_content()? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? .build() } diff --git a/rust/signed_doc/tests/proposal.rs b/rust/signed_doc/tests/proposal.rs index 9a8e8544955..4a17127566b 100644 --- a/rust/signed_doc/tests/proposal.rs +++ b/rust/signed_doc/tests/proposal.rs @@ -9,8 +9,9 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, - proposal_doc, proposal_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, + category_parameters_form_template_doc, create_dummy_key_pair, proposal_doc, + proposal_form_template_doc, }; mod common; @@ -41,7 +42,12 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = category_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_doc(&template, ¶meters, provider) } diff --git a/rust/signed_doc/tests/proposal_comment.rs b/rust/signed_doc/tests/proposal_comment.rs index ea0e0ba24f2..d20994f6ebc 100644 --- a/rust/signed_doc/tests/proposal_comment.rs +++ b/rust/signed_doc/tests/proposal_comment.rs @@ -9,9 +9,9 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, - proposal_comment_doc, proposal_comment_form_template_doc, proposal_doc, - proposal_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, + category_parameters_form_template_doc, create_dummy_key_pair, proposal_comment_doc, + proposal_comment_form_template_doc, proposal_doc, proposal_form_template_doc, }; mod common; @@ -46,7 +46,12 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = category_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_comment_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; diff --git a/rust/signed_doc/tests/proposal_comment_form_template.rs b/rust/signed_doc/tests/proposal_comment_form_template.rs index 6b4a65140a3..4796cd7c92e 100644 --- a/rust/signed_doc/tests/proposal_comment_form_template.rs +++ b/rust/signed_doc/tests/proposal_comment_form_template.rs @@ -8,7 +8,8 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, + campaign_parameters_form_template_doc, category_parameters_doc, + category_parameters_form_template_doc, create_dummy_key_pair, proposal_comment_form_template_doc, }; @@ -38,7 +39,12 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = category_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_comment_form_template_doc(¶meters, provider) } => true @@ -47,7 +53,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -73,7 +80,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -99,7 +107,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; diff --git a/rust/signed_doc/tests/proposal_form_template.rs b/rust/signed_doc/tests/proposal_form_template.rs index b58c385069d..24277d0fc40 100644 --- a/rust/signed_doc/tests/proposal_form_template.rs +++ b/rust/signed_doc/tests/proposal_form_template.rs @@ -8,8 +8,8 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, - proposal_form_template_doc, + campaign_parameters_form_template_doc, category_parameters_doc, + category_parameters_form_template_doc, create_dummy_key_pair, proposal_form_template_doc, }; mod common; @@ -38,7 +38,12 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = category_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_form_template_doc(¶meters, provider) } => true @@ -47,7 +52,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -73,7 +79,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; @@ -99,7 +106,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; diff --git a/rust/signed_doc/tests/proposal_submission_action.rs b/rust/signed_doc/tests/proposal_submission_action.rs index 3d509634c8d..87aa5fc0380 100644 --- a/rust/signed_doc/tests/proposal_submission_action.rs +++ b/rust/signed_doc/tests/proposal_submission_action.rs @@ -9,8 +9,9 @@ use test_case::test_case; use crate::common::{ brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, - campaign_parameters_form_template_doc, category_parameters_doc, create_dummy_key_pair, - proposal_doc, proposal_form_template_doc, proposal_submission_action_doc, + campaign_parameters_form_template_doc, category_parameters_doc, + category_parameters_form_template_doc, create_dummy_key_pair, proposal_doc, + proposal_form_template_doc, proposal_submission_action_doc, }; mod common; @@ -43,7 +44,12 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = category_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; proposal_submission_action_doc(&proposal, ¶meters, provider) @@ -54,7 +60,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -87,7 +94,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -119,7 +127,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -151,7 +160,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); @@ -184,7 +194,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); let (sk, _, kid) = create_dummy_key_pair(RoleId::Proposer).inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; let doc = Builder::new() @@ -212,7 +223,8 @@ mod common; )] #[test_case( |provider| { - let parameters = category_parameters_doc().inspect(|v| provider.add_document(None, v).unwrap())?; + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let template = proposal_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let proposal = proposal_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; let id = UuidV7::new(); From 1efbf4c3309efc1602e744f66696387053d54538 Mon Sep 17 00:00:00 2001 From: Mr-Leshiy Date: Wed, 24 Sep 2025 21:27:56 +0400 Subject: [PATCH 15/15] add category_parameters tests --- rust/signed_doc/tests/category_parameters.rs | 207 +++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 rust/signed_doc/tests/category_parameters.rs diff --git a/rust/signed_doc/tests/category_parameters.rs b/rust/signed_doc/tests/category_parameters.rs new file mode 100644 index 00000000000..634af06f090 --- /dev/null +++ b/rust/signed_doc/tests/category_parameters.rs @@ -0,0 +1,207 @@ +//! Integration test for category parameters document validation part. +//! + +use catalyst_signed_doc::{providers::tests::TestCatalystProvider, *}; +use catalyst_types::catalyst_id::role_index::RoleId; +use ed25519_dalek::ed25519::signature::Signer; +use test_case::test_case; + +use crate::common::{ + brand_parameters_doc, brand_parameters_form_template_doc, campaign_parameters_doc, + campaign_parameters_form_template_doc, category_parameters_doc, + category_parameters_form_template_doc, create_dummy_key_pair, +}; + +mod common; + +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + category_parameters_doc(&template, ¶meters, provider) + } + => true + ; + "valid document" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::Role0) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "wrong role" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .empty_content()? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "empty content" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => true + ; + "missing 'content-encoding' (optional)" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS.clone(), + "parameters": { + "id": parameters.doc_id()?, + "ver": parameters.doc_ver()?, + } + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'template'" +)] +#[test_case( + |provider| { + let template = brand_parameters_form_template_doc(provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = brand_parameters_doc(&template, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = campaign_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let parameters = campaign_parameters_doc(&template, ¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let template = category_parameters_form_template_doc(¶meters, provider).inspect(|v| provider.add_document(None, v).unwrap())?; + let id = UuidV7::new(); + let (sk, _, kid) = create_dummy_key_pair(RoleId::BrandAdmin) + .inspect(|(_, pk, kid)| provider.add_pk(kid.clone(), *pk))?; + Builder::new() + .with_json_metadata(serde_json::json!({ + "content-type": ContentType::Json, + "content-encoding": ContentEncoding::Brotli, + "id": id, + "ver": id, + "type": doc_types::CATEGORY_PARAMETERS.clone(), + "template": { + "id": template.doc_id()?, + "ver": template.doc_ver()?, + }, + }))? + .with_json_content(&serde_json::json!({}))? + .add_signature(|m| sk.sign(&m).to_vec(), kid)? + .build() + } + => false + ; + "missing 'parameters'" +)] +#[tokio::test] +#[allow(clippy::unwrap_used)] +async fn test_category_parameters_doc( + doc_gen: impl FnOnce(&mut TestCatalystProvider) -> anyhow::Result +) -> bool { + let mut provider = TestCatalystProvider::default(); + + let doc = doc_gen(&mut provider).unwrap(); + assert_eq!( + *doc.doc_type().unwrap(), + doc_types::CATEGORY_PARAMETERS.clone() + ); + + let is_valid = validator::validate(&doc, &provider).await.unwrap(); + assert_eq!(is_valid, !doc.problem_report().is_problematic()); + println!("{:?}", doc.problem_report()); + is_valid +}