Skip to content

Commit 3af43fa

Browse files
feat: externalize tradable symbol configuration for tests (#467)
1 parent b9e944d commit 3af43fa

File tree

8 files changed

+74
-60
lines changed

8 files changed

+74
-60
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,4 @@ test
7676

7777
## Any contributions you make will be under the same License
7878
When you submit code changes, your submissions are understood to be under the same [License](https://github.com/dydxprotocol/v4-web/blob/master/LICENSE) that covers the project.
79+

v4-client-py-v2/tests/conftest.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@
6161

6262
TEST_ADDRESS_3 = "dydx1wldnytkerzs39rs28djn0p9vvqer2x2k5x8hjy"
6363

64+
# Symbol/instrument-specific test configuration
65+
# Market symbol identifier (e.g., "ENA-USD", "BTC-USD")
66+
TEST_MARKET_ID: str = "ENA-USD"
67+
68+
# ClobPairId for the test market
69+
TEST_CLOB_PAIR_ID: int = 127
70+
71+
# Default subticks value for test orders (price precision, symbol-specific)
72+
TEST_DEFAULT_SUBTICKS: int = 1000000
73+
6474

6575
@pytest.fixture
6676
def indexer_rest_client() -> IndexerClient:
@@ -126,7 +136,7 @@ def test_order_id(test_address) -> OrderId:
126136
test_address,
127137
subaccount_number=0,
128138
client_id=random.randint(0, 1000000000),
129-
clob_pair_id=127,
139+
clob_pair_id=TEST_CLOB_PAIR_ID,
130140
order_flags=64,
131141
)
132142

@@ -138,8 +148,8 @@ def test_order(test_order_id) -> Order:
138148
time_in_force=Order.TimeInForce.TIME_IN_FORCE_UNSPECIFIED,
139149
reduce_only=False,
140150
side=Order.Side.SIDE_BUY,
141-
quantums=1000000,
142-
subticks=1000000,
151+
quantums=TEST_DEFAULT_SUBTICKS,
152+
subticks=TEST_DEFAULT_SUBTICKS,
143153
good_til_block_time=int(time.time() + 60),
144154
builder_code_parameters=None,
145155
twap_parameters=None,
@@ -155,7 +165,7 @@ def test_order2(test_order_id) -> Order:
155165
reduce_only=False,
156166
side=Order.Side.SIDE_BUY,
157167
quantums=1000000,
158-
subticks=1000000,
168+
subticks=TEST_DEFAULT_SUBTICKS,
159169
good_til_block_time=int(time.time() + 60),
160170
builder_code_parameters=None,
161171
twap_parameters=None,

v4-client-py-v2/tests/indexer/rest/modules/test_markets_endpoints.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
import pytest
22

3-
from tests.conftest import retry_on_forbidden
4-
5-
MARKET_BTC_USD: str = "ENA-USD"
3+
from tests.conftest import retry_on_forbidden, TEST_MARKET_ID
64

75

86
@pytest.mark.asyncio
97
@retry_on_forbidden(max_retries=3, delay=1)
108
async def test_markets(indexer_rest_client):
119
response = await indexer_rest_client.markets.get_perpetual_markets()
12-
btc = response["markets"][MARKET_BTC_USD]
10+
btc = response["markets"][TEST_MARKET_ID]
1311
status = btc["status"]
1412
assert status == "ACTIVE"
1513

1614

1715
@pytest.mark.asyncio
1816
@retry_on_forbidden(max_retries=3, delay=1)
1917
async def test_btc_market(indexer_rest_client):
20-
response = await indexer_rest_client.markets.get_perpetual_markets(MARKET_BTC_USD)
21-
btc = response["markets"][MARKET_BTC_USD]
18+
response = await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID)
19+
btc = response["markets"][TEST_MARKET_ID]
2220
status = btc["status"]
2321
assert status == "ACTIVE"
2422

