|
4 | 4 | import pytest |
5 | 5 | from eth_account import Account |
6 | 6 |
|
| 7 | +from cdp import WalletData |
7 | 8 | from cdp.client.models.create_address_request import CreateAddressRequest |
8 | 9 | from cdp.client.models.create_wallet_request import CreateWalletRequest, CreateWalletRequestWallet |
9 | 10 | from cdp.client.models.create_wallet_webhook_request import CreateWalletWebhookRequest |
@@ -889,3 +890,85 @@ def test_wallet_import_from_mnemonic_invalid_phrase(): |
889 | 890 |
|
890 | 891 | with pytest.raises(ValueError, match="Invalid BIP-39 mnemonic seed phrase"): |
891 | 892 | Wallet.import_wallet(MnemonicSeedPhrase("invalid mnemonic phrase")) |
| 893 | + |
| 894 | +@patch("cdp.Cdp.use_server_signer", False) |
| 895 | +@patch("cdp.Cdp.api_clients") |
| 896 | +@patch("cdp.wallet.Account") |
| 897 | +def test_wallet_import_wallet_data( |
| 898 | + mock_account, |
| 899 | + mock_api_clients, |
| 900 | + wallet_factory, |
| 901 | + address_model_factory, |
| 902 | +): |
| 903 | + """Test importing a wallet from wallet data.""" |
| 904 | + wallet_data = WalletData( |
| 905 | + wallet_id="087ed3e6-3d60-4273-ae06-9310ce6c5391", |
| 906 | + seed="e0c727430053b8e4a299c8752175a48c27a6670fa204b5bdcbab08b2fd3d2278f182023dae524cb1b758dd96dac43f78850c71b988aceda27da7c12a06eb7dc5", |
| 907 | + ) |
| 908 | + first_address = "0x974EaE7AEA7D3A0226855E75762438cc8bF2bfb4" |
| 909 | + second_address = "0x4B474e2f0b3b6195FD98A7c0ad592F6dF7eD8475" |
| 910 | + first_public_key = "0x032845fca05f20c848dc2db1acc8e74965846cf78bb84e62e16da20fb1ebf9b41d" |
| 911 | + second_public_key = "0x02f1c8765ff02ac19f95bd938631219d72fc2f732d3f6b481c1ea36ae70a46d579" |
| 912 | + |
| 913 | + # Create mock address model |
| 914 | + mock_first_address = address_model_factory( |
| 915 | + address_id=first_address, |
| 916 | + public_key=first_public_key, |
| 917 | + wallet_id="new-wallet-id", |
| 918 | + network_id="base-mainnet", |
| 919 | + index=0, |
| 920 | + ) |
| 921 | + |
| 922 | + mock_second_address = address_model_factory( |
| 923 | + address_id=second_address, |
| 924 | + public_key=second_public_key, |
| 925 | + wallet_id="new-wallet-id", |
| 926 | + network_id="base-mainnet", |
| 927 | + index=1, |
| 928 | + ) |
| 929 | + |
| 930 | + # Create mock wallet model with the address model |
| 931 | + mock_wallet = wallet_factory( |
| 932 | + id="new-wallet-id", network_id="base-mainnet", default_address=mock_first_address |
| 933 | + )._model |
| 934 | + |
| 935 | + # Add debug assertions |
| 936 | + assert mock_wallet.default_address is not None |
| 937 | + assert mock_wallet.default_address.address_id == first_address |
| 938 | + assert mock_wallet.default_address.index == 0 |
| 939 | + |
| 940 | + # Mock Account.from_key to return different addresses for different calls |
| 941 | + mock_first_account = Mock(spec=Account) |
| 942 | + mock_first_account.address = second_address |
| 943 | + mock_second_account = Mock(spec=Account) |
| 944 | + mock_second_account.address = first_address |
| 945 | + mock_account.from_key = Mock(side_effect=[mock_first_account, mock_second_account]) |
| 946 | + |
| 947 | + # Mock both API calls to return the same wallet model |
| 948 | + mock_api_clients.wallets.create_wallet = Mock(return_value=mock_wallet) |
| 949 | + mock_api_clients.wallets.get_wallet = Mock(return_value=mock_wallet) |
| 950 | + mock_api_clients.addresses.create_address = Mock(return_value=mock_first_address) |
| 951 | + |
| 952 | + # Mock list_addresses call |
| 953 | + mock_address_list = Mock() |
| 954 | + # Make the API response to be out of order. |
| 955 | + mock_address_list.data = [mock_second_address, mock_first_address] |
| 956 | + mock_api_clients.addresses.list_addresses = Mock(return_value=mock_address_list) |
| 957 | + |
| 958 | + # Import wallet using data |
| 959 | + wallet = Wallet.import_wallet(wallet_data, network_id="base-mainnet") |
| 960 | + |
| 961 | + # Verify the wallet was created successfully |
| 962 | + assert isinstance(wallet, Wallet) |
| 963 | + |
| 964 | + # Verify the default address matches expected address |
| 965 | + assert wallet.default_address is not None |
| 966 | + assert wallet.default_address.address_id == first_address |
| 967 | + assert wallet.default_address._model.public_key == first_public_key |
| 968 | + addresses = wallet.addresses |
| 969 | + |
| 970 | + assert len(addresses) == 2 |
| 971 | + assert addresses[0].address_id == second_address |
| 972 | + assert addresses[0]._model.public_key == second_public_key |
| 973 | + assert addresses[1].address_id == first_address |
| 974 | + assert addresses[1]._model.public_key == first_public_key |
0 commit comments