Add RoleDefinition tests
This commit is contained in:
parent
3f633cf594
commit
4809459da5
245
src/pcd.rs
245
src/pcd.rs
@ -570,4 +570,249 @@ mod tests {
|
|||||||
let result = validation_rule.satisfy_min_sig_member(&member, new_state_hash, &proofs);
|
let result = validation_rule.satisfy_min_sig_member(&member, new_state_hash, &proofs);
|
||||||
assert!(result.is_ok()); // Example check - make more meaningful assertions based on real Proof and Member implementations
|
assert!(result.is_ok()); // Example check - make more meaningful assertions based on real Proof and Member implementations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_all_rules_satisfied() {
|
||||||
|
let alice_wallet = create_alice_wallet();
|
||||||
|
let bob_wallet = create_bob_wallet();
|
||||||
|
|
||||||
|
let members = vec![
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
alice_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
bob_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let fields = vec!["field1".to_string(), "field2".to_string()];
|
||||||
|
let validation_rule1 = ValidationRule::new(1.0, vec![fields[0].clone()], 0.5).unwrap();
|
||||||
|
let validation_rule2 = ValidationRule::new(1.0, vec![fields[1].clone()], 0.5).unwrap();
|
||||||
|
|
||||||
|
let rules = vec![validation_rule1, validation_rule2];
|
||||||
|
|
||||||
|
// 2 rules, to modify each field, all members must agree
|
||||||
|
let role_def = RoleDefinition {
|
||||||
|
members: members.clone(),
|
||||||
|
validation_rules: rules.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let previous_state = json!({ "field1": "old_value1", "field2": "old_value2" });
|
||||||
|
let new_state = json!({ "field1": "new_value1", "field2": "new_value2" });
|
||||||
|
|
||||||
|
let new_state_hash = AnkPcdHash::from_value(&new_state);
|
||||||
|
|
||||||
|
let validation_hash = AnkValidationYesHash::from_commitment(new_state_hash);
|
||||||
|
// let validation_hash = AnkValidationNoHash::from_commitment(new_state_hash);
|
||||||
|
|
||||||
|
let alice_spend_key: SecretKey = alice_wallet
|
||||||
|
.get_client()
|
||||||
|
.get_spend_key()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
|
let bob_spend_key: SecretKey = bob_wallet.get_client().get_spend_key().try_into().unwrap();
|
||||||
|
|
||||||
|
let alice_proof = Proof::new(AnkHash::ValidationYes(validation_hash), alice_spend_key);
|
||||||
|
let bob_proof = Proof::new(AnkHash::ValidationYes(validation_hash), bob_spend_key);
|
||||||
|
|
||||||
|
let proofs = vec![alice_proof, bob_proof];
|
||||||
|
|
||||||
|
assert!(role_def.is_satisfied(&new_state, &previous_state, &proofs));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_no_rule_satisfied() {
|
||||||
|
let alice_wallet = create_alice_wallet();
|
||||||
|
let bob_wallet = create_bob_wallet();
|
||||||
|
|
||||||
|
let members = vec![
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
alice_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
bob_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let fields = vec!["field1".to_string(), "field2".to_string()];
|
||||||
|
let validation_rule1 = ValidationRule::new(1.0, vec![fields[0].clone()], 0.5).unwrap();
|
||||||
|
let validation_rule2 = ValidationRule::new(1.0, vec![fields[1].clone()], 0.5).unwrap();
|
||||||
|
|
||||||
|
let rules = vec![validation_rule1, validation_rule2];
|
||||||
|
|
||||||
|
// 2 rules, to modify each field, all members must agree
|
||||||
|
let role_def = RoleDefinition {
|
||||||
|
members: members.clone(),
|
||||||
|
validation_rules: rules.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let previous_state = json!({ "field1": "old_value1", "field2": "old_value2" });
|
||||||
|
let new_state = json!({ "field1": "new_value1", "field2": "new_value2" });
|
||||||
|
|
||||||
|
let new_state_hash = AnkPcdHash::from_value(&new_state);
|
||||||
|
|
||||||
|
// let validation_hash1 = AnkValidationYesHash::from_commitment(new_state_hash);
|
||||||
|
let validation_hash = AnkValidationNoHash::from_commitment(new_state_hash);
|
||||||
|
|
||||||
|
let alice_spend_key: SecretKey = alice_wallet
|
||||||
|
.get_client()
|
||||||
|
.get_spend_key()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
|
let bob_spend_key: SecretKey = bob_wallet.get_client().get_spend_key().try_into().unwrap();
|
||||||
|
|
||||||
|
let alice_proof = Proof::new(AnkHash::ValidationNo(validation_hash), alice_spend_key);
|
||||||
|
let bob_proof = Proof::new(AnkHash::ValidationNo(validation_hash), bob_spend_key);
|
||||||
|
|
||||||
|
let proofs = vec![alice_proof, bob_proof];
|
||||||
|
|
||||||
|
assert!(!role_def.is_satisfied(&new_state, &previous_state, &proofs));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_partial_modification_satisfied() {
|
||||||
|
let alice_wallet = create_alice_wallet();
|
||||||
|
let bob_wallet = create_bob_wallet();
|
||||||
|
|
||||||
|
let members = vec![
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
alice_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
bob_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let fields = vec!["field1".to_string(), "field2".to_string()];
|
||||||
|
let validation_rule1 = ValidationRule::new(1.0, vec![fields[0].clone()], 0.5).unwrap();
|
||||||
|
let validation_rule2 = ValidationRule::new(1.0, vec![fields[1].clone()], 0.5).unwrap();
|
||||||
|
|
||||||
|
let rules = vec![validation_rule1, validation_rule2];
|
||||||
|
|
||||||
|
// 2 rules, to modify each field, all members must agree
|
||||||
|
let role_def = RoleDefinition {
|
||||||
|
members: members.clone(),
|
||||||
|
validation_rules: rules.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let previous_state = json!({ "field1": "old_value1", "field2": "old_value2" });
|
||||||
|
let new_state = json!({ "field1": "old_value1", "field2": "new_value2" });
|
||||||
|
|
||||||
|
let new_state_hash = AnkPcdHash::from_value(&new_state);
|
||||||
|
|
||||||
|
let validation_hash = AnkValidationYesHash::from_commitment(new_state_hash);
|
||||||
|
// let validation_hash = AnkValidationNoHash::from_commitment(new_state_hash);
|
||||||
|
|
||||||
|
let alice_spend_key: SecretKey = alice_wallet
|
||||||
|
.get_client()
|
||||||
|
.get_spend_key()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
|
let bob_spend_key: SecretKey = bob_wallet.get_client().get_spend_key().try_into().unwrap();
|
||||||
|
|
||||||
|
let alice_proof = Proof::new(AnkHash::ValidationYes(validation_hash), alice_spend_key);
|
||||||
|
let bob_proof = Proof::new(AnkHash::ValidationYes(validation_hash), bob_spend_key);
|
||||||
|
|
||||||
|
let proofs = vec![alice_proof, bob_proof];
|
||||||
|
|
||||||
|
assert!(role_def.is_satisfied(&new_state, &previous_state, &proofs));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_partial_modification_not_satisfied() {
|
||||||
|
let alice_wallet = create_alice_wallet();
|
||||||
|
let bob_wallet = create_bob_wallet();
|
||||||
|
|
||||||
|
let members = vec![
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
alice_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
Member::new(vec![SilentPaymentAddress::try_from(
|
||||||
|
bob_wallet.get_client().get_receiving_address(),
|
||||||
|
)
|
||||||
|
.unwrap()])
|
||||||
|
.unwrap(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let fields = vec!["field1".to_string(), "field2".to_string()];
|
||||||
|
let validation_rule1 = ValidationRule::new(1.0, vec![fields[0].clone()], 0.5).unwrap();
|
||||||
|
let validation_rule2 = ValidationRule::new(1.0, vec![fields[1].clone()], 0.5).unwrap();
|
||||||
|
|
||||||
|
let rules = vec![validation_rule1, validation_rule2];
|
||||||
|
|
||||||
|
// 2 rules, to modify each field, all members must agree
|
||||||
|
let role_def = RoleDefinition {
|
||||||
|
members: members.clone(),
|
||||||
|
validation_rules: rules.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let previous_state = json!({ "field1": "old_value1", "field2": "old_value2" });
|
||||||
|
let new_state = json!({ "field1": "old_value1", "field2": "new_value2" });
|
||||||
|
|
||||||
|
let new_state_hash = AnkPcdHash::from_value(&new_state);
|
||||||
|
|
||||||
|
let validation_hash = AnkValidationYesHash::from_commitment(new_state_hash);
|
||||||
|
// let validation_hash = AnkValidationNoHash::from_commitment(new_state_hash);
|
||||||
|
|
||||||
|
let alice_spend_key: SecretKey = alice_wallet
|
||||||
|
.get_client()
|
||||||
|
.get_spend_key()
|
||||||
|
.try_into()
|
||||||
|
.unwrap();
|
||||||
|
// let bob_spend_key: SecretKey = bob_wallet.get_client().get_spend_key().try_into().unwrap();
|
||||||
|
|
||||||
|
let alice_proof = Proof::new(AnkHash::ValidationYes(validation_hash), alice_spend_key);
|
||||||
|
// let bob_proof = Proof::new(AnkHash::ValidationYes(validation_hash), bob_spend_key);
|
||||||
|
|
||||||
|
let proofs = vec![alice_proof];
|
||||||
|
|
||||||
|
assert!(!role_def.is_satisfied(&new_state, &previous_state, &proofs));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_applicable_rules() {
|
||||||
|
let fields = vec!["field1".to_string(), "field2".to_string()];
|
||||||
|
let validation_rule1 = ValidationRule::new(1.0, vec![fields[0].clone()], 0.5).unwrap();
|
||||||
|
let validation_rule2 = ValidationRule::new(1.0, vec![fields[1].clone()], 0.5).unwrap();
|
||||||
|
|
||||||
|
let rules = vec![validation_rule1.clone(), validation_rule2];
|
||||||
|
let role_def = RoleDefinition {
|
||||||
|
members: vec![],
|
||||||
|
validation_rules: rules,
|
||||||
|
};
|
||||||
|
|
||||||
|
let applicable_rules = role_def.get_applicable_rules("field1");
|
||||||
|
assert_eq!(applicable_rules.len(), 1);
|
||||||
|
assert_eq!(*applicable_rules[0], validation_rule1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_applicable_rules_no_rules() {
|
||||||
|
let fields = vec!["field1".to_string(), "field2".to_string()];
|
||||||
|
let validation_rule1 = ValidationRule::new(1.0, vec![fields[0].clone()], 0.5).unwrap();
|
||||||
|
let validation_rule2 = ValidationRule::new(1.0, vec![fields[1].clone()], 0.5).unwrap();
|
||||||
|
|
||||||
|
let rules = vec![validation_rule1.clone(), validation_rule2];
|
||||||
|
let role_def = RoleDefinition {
|
||||||
|
members: vec![],
|
||||||
|
validation_rules: rules,
|
||||||
|
};
|
||||||
|
|
||||||
|
let applicable_rules = role_def.get_applicable_rules("nonexistent_field");
|
||||||
|
assert_eq!(applicable_rules.len(), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user