tests: Add browser WASM tests for evm_client

This commit is contained in:
2025-05-16 02:06:41 +03:00
parent 73233ec69b
commit 03533f9216
12 changed files with 542 additions and 10 deletions

View File

@@ -0,0 +1,69 @@
use evm_client::{EvmClient, EvmProvider, Signer};
// Dummy signer that returns a known Ethereum address (Vitalik's address)
struct DummySigner;
#[cfg(not(target_arch = "wasm32"))]
#[async_trait::async_trait]
impl Signer for DummySigner {
async fn sign(&self, _message: &[u8]) -> Result<Vec<u8>, evm_client::EvmError> {
Err(evm_client::EvmError::Vault("sign not implemented".to_string()))
}
fn address(&self) -> String {
// Vitalik's main address (has funds on mainnet)
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045".to_string()
}
}
#[cfg(not(target_arch = "wasm32"))]
#[tokio::test]
async fn test_get_balance_vitalik() {
// Use a public Ethereum mainnet RPC
let provider = EvmProvider::Http {
name: "mainnet".to_string(),
url: "https://eth.drpc.org".to_string(),
chain_id: 1,
};
let signer = DummySigner;
let mut client = EvmClient::new(signer);
client.add_provider("mainnet".to_string(), provider);
client.set_current("mainnet").unwrap();
let balance = client.get_balance("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045").await.unwrap();
assert!(balance > 0, "Vitalik's balance should be greater than zero");
}
#[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*;
#[cfg(target_arch = "wasm32")]
#[async_trait::async_trait(?Send)]
impl Signer for DummySigner {
async fn sign(&self, _message: &[u8]) -> Result<Vec<u8>, evm_client::EvmError> {
Err(evm_client::EvmError::Vault("sign not implemented".to_string()))
}
fn address(&self) -> String {
// Vitalik's main address (has funds on mainnet)
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045".to_string()
}
}
#[cfg(target_arch = "wasm32")]
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen_test(async)]
async fn test_get_balance_vitalik_browser() {
let provider = EvmProvider::Http {
name: "mainnet".to_string(),
url: "https://eth.drpc.org".to_string(),
chain_id: 1,
};
let signer = DummySigner;
let mut client = EvmClient::new(signer);
client.add_provider("mainnet".to_string(), provider);
client.set_current("mainnet").unwrap();
let balance = client.get_balance("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045").await;
assert!(balance.is_ok(), "Balance query should succeed in browser");
let balance = balance.unwrap();
assert!(balance > 0u128, "Vitalik's balance should be greater than zero");
}

View File

@@ -0,0 +1,59 @@
#![cfg(not(target_arch = "wasm32"))]
// tests/evm_client.rs
use evm_client::{EvmClient, EvmProvider, Signer, EvmError};
struct DummySigner;
#[cfg(target_arch = "wasm32")]
#[async_trait::async_trait(?Send)]
impl Signer for DummySigner {
async fn sign(&self, _message: &[u8]) -> Result<Vec<u8>, EvmError> {
Ok(vec![0u8; 65]) // dummy signature
}
fn address(&self) -> String {
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045".to_string()
}
}
#[cfg(not(target_arch = "wasm32"))]
#[async_trait::async_trait]
impl Signer for DummySigner {
async fn sign(&self, _message: &[u8]) -> Result<Vec<u8>, EvmError> {
Ok(vec![0u8; 65]) // dummy signature
}
fn address(&self) -> String {
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045".to_string()
}
}
#[tokio::test]
async fn test_transfer_rlp_encoding() {
let provider = EvmProvider::Http {
name: "mainnet".to_string(),
url: "https://rpc.ankr.com/eth".to_string(),
chain_id: 1,
};
let signer = DummySigner;
let mut client = EvmClient::new(signer);
client.add_provider("mainnet".to_string(), provider);
client.set_current("mainnet").unwrap();
// Use a dummy transfer (will fail to send, but will test RLP logic)
let result = client.transfer("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 1u128).await;
// Should fail due to dummy signature, but should not panic or error at RLP encoding
assert!(matches!(result, Err(EvmError::Rpc(_)) | Err(EvmError::Vault(_))));
}
#[tokio::test]
async fn test_transfer_invalid_address() {
let provider = EvmProvider::Http {
name: "mainnet".to_string(),
url: "https://rpc.ankr.com/eth".to_string(),
chain_id: 1,
};
let signer = DummySigner;
let mut client = EvmClient::new(signer);
client.add_provider("mainnet".to_string(), provider);
client.set_current("mainnet").unwrap();
let result = client.transfer("invalid_address", 1u128).await;
assert!(matches!(result, Err(EvmError::Rpc(_))));
}

50
evm_client/tests/wasm.rs Normal file
View File

@@ -0,0 +1,50 @@
#![cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*;
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
use evm_client::{EvmClient, EvmProvider, Signer, EvmError};
struct DummySigner;
#[async_trait::async_trait(?Send)]
impl Signer for DummySigner {
async fn sign(&self, _message: &[u8]) -> Result<Vec<u8>, EvmError> {
Ok(vec![0u8; 65]) // dummy signature
}
fn address(&self) -> String {
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045".to_string()
}
}
#[wasm_bindgen_test(async)]
async fn test_get_balance_vitalik_browser() {
let provider = EvmProvider::Http {
name: "mainnet".to_string(),
url: "https://eth.drpc.org".to_string(),
chain_id: 1,
};
let signer = DummySigner;
let mut client = EvmClient::new(signer);
client.add_provider("mainnet".to_string(), provider);
client.set_current("mainnet").unwrap();
let balance = client.get_balance("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045").await;
assert!(balance.is_ok(), "Balance query should succeed in browser");
let balance = balance.unwrap();
assert!(balance > 0u128, "Vitalik's balance should be greater than zero");
}
#[wasm_bindgen_test(async)]
async fn test_transfer_rlp_encoding_browser() {
let provider = EvmProvider::Http {
name: "mainnet".to_string(),
url: "https://eth.drpc.org".to_string(),
chain_id: 1,
};
let signer = DummySigner;
let mut client = EvmClient::new(signer);
client.add_provider("mainnet".to_string(), provider);
client.set_current("mainnet").unwrap();
let result = client.transfer("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", 1u128).await;
assert!(matches!(result, Err(EvmError::Rpc(_)) | Err(EvmError::Vault(_))));
}