|
|
@@ -190,4 +190,93 @@ mod tests {
|
|
|
}
|
|
|
tx.commit().await.expect("commit");
|
|
|
}
|
|
|
+
|
|
|
+ #[tokio::test]
|
|
|
+ async fn test_get_proofs_by_ys() {
|
|
|
+ use cdk_common::common::ProofInfo;
|
|
|
+ use cdk_common::mint_url::MintUrl;
|
|
|
+ use cdk_common::nuts::{CurrencyUnit, Id, Proof, SecretKey};
|
|
|
+ use cdk_common::Amount;
|
|
|
+
|
|
|
+ // Create a temporary database
|
|
|
+ let path = std::env::temp_dir().to_path_buf().join(format!(
|
|
|
+ "cdk-test-proofs-by-ys-{}.sqlite",
|
|
|
+ uuid::Uuid::new_v4()
|
|
|
+ ));
|
|
|
+
|
|
|
+ #[cfg(feature = "sqlcipher")]
|
|
|
+ let db = WalletSqliteDatabase::new((path, "password".to_string()))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
+
|
|
|
+ #[cfg(not(feature = "sqlcipher"))]
|
|
|
+ let db = WalletSqliteDatabase::new(path).await.unwrap();
|
|
|
+
|
|
|
+ // Create multiple proofs
|
|
|
+ let keyset_id = Id::from_str("00deadbeef123456").unwrap();
|
|
|
+ let mint_url = MintUrl::from_str("https://example.com").unwrap();
|
|
|
+
|
|
|
+ let mut proof_infos = vec![];
|
|
|
+ let mut expected_ys = vec![];
|
|
|
+
|
|
|
+ // Generate valid public keys using SecretKey
|
|
|
+ for _i in 0..5 {
|
|
|
+ let secret = Secret::generate();
|
|
|
+
|
|
|
+ // Generate a valid public key from a secret key
|
|
|
+ let secret_key = SecretKey::generate();
|
|
|
+ let c = secret_key.public_key();
|
|
|
+
|
|
|
+ let proof = Proof::new(Amount::from(64), keyset_id, secret, c);
|
|
|
+
|
|
|
+ let proof_info =
|
|
|
+ ProofInfo::new(proof, mint_url.clone(), State::Unspent, CurrencyUnit::Sat).unwrap();
|
|
|
+
|
|
|
+ expected_ys.push(proof_info.y);
|
|
|
+ proof_infos.push(proof_info);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Store all proofs in the database
|
|
|
+ db.update_proofs(proof_infos.clone(), vec![]).await.unwrap();
|
|
|
+
|
|
|
+ // Test 1: Retrieve all proofs by their Y values
|
|
|
+ let retrieved_proofs = db.get_proofs_by_ys(expected_ys.clone()).await.unwrap();
|
|
|
+
|
|
|
+ assert_eq!(retrieved_proofs.len(), 5);
|
|
|
+ for retrieved_proof in &retrieved_proofs {
|
|
|
+ assert!(expected_ys.contains(&retrieved_proof.y));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Test 2: Retrieve subset of proofs (first 3)
|
|
|
+ let subset_ys = expected_ys[0..3].to_vec();
|
|
|
+ let subset_proofs = db.get_proofs_by_ys(subset_ys.clone()).await.unwrap();
|
|
|
+
|
|
|
+ assert_eq!(subset_proofs.len(), 3);
|
|
|
+ for retrieved_proof in &subset_proofs {
|
|
|
+ assert!(subset_ys.contains(&retrieved_proof.y));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Test 3: Retrieve with non-existent Y values
|
|
|
+ let non_existent_secret_key = SecretKey::generate();
|
|
|
+ let non_existent_y = non_existent_secret_key.public_key();
|
|
|
+ let mixed_ys = vec![expected_ys[0], non_existent_y, expected_ys[1]];
|
|
|
+ let mixed_proofs = db.get_proofs_by_ys(mixed_ys).await.unwrap();
|
|
|
+
|
|
|
+ // Should only return the 2 that exist
|
|
|
+ assert_eq!(mixed_proofs.len(), 2);
|
|
|
+
|
|
|
+ // Test 4: Empty input returns empty result
|
|
|
+ let empty_result = db.get_proofs_by_ys(vec![]).await.unwrap();
|
|
|
+ assert_eq!(empty_result.len(), 0);
|
|
|
+
|
|
|
+ // Test 5: Verify retrieved proof data matches original
|
|
|
+ let single_y = vec![expected_ys[2]];
|
|
|
+ let single_proof = db.get_proofs_by_ys(single_y).await.unwrap();
|
|
|
+
|
|
|
+ assert_eq!(single_proof.len(), 1);
|
|
|
+ assert_eq!(single_proof[0].y, proof_infos[2].y);
|
|
|
+ assert_eq!(single_proof[0].proof.amount, proof_infos[2].proof.amount);
|
|
|
+ assert_eq!(single_proof[0].mint_url, proof_infos[2].mint_url);
|
|
|
+ assert_eq!(single_proof[0].state, proof_infos[2].state);
|
|
|
+ }
|
|
|
}
|