@@ -27,7 +25,7 @@ async def test_btc_market(indexer_rest_client):
2725
@retry_on_forbidden(max_retries=3, delay=1)
2826
async def test_btc_trades(indexer_rest_client):
2927
response = await indexer_rest_client.markets.get_perpetual_market_trades(
30-
MARKET_BTC_USD
28+
TEST_MARKET_ID
3129
)
3230
trades = response["trades"]
3331
assert trades is not None
@@ -37,7 +35,7 @@ async def test_btc_trades(indexer_rest_client):
3735
@retry_on_forbidden(max_retries=3, delay=1)
3836
async def test_btc_orderbook(indexer_rest_client):
3937
response = await indexer_rest_client.markets.get_perpetual_market_orderbook(
40-
MARKET_BTC_USD
38+
TEST_MARKET_ID
4139
)
4240
asks = response["asks"]
4341
bids = response["bids"]
@@ -49,7 +47,7 @@ async def test_btc_orderbook(indexer_rest_client):
4947
@retry_on_forbidden(max_retries=3, delay=1)
5048
async def test_btc_candles(indexer_rest_client):
5149
response = await indexer_rest_client.markets.get_perpetual_market_candles(
52-
MARKET_BTC_USD, "1MIN"
50+
TEST_MARKET_ID, "1MIN"
5351
)
5452
candles = response["candles"]
5553
assert candles is not None
@@ -60,7 +58,7 @@ async def test_btc_candles(indexer_rest_client):
6058
async def test_btc_historical_funding(indexer_rest_client):
6159
response = (
6260
await indexer_rest_client.markets.get_perpetual_market_historical_funding(
63-
MARKET_BTC_USD
61+
TEST_MARKET_ID
6462
)
6563
)
6664
assert response is not None
@@ -75,5 +73,5 @@ async def test_btc_historical_funding(indexer_rest_client):
7573
@retry_on_forbidden(max_retries=3, delay=1)
7674
async def test_sparklines(indexer_rest_client):
7775
response = await indexer_rest_client.markets.get_perpetual_market_sparklines()
78-
btc_sparklines = response[MARKET_BTC_USD]
76+
btc_sparklines = response[TEST_MARKET_ID]
7977
assert btc_sparklines is not None

v4-client-py-v2/tests/indexer/socket/test_websocket.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dotenv import load_dotenv
66

77
from dydx_v4_client.indexer.candles_resolution import CandlesResolution
8+
from tests.conftest import TEST_MARKET_ID
89

910
load_dotenv()
1011

@@ -17,16 +18,16 @@ async def test_order_book(indexer_socket_client):
1718
def on_message(ws, message):
1819
message_dict = json.loads(message)
1920
if message_dict["type"] == "connected":
20-
ws.order_book.subscribe(id="ENA-USD")
21+
ws.order_book.subscribe(id=TEST_MARKET_ID)
2122
elif message_dict["type"] == "subscribed":
2223
assert message_dict["channel"] == order_book_channel_name
2324
if os.getenv("CI") == "true":
24-
ws.order_book.unsubscribe(id="ENA-USD")
25+
ws.order_book.unsubscribe(id=TEST_MARKET_ID)
2526
ws.close()
2627
elif message_dict["type"] in ["channel_data", "channel_batch_data"]:
2728
assert message_dict["channel"] == order_book_channel_name
2829
assert "bids" or "asks" in message_dict["contents"][0]
29-
ws.order_book.unsubscribe(id="ENA-USD")
30+
ws.order_book.unsubscribe(id=TEST_MARKET_ID)
3031
ws.close()
3132
else:
3233
ws.close()
@@ -43,16 +44,16 @@ async def test_trades(indexer_socket_client):
4344
def on_message(ws, message):
4445
message_dict = json.loads(message)
4546
if message_dict["type"] == "connected":
46-
ws.trades.subscribe(id="ENA-USD")
47+
ws.trades.subscribe(id=TEST_MARKET_ID)
4748
elif message_dict["type"] == "subscribed":
4849
assert message_dict["channel"] == trades_channel_name
4950
if os.getenv("CI") == "true":
50-
ws.trades.unsubscribe(id="ENA-USD")
51+
ws.trades.unsubscribe(id=TEST_MARKET_ID)
5152
ws.close()
5253
elif message_dict["type"] in ["channel_data", "channel_batch_data"]:
5354
assert message_dict["channel"] == trades_channel_name
5455
assert "trades" in message_dict["contents"][0]
55-
ws.trades.unsubscribe(id="ENA-USD")
56+
ws.trades.unsubscribe(id=TEST_MARKET_ID)
5657
ws.close()
5758
else:
5859
ws.close()

