89 lines
2.8 KiB
Python
89 lines
2.8 KiB
Python
"""Tests for user-WS normalization (maker fill extraction + order tracking).
|
|
|
|
Frames modeled on v1's observed shape; reconfirm field names in the wallet spike.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from polymaker.domain import Side, TradeState
|
|
from polymaker.userstream.parse import normalize_order, normalize_trade
|
|
|
|
OUR = "0xMyWallet"
|
|
|
|
|
|
def _other(token: str) -> str | None:
|
|
return {"yes-tok": "no-tok", "no-tok": "yes-tok"}.get(token)
|
|
|
|
|
|
def test_maker_same_outcome_is_a_sell():
|
|
# taker BUYs YES; we are the maker on YES -> we SELL YES
|
|
msg = {
|
|
"event_type": "trade",
|
|
"market": "0xcond",
|
|
"asset_id": "yes-tok",
|
|
"side": "BUY",
|
|
"outcome": "Yes",
|
|
"status": "MATCHED",
|
|
"id": "trade1",
|
|
"timestamp": "1700000000000",
|
|
"maker_orders": [
|
|
{"maker_address": OUR, "matched_amount": "50", "price": "0.49", "outcome": "Yes"}
|
|
],
|
|
}
|
|
evs = normalize_trade(msg, OUR, _other)
|
|
assert len(evs) == 1
|
|
ev = evs[0]
|
|
assert ev.token_id == "yes-tok"
|
|
assert ev.our_side is Side.SELL
|
|
assert ev.size == 50 and ev.price == 0.49
|
|
assert ev.status is TradeState.MATCHED
|
|
|
|
|
|
def test_maker_different_outcome_is_a_mint_buy():
|
|
# taker BUYs YES; we are the maker on NO -> a mint: we BUY NO
|
|
msg = {
|
|
"event_type": "trade",
|
|
"market": "0xcond",
|
|
"asset_id": "yes-tok",
|
|
"side": "BUY",
|
|
"outcome": "Yes",
|
|
"status": "MATCHED",
|
|
"id": "trade2",
|
|
"timestamp": "1700000000000",
|
|
"maker_orders": [
|
|
{"maker_address": OUR, "matched_amount": "30", "price": "0.51", "outcome": "No"}
|
|
],
|
|
}
|
|
evs = normalize_trade(msg, OUR, _other)
|
|
assert len(evs) == 1
|
|
assert evs[0].token_id == "no-tok"
|
|
assert evs[0].our_side is Side.BUY
|
|
assert evs[0].size == 30
|
|
|
|
|
|
def test_ignores_maker_orders_that_are_not_ours():
|
|
msg = {
|
|
"event_type": "trade", "market": "0xcond", "asset_id": "yes-tok", "side": "BUY",
|
|
"outcome": "Yes", "status": "MATCHED", "id": "t", "timestamp": "1700000000000",
|
|
"maker_orders": [
|
|
{"maker_address": "0xSomeoneElse", "matched_amount": "50", "price": "0.49", "outcome": "Yes"}
|
|
],
|
|
}
|
|
assert normalize_trade(msg, OUR, _other) == []
|
|
|
|
|
|
def test_normalize_order_remaining_and_cancel():
|
|
ev = normalize_order({
|
|
"event_type": "order", "asset_id": "yes-tok", "side": "BUY", "price": "0.49",
|
|
"original_size": "100", "size_matched": "40", "status": "LIVE", "id": "o1",
|
|
})
|
|
assert ev is not None
|
|
assert ev.remaining_size == 60
|
|
assert ev.is_cancel is False
|
|
|
|
cancel = normalize_order({
|
|
"event_type": "order", "asset_id": "yes-tok", "side": "BUY", "price": "0.49",
|
|
"original_size": "100", "size_matched": "0", "status": "CANCELED", "id": "o1",
|
|
})
|
|
assert cancel is not None and cancel.is_cancel is True
|