use agentic_payments::prelude::*;
use agentic_payments::error::{CryptoError, ConsensusError};
#[test]
fn test_identity_generation() {
let identity = AgentIdentity::generate().expect("Failed to generate identity");
assert!(identity.did().starts_with("did:ap2:"));
assert_eq!(identity.public_key_base64().len(), 44); }
#[test]
fn test_signing_and_verification() {
let identity = AgentIdentity::generate().expect("Failed to generate identity");
let message = b"test message for deep validation";
let signature = identity.sign(message).expect("Failed to sign");
assert_eq!(signature.to_bytes().len(), 64);
let is_valid = identity.verify(message, &signature).expect("Failed to verify");
assert!(is_valid, "Valid signature should verify");
let wrong_message = b"different message";
let is_valid_wrong = identity.verify(wrong_message, &signature).expect("Failed to verify");
assert!(!is_valid_wrong, "Wrong message should not verify");
}
#[test]
fn test_keypair_conversion() {
let identity = AgentIdentity::generate().expect("Failed to generate identity");
let keypair = identity.to_keypair().expect("Failed to convert to keypair");
let message = b"keypair test";
let signature = keypair.sign(message).expect("Failed to sign with keypair");
let is_valid = keypair.verify(message, &signature).expect("Failed to verify with keypair");
assert!(is_valid, "Keypair signature should verify");
}
#[tokio::test]
async fn test_signature_manager() {
let manager = SignatureManager::new();
let identity = AgentIdentity::generate().expect("Failed to generate identity");
let message = b"signature manager test";
let signature = identity.sign(message).expect("Failed to sign");
let items = vec![
(identity.verifying_key().clone(), message.to_vec(), signature.clone()),
];
let results = manager.verify_many(items).await.expect("Verification failed");
assert_eq!(results.len(), 1);
assert!(results[0].is_valid);
let stats = manager.cache_stats().await;
assert!(stats.total_verifications >= 1, "Should have verifications");
}
#[test]
fn test_batch_verification() {
let batch = BatchVerification::new();
let identity1 = AgentIdentity::generate().expect("Failed to generate identity 1");
let identity2 = AgentIdentity::generate().expect("Failed to generate identity 2");
let msg1 = b"message 1";
let msg2 = b"message 2";
let sig1 = identity1.sign(msg1).expect("Failed to sign 1");
let sig2 = identity2.sign(msg2).expect("Failed to sign 2");
batch.add(identity1.verifying_key().clone(), msg1.to_vec(), sig1);
batch.add(identity2.verifying_key().clone(), msg2.to_vec(), sig2);
let results = batch.verify_all().expect("Batch verification failed");
assert_eq!(results.total, 2);
assert_eq!(results.valid, 2);
assert_eq!(results.invalid, 0);
}
#[test]
fn test_verifiable_credential_creation() {
let issuer = AgentIdentity::generate().expect("Failed to generate issuer");
let subject = AgentIdentity::generate().expect("Failed to generate subject");
let credential = VerifiableCredential::builder()
.issuer(issuer.did())
.subject(subject.did())
.credential_type(CredentialType::PaymentAuthorization)
.credential_subject(serde_json::json!({
"max_amount": 1000,
"currency": "USD"
}))
.build()
.expect("Failed to build credential");
assert_eq!(credential.issuer, issuer.did());
assert_eq!(credential.subject, subject.did());
}
#[test]
fn test_intent_mandate_creation() {
let user = AgentIdentity::generate().expect("Failed to generate user");
let bot = AgentIdentity::generate().expect("Failed to generate bot");
let mandate = IntentMandate::builder()
.issuer(user.did())
.subject(bot.did())
.permissions(vec!["purchase".to_string(), "compare_prices".to_string()])
.constraints(serde_json::json!({
"max_amount": 100.00,
"category": "groceries"
}))
.build()
.expect("Failed to build mandate");
assert_eq!(mandate.issuer, user.did());
assert_eq!(mandate.subject, bot.did());
assert_eq!(mandate.permissions.len(), 2);
}
#[test]
fn test_error_conversions() {
let crypto_err = CryptoError::InvalidSignature {
details: "test".to_string()
};
let _main_err: Error = crypto_err.into();
let consensus_err = ConsensusError::QuorumNotAchieved {
available: 2,
required: 3,
};
let _main_err: Error = consensus_err.into();
}