|
1 | | -import pytest |
| 1 | +from bittensor.core.extrinsics import transfer |
2 | 2 |
|
3 | | -from bittensor.core import subtensor as subtensor_module |
4 | | -from bittensor.core.extrinsics.transfer import do_transfer |
5 | | -from bittensor.core.subtensor import Subtensor |
6 | | -from bittensor.utils.balance import Balance |
7 | 3 |
|
| 4 | +def test_transfer_extrinsic(mocker): |
| 5 | + """Verify that sync `transfer_extrinsic` method calls proper async method.""" |
| 6 | + # Preps |
| 7 | + fake_subtensor = mocker.Mock() |
| 8 | + fake_wallet = mocker.Mock() |
| 9 | + dest = "hotkey" |
| 10 | + amount = 1.1 |
| 11 | + transfer_all = True |
| 12 | + wait_for_inclusion = True |
| 13 | + wait_for_finalization = True |
| 14 | + keep_alive = False |
8 | 15 |
|
9 | | -@pytest.fixture |
10 | | -def subtensor(mocker): |
11 | | - fake_substrate = mocker.MagicMock() |
12 | | - fake_substrate.websocket.sock.getsockopt.return_value = 0 |
13 | | - mocker.patch.object( |
14 | | - subtensor_module, "SubstrateInterface", return_value=fake_substrate |
15 | | - ) |
16 | | - return Subtensor() |
17 | | - |
18 | | - |
19 | | -def test_do_transfer_is_success_true(subtensor, mocker): |
20 | | - """Successful do_transfer call.""" |
21 | | - # Prep |
22 | | - fake_wallet = mocker.MagicMock() |
23 | | - fake_dest = "SS58PUBLICKEY" |
24 | | - fake_transfer_balance = Balance(1) |
25 | | - fake_wait_for_inclusion = True |
26 | | - fake_wait_for_finalization = True |
27 | | - |
28 | | - subtensor.substrate.submit_extrinsic.return_value.is_success = True |
29 | | - |
30 | | - # Call |
31 | | - result = do_transfer( |
32 | | - subtensor, |
33 | | - fake_wallet, |
34 | | - fake_dest, |
35 | | - fake_transfer_balance, |
36 | | - fake_wait_for_inclusion, |
37 | | - fake_wait_for_finalization, |
38 | | - ) |
39 | | - |
40 | | - # Asserts |
41 | | - subtensor.substrate.compose_call.assert_called_once_with( |
42 | | - call_module="Balances", |
43 | | - call_function="transfer_allow_death", |
44 | | - call_params={"dest": fake_dest, "value": fake_transfer_balance.rao}, |
45 | | - ) |
46 | | - subtensor.substrate.create_signed_extrinsic.assert_called_once_with( |
47 | | - call=subtensor.substrate.compose_call.return_value, keypair=fake_wallet.coldkey |
48 | | - ) |
49 | | - subtensor.substrate.submit_extrinsic.assert_called_once_with( |
50 | | - subtensor.substrate.create_signed_extrinsic.return_value, |
51 | | - wait_for_inclusion=fake_wait_for_inclusion, |
52 | | - wait_for_finalization=fake_wait_for_finalization, |
53 | | - ) |
54 | | - subtensor.substrate.submit_extrinsic.return_value.process_events.assert_called_once() |
55 | | - assert result == ( |
56 | | - True, |
57 | | - subtensor.substrate.submit_extrinsic.return_value.block_hash, |
58 | | - None, |
59 | | - ) |
60 | | - |
61 | | - |
62 | | -def test_do_transfer_is_success_false(subtensor, mocker): |
63 | | - """Successful do_transfer call.""" |
64 | | - # Prep |
65 | | - fake_wallet = mocker.MagicMock() |
66 | | - fake_dest = "SS58PUBLICKEY" |
67 | | - fake_transfer_balance = Balance(1) |
68 | | - fake_wait_for_inclusion = True |
69 | | - fake_wait_for_finalization = True |
70 | | - |
71 | | - subtensor.substrate.submit_extrinsic.return_value.is_success = False |
72 | | - |
73 | | - mocked_format_error_message = mocker.MagicMock() |
74 | | - subtensor_module.format_error_message = mocked_format_error_message |
75 | | - |
76 | | - # Call |
77 | | - result = do_transfer( |
78 | | - subtensor, |
79 | | - fake_wallet, |
80 | | - fake_dest, |
81 | | - fake_transfer_balance, |
82 | | - fake_wait_for_inclusion, |
83 | | - fake_wait_for_finalization, |
84 | | - ) |
85 | | - |
86 | | - # Asserts |
87 | | - subtensor.substrate.compose_call.assert_called_once_with( |
88 | | - call_module="Balances", |
89 | | - call_function="transfer_allow_death", |
90 | | - call_params={"dest": fake_dest, "value": fake_transfer_balance.rao}, |
91 | | - ) |
92 | | - subtensor.substrate.create_signed_extrinsic.assert_called_once_with( |
93 | | - call=subtensor.substrate.compose_call.return_value, keypair=fake_wallet.coldkey |
94 | | - ) |
95 | | - subtensor.substrate.submit_extrinsic.assert_called_once_with( |
96 | | - subtensor.substrate.create_signed_extrinsic.return_value, |
97 | | - wait_for_inclusion=fake_wait_for_inclusion, |
98 | | - wait_for_finalization=fake_wait_for_finalization, |
99 | | - ) |
100 | | - subtensor.substrate.submit_extrinsic.return_value.process_events.assert_called_once() |
101 | | - |
102 | | - assert result == ( |
103 | | - False, |
104 | | - None, |
105 | | - subtensor.substrate.submit_extrinsic.return_value.error_message, |
106 | | - ) |
107 | | - |
108 | | - |
109 | | -def test_do_transfer_no_waits(subtensor, mocker): |
110 | | - """Successful do_transfer call.""" |
111 | | - # Prep |
112 | | - fake_wallet = mocker.MagicMock() |
113 | | - fake_dest = "SS58PUBLICKEY" |
114 | | - fake_transfer_balance = Balance(1) |
115 | | - fake_wait_for_inclusion = False |
116 | | - fake_wait_for_finalization = False |
| 16 | + mocked_execute_coroutine = mocker.patch.object(transfer, "execute_coroutine") |
| 17 | + mocked_transfer_extrinsic = mocker.Mock() |
| 18 | + transfer.async_transfer_extrinsic = mocked_transfer_extrinsic |
117 | 19 |
|
118 | 20 | # Call |
119 | | - result = do_transfer( |
120 | | - subtensor, |
121 | | - fake_wallet, |
122 | | - fake_dest, |
123 | | - fake_transfer_balance, |
124 | | - fake_wait_for_inclusion, |
125 | | - fake_wait_for_finalization, |
| 21 | + result = transfer.transfer_extrinsic( |
| 22 | + subtensor=fake_subtensor, |
| 23 | + wallet=fake_wallet, |
| 24 | + dest=dest, |
| 25 | + amount=amount, |
| 26 | + transfer_all=transfer_all, |
| 27 | + wait_for_inclusion=wait_for_inclusion, |
| 28 | + wait_for_finalization=wait_for_finalization, |
| 29 | + keep_alive=keep_alive, |
126 | 30 | ) |
127 | 31 |
|
128 | 32 | # Asserts |
129 | | - subtensor.substrate.compose_call.assert_called_once_with( |
130 | | - call_module="Balances", |
131 | | - call_function="transfer_allow_death", |
132 | | - call_params={"dest": fake_dest, "value": fake_transfer_balance.rao}, |
133 | | - ) |
134 | | - subtensor.substrate.create_signed_extrinsic.assert_called_once_with( |
135 | | - call=subtensor.substrate.compose_call.return_value, keypair=fake_wallet.coldkey |
136 | | - ) |
137 | | - subtensor.substrate.submit_extrinsic.assert_called_once_with( |
138 | | - subtensor.substrate.create_signed_extrinsic.return_value, |
139 | | - wait_for_inclusion=fake_wait_for_inclusion, |
140 | | - wait_for_finalization=fake_wait_for_finalization, |
141 | | - ) |
142 | | - assert result == (True, None, None) |
| 33 | + mocked_execute_coroutine.assert_called_once_with( |
| 34 | + coroutine=mocked_transfer_extrinsic.return_value, |
| 35 | + event_loop=fake_subtensor.event_loop, |
| 36 | + ) |
| 37 | + mocked_transfer_extrinsic.assert_called_once_with( |
| 38 | + subtensor=fake_subtensor.async_subtensor, |
| 39 | + wallet=fake_wallet, |
| 40 | + destination=dest, |
| 41 | + amount=amount, |
| 42 | + transfer_all=transfer_all, |
| 43 | + wait_for_inclusion=wait_for_inclusion, |
| 44 | + wait_for_finalization=wait_for_finalization, |
| 45 | + keep_alive=keep_alive, |
| 46 | + ) |
| 47 | + assert result == mocked_execute_coroutine.return_value |
0 commit comments