|
1 | 1 | import pytest
|
2 | 2 | from unittest.mock import (
|
| 3 | + AsyncMock, |
| 4 | + MagicMock, |
3 | 5 | patch,
|
4 | 6 | )
|
5 | 7 |
|
|
10 | 12 | from ens._normalization import (
|
11 | 13 | normalize_name_ensip15,
|
12 | 14 | )
|
| 15 | +from ens.utils import ( |
| 16 | + raw_name_to_hash, |
| 17 | +) |
13 | 18 | from web3 import (
|
14 | 19 | AsyncWeb3,
|
15 | 20 | )
|
@@ -143,6 +148,51 @@ def test_ens_methods_normalize_name(
|
143 | 148 | ens.setup_address("tester.eth", None)
|
144 | 149 |
|
145 | 150 |
|
| 151 | +def test_ens_address_lookup_when_no_coin_type(ens): |
| 152 | + """ |
| 153 | + Test that when coin_type is None, the method calls _resolve(name, "addr") |
| 154 | + and returns the expected address. |
| 155 | + """ |
| 156 | + name = "tester.eth" |
| 157 | + address = ens.w3.eth.accounts[0] |
| 158 | + |
| 159 | + with patch("ens.ENS.resolver") as mock_resolver_for_coin_types: |
| 160 | + with patch("ens.ENS._resolve") as mock_resolver: |
| 161 | + mock_resolver.return_value = address |
| 162 | + |
| 163 | + returned_address = ens.address(name) |
| 164 | + |
| 165 | + mock_resolver.assert_called_once_with(name, "addr") |
| 166 | + mock_resolver_for_coin_types.assert_not_called() |
| 167 | + assert returned_address == address |
| 168 | + |
| 169 | + |
| 170 | +def test_ens_address_lookup_with_coin_type(ens): |
| 171 | + """ |
| 172 | + Test that when coin_type is specified, it calls: |
| 173 | + 1) _validate_resolver_and_interface_id |
| 174 | + 2) resolver.caller.addr(node, coin_type) |
| 175 | + 3) returns the checksum address |
| 176 | + """ |
| 177 | + name = "tester.eth" |
| 178 | + address = ens.w3.eth.accounts[0] |
| 179 | + coin_type = 60 |
| 180 | + node = raw_name_to_hash(name) |
| 181 | + |
| 182 | + mock_resolver = MagicMock() |
| 183 | + mock_resolver.caller.addr.return_value = address |
| 184 | + |
| 185 | + with patch("ens.ENS.resolver") as resolver: |
| 186 | + resolver.return_value = mock_resolver |
| 187 | + |
| 188 | + with patch("ens.ens._validate_resolver_and_interface_id") as mock_validate: |
| 189 | + returned_address = ens.address(name, coin_type=coin_type) |
| 190 | + |
| 191 | + mock_validate.assert_called_once() |
| 192 | + mock_resolver.caller.addr.assert_called_once_with(node, coin_type) |
| 193 | + assert returned_address == address |
| 194 | + |
| 195 | + |
146 | 196 | # -- async -- #
|
147 | 197 |
|
148 | 198 |
|
@@ -268,3 +318,54 @@ async def test_async_ens_methods_normalize_name_with_ensip15(
|
268 | 318 |
|
269 | 319 | # cleanup
|
270 | 320 | await async_ens.setup_address("tester.eth", None)
|
| 321 | + |
| 322 | + |
| 323 | +@pytest.mark.asyncio |
| 324 | +async def test_async_ens_address_lookup_when_no_coin_type(async_ens): |
| 325 | + """ |
| 326 | + Test that when coin_type is None, the method calls _resolve(name, "addr") |
| 327 | + and returns the expected address. |
| 328 | + """ |
| 329 | + name = "tester.eth" |
| 330 | + accounts = await async_ens.w3.eth.accounts |
| 331 | + address = accounts[2] |
| 332 | + |
| 333 | + with patch("ens.AsyncENS.resolver") as mock_resolver_for_coin_types: |
| 334 | + with patch("ens.AsyncENS._resolve") as mock_resolver: |
| 335 | + mock_resolver.return_value = address |
| 336 | + |
| 337 | + returned_address = await async_ens.address(name) |
| 338 | + |
| 339 | + mock_resolver.assert_called_once_with(name, "addr") |
| 340 | + mock_resolver_for_coin_types.assert_not_called() |
| 341 | + assert returned_address == address |
| 342 | + |
| 343 | + |
| 344 | +@pytest.mark.asyncio |
| 345 | +async def test_async_ens_address_lookup_with_coin_type(async_ens): |
| 346 | + """ |
| 347 | + Test that when coin_type is specified, it calls: |
| 348 | + 1) _async_validate_resolver_and_interface_id |
| 349 | + 2) async resolver.caller.addr(node, coin_type) |
| 350 | + 3) returns the checksum address |
| 351 | + """ |
| 352 | + name = "tester.eth" |
| 353 | + accounts = await async_ens.w3.eth.accounts |
| 354 | + address = accounts[2] |
| 355 | + coin_type = 60 |
| 356 | + node = raw_name_to_hash(name) |
| 357 | + |
| 358 | + mock_resolver = AsyncMock() |
| 359 | + mock_resolver.caller.addr.return_value = address |
| 360 | + |
| 361 | + with patch("ens.AsyncENS.resolver") as resolver: |
| 362 | + resolver.return_value = mock_resolver |
| 363 | + |
| 364 | + with patch( |
| 365 | + "ens.async_ens._async_validate_resolver_and_interface_id" |
| 366 | + ) as mock_validate: |
| 367 | + returned_address = await async_ens.address(name, coin_type=coin_type) |
| 368 | + |
| 369 | + mock_validate.assert_called_once() |
| 370 | + mock_resolver.caller.addr.assert_called_once_with(node, coin_type) |
| 371 | + assert returned_address == address |
0 commit comments