v4-client-py-v2/tests/test_authenticator.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
TEST_ADDRESS_2,
1313
)
1414

15-
MARKET_ID = "ENA-USD"
1615
REQUEST_PROCESSING_TIME = 5
1716

1817

v4-client-py-v2/tests/test_batch_cancel.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
DYDX_TEST_MNEMONIC_3,
1818
assert_successful_broadcast,
1919
DYDX_TEST_MNEMONIC_3,
20+
TEST_MARKET_ID,
21+
TEST_CLOB_PAIR_ID,
2022
)
2123

22-
MARKET_ID = "ENA-USD"
23-
PERPETUAL_PAIR_ENA_USD = 127
2424
REQUEST_PROCESSING_TIME = 5
2525

2626

@@ -38,9 +38,9 @@ def sleep_after_test(request):
3838
@pytest.mark.asyncio
3939
async def test_batch_cancel(indexer_rest_client, node_client, test_address, wallet):
4040
market = Market(
41-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
42-
MARKET_ID
43-
]
41+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
42+
"markets"
43+
][TEST_MARKET_ID]
4444
)
4545
height = await node_client.latest_block_height()
4646
assert height > 0
@@ -79,7 +79,7 @@ async def test_batch_cancel(indexer_rest_client, node_client, test_address, wall
7979

8080
# Prepare batch cancel
8181
subaccount_id = SubaccountId(owner=test_address, number=0)
82-
order_batch = OrderBatch(clob_pair_id=PERPETUAL_PAIR_ENA_USD, client_ids=client_ids)
82+
order_batch = OrderBatch(clob_pair_id=TEST_CLOB_PAIR_ID, client_ids=client_ids)
8383
cancellation_current_block = await node_client.latest_block_height()
8484

8585
# Execute batch cancel

v4-client-py-v2/tests/test_mutating_node_client.py

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,18 @@
1111
from dydx_v4_client.node.message import subaccount, send_token, order
1212
from v4_proto.dydxprotocol.clob.order_pb2 import Order
1313
from dydx_v4_client.indexer.rest.constants import OrderType
14-
from tests.conftest import get_wallet, assert_successful_broadcast, TEST_ADDRESS_2
14+
from tests.conftest import (
15+
get_wallet,
16+
assert_successful_broadcast,
17+
TEST_ADDRESS_2,
18+
TEST_MARKET_ID,
19+
)
1520
from v4_proto.dydxprotocol.clob.order_pb2 import BuilderCodeParameters
1621
from dydx_v4_client.indexer.rest.constants import OrderStatus
1722
from dydx_v4_client.key_pair import KeyPair
1823

1924

2025
REQUEST_PROCESSING_TIME = 5
21-
MARKET_ID = "ENA-USD"
2226
SUBACCOUNT = 0
2327

2428

@@ -211,7 +215,7 @@ async def test_query_address(node_client, test_address):
211215

212216
@pytest.mark.asyncio
213217
async def test_create_market_permissionless(node_client, wallet, test_address):
214-
ticker = "ENA-USD"
218+
ticker = TEST_MARKET_ID
215219
try:
216220
response = await node_client.create_market_permissionless(
217221
wallet, ticker, test_address, 0
@@ -334,9 +338,9 @@ async def test_place_order_with_twap_parameters(
334338
node_client, indexer_rest_client, test_address, wallet, liquidity_setup, key_pair
335339
):
336340
market = Market(
337-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
338-
MARKET_ID
339-
]
341+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
342+
"markets"
343+
][TEST_MARKET_ID]
340344
)
341345
wallet = await get_wallet(node_client, key_pair, test_address)
342346

@@ -378,9 +382,9 @@ async def test_close_position_sell_no_reduce_by(
378382
node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair
379383
):
380384
market = Market(
381-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
382-
MARKET_ID
383-
]
385+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
386+
"markets"
387+
][TEST_MARKET_ID]
384388
)
385389

