|
2 | 2 |
|
3 | 3 | from blockapi.utils.address import make_checksum_address |
4 | 4 | from blockapi.v2.api import DebankApi |
| 5 | +from blockapi.v2.models import FetchResult |
5 | 6 |
|
6 | 7 |
|
7 | 8 | def test_build_balance_request_url(debank_api): |
@@ -57,6 +58,79 @@ def test_build_portfolio_request_url(debank_api): |
57 | 58 | ) |
58 | 59 |
|
59 | 60 |
|
| 61 | +def test_build_token_list_for_chain_request_url(debank_api): |
| 62 | + url = debank_api._build_request_url( |
| 63 | + 'get_token_list_for_chain', |
| 64 | + address='0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca', |
| 65 | + chain_id='eth', |
| 66 | + is_all=True, |
| 67 | + ) |
| 68 | + assert ( |
| 69 | + url |
| 70 | + == 'https://pro-openapi.debank.com/v1/user/token_list?id=0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca&chain_id=eth&is_all=True' |
| 71 | + ) |
| 72 | + |
| 73 | + |
| 74 | +def test_build_protocol_for_address_request_url(debank_api): |
| 75 | + url = debank_api._build_request_url( |
| 76 | + 'get_protocol_for_address', |
| 77 | + address='0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca', |
| 78 | + protocol_id='yflink', |
| 79 | + ) |
| 80 | + assert ( |
| 81 | + url |
| 82 | + == 'https://pro-openapi.debank.com/v1/user/protocol?id=0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca&protocol_id=yflink' |
| 83 | + ) |
| 84 | + |
| 85 | + |
| 86 | +def test_parse_pool_for_address_wraps_single_object( |
| 87 | + debank_api, yflink_protocol_response_raw, portfolio_response, requests_mock |
| 88 | +): |
| 89 | + # /v1/user/protocol returns a single protocol object (dict, not list). |
| 90 | + # parse_pool_for_address must wrap it so DebankPortfolioParser can iterate. |
| 91 | + requests_mock.get( |
| 92 | + 'https://pro-openapi.debank.com/v1/protocol/all_list', |
| 93 | + text=yflink_protocol_response_raw, |
| 94 | + ) |
| 95 | + requests_mock.get( |
| 96 | + 'https://pro-openapi.debank.com/v1/user/protocol?id=0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca&protocol_id=avax_traderjoexyz_lending', |
| 97 | + json=portfolio_response, |
| 98 | + ) |
| 99 | + debank_api._protocol_cache.invalidate() |
| 100 | + fetched = debank_api.fetch_protocol_for_address( |
| 101 | + '0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca', |
| 102 | + 'avax_traderjoexyz_lending', |
| 103 | + ) |
| 104 | + parsed = debank_api.parse_pool_for_address(fetched) |
| 105 | + assert parsed.errors is None |
| 106 | + assert len(parsed.data) > 0 |
| 107 | + assert ( |
| 108 | + parsed.data[0].pool_info.pool_id == '0xdc13687554205e5b89ac783db14bb5bba4a1edac' |
| 109 | + ) |
| 110 | + |
| 111 | + |
| 112 | +def test_parse_pool_for_address_handles_empty_response(debank_api, protocol_cache): |
| 113 | + # When Debank returns null/None for an address with no positions in this protocol. |
| 114 | + protocol_cache.update({}) |
| 115 | + parsed = debank_api.parse_pool_for_address(FetchResult(status_code=200, data=None)) |
| 116 | + assert parsed.errors is None |
| 117 | + assert parsed.data == [] |
| 118 | + |
| 119 | + |
| 120 | +def test_fetch_token_list_for_chain_uses_api_key( |
| 121 | + debank_api, protocol_cache, requests_mock |
| 122 | +): |
| 123 | + req = requests_mock.get( |
| 124 | + 'https://pro-openapi.debank.com/v1/user/token_list?id=0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca&chain_id=eth&is_all=True', |
| 125 | + text='[]', |
| 126 | + ) |
| 127 | + protocol_cache.update({}) |
| 128 | + debank_api.fetch_token_list_for_chain( |
| 129 | + '0xca8fa8f0b631ecdb18cda619c4fc9d197c8affca', 'eth' |
| 130 | + ) |
| 131 | + assert req.last_request.headers.get('AccessKey') == 'dummy-key' |
| 132 | + |
| 133 | + |
60 | 134 | def test_error_response_returns_empty_balances( |
61 | 135 | debank_api, protocol_cache, error_response_raw, requests_mock |
62 | 136 | ): |
|
0 commit comments