386390
wallet = await get_wallet(node_client, key_pair, test_address)
@@ -452,7 +456,7 @@ async def setup_liquidity_orders(node_client, indexer_rest_client, wallet_2, mar
452456
# Fetch orderbook to get current bid/ask
453457
try:
454458
orderbook = await indexer_rest_client.markets.get_perpetual_market_orderbook(
455-
MARKET_ID
459+
TEST_MARKET_ID
456460
)
457461
best_bid = (
458462
float(orderbook["bids"][0]["price"])
@@ -587,9 +591,9 @@ async def liquidity_setup(node_client, indexer_rest_client, wallet_2, key_pair_2
587591
Places buy and sell orders at ±0.1% from oracle price using TEST_ADDRESS_2.
588592
"""
589593
market = Market(
590-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
591-
MARKET_ID
592-
]
594+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
595+
"markets"
596+
][TEST_MARKET_ID]
593597
)
594598

595599
# Setup: place liquidity orders
@@ -618,9 +622,9 @@ async def test_close_position_sell_having_reduce_by(
618622
node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair
619623
):
620624
market = Market(
621-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
622-
MARKET_ID
623-
]
625+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
626+
"markets"
627+
][TEST_MARKET_ID]
624628
)
625629

626630
wallet = await get_wallet(node_client, key_pair, test_address)
@@ -691,9 +695,9 @@ async def test_close_position_buy_no_reduce_by(
691695
node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair
692696
):
693697
market = Market(
694-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
695-
MARKET_ID
696-
]
698+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
699+
"markets"
700+
][TEST_MARKET_ID]
697701
)
698702

699703
wallet = await get_wallet(node_client, key_pair, test_address)
@@ -759,9 +763,9 @@ async def test_close_position_buy_having_reduce_by(
759763
node_client, wallet, test_address, indexer_rest_client, liquidity_setup, key_pair
760764
):
761765
market = Market(
762-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
763-
MARKET_ID
764-
]
766+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
767+
"markets"
768+
][TEST_MARKET_ID]
765769
)
766770

767771
wallet = await get_wallet(node_client, key_pair, test_address)
@@ -828,9 +832,9 @@ async def test_close_position_slippage_pct_raise_exception(
828832
node_client, wallet, test_address, indexer_rest_client
829833
):
830834
market = Market(
831-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
832-
MARKET_ID
833-
]
835+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
836+
"markets"
837+
][TEST_MARKET_ID]
834838
)
835839
with pytest.raises(ValueError):
836840
_ = await node_client.close_position(
@@ -872,9 +876,11 @@ async def get_current_order_size(
872876
return None
873877
if "openPerpetualPositions" not in subaccount["subaccount"]:
874878
return None
875-
if "ENA-USD" not in subaccount["subaccount"]["openPerpetualPositions"]:
879+
if TEST_MARKET_ID not in subaccount["subaccount"]["openPerpetualPositions"]:
876880
return None
877-
return float(subaccount["subaccount"]["openPerpetualPositions"]["ENA-USD"]["size"])
881+
return float(
882+
subaccount["subaccount"]["openPerpetualPositions"][TEST_MARKET_ID]["size"]
883+
)
878884

879885

880886
async def close_open_positions(

v4-client-py-v2/tests/test_revenue_share.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from dydx_v4_client import MAX_CLIENT_ID, OrderFlags
55
from dydx_v4_client.indexer.rest.constants import OrderType
66
from dydx_v4_client.node.market import Market
7-
from tests.conftest import TEST_ADDRESS_2, TEST_ADDRESS_3
7+
from tests.conftest import TEST_ADDRESS_2, TEST_ADDRESS_3, TEST_MARKET_ID
88
from v4_proto.dydxprotocol.clob.order_pb2 import Order
99
from v4_proto.dydxprotocol.revshare import query_pb2 as revshare_query
1010
import pytest
@@ -13,11 +13,10 @@
1313
async def test_place_order_with_order_router_address(
1414
node_client, indexer_rest_client, test_order_id, test_address, wallet
1515
):
16-
MARKET_ID = "ENA-USD"
1716
market = Market(
18-
(await indexer_rest_client.markets.get_perpetual_markets(MARKET_ID))["markets"][
19-
MARKET_ID
20-
]
17+
(await indexer_rest_client.markets.get_perpetual_markets(TEST_MARKET_ID))[
18+
"markets"
19+
][TEST_MARKET_ID]
2120
)
2221

2322
assert market is not None

0 commit comments

Comments
 (0)