Build 060.16: add Trade Subscription Layer and subscription builders
This commit is contained in:
@@ -0,0 +1,178 @@
|
||||
# app/tests/unit/market_data/acquisition/subscriptions/test_trades.py
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from uuid import UUID
|
||||
|
||||
import pytest
|
||||
|
||||
from src.market_data.acquisition.runtime.runtime_commands import (
|
||||
SubscribeCommand,
|
||||
)
|
||||
from src.market_data.acquisition.runtime.transport_messages import (
|
||||
TransportTextMessage,
|
||||
)
|
||||
from src.market_data.acquisition.subscriptions.trades import (
|
||||
TRADE_SUBSCRIPTION_DESTINATION,
|
||||
build_trade_subscribe_command,
|
||||
build_trade_subscribe_message,
|
||||
build_trade_subscription_key,
|
||||
)
|
||||
|
||||
|
||||
def test_build_trade_subscription_key_for_single_symbol() -> None:
|
||||
result = build_trade_subscription_key(
|
||||
["BTC/USD_LEVERAGE"],
|
||||
)
|
||||
|
||||
assert result == "trades:BTC/USD_LEVERAGE"
|
||||
|
||||
|
||||
def test_build_trade_subscription_key_normalizes_symbols() -> None:
|
||||
result = build_trade_subscription_key(
|
||||
[
|
||||
" ETH/USD_LEVERAGE ",
|
||||
"BTC/USD_LEVERAGE",
|
||||
"ETH/USD_LEVERAGE",
|
||||
"",
|
||||
" ",
|
||||
],
|
||||
)
|
||||
|
||||
assert result == (
|
||||
"trades:BTC/USD_LEVERAGE,ETH/USD_LEVERAGE"
|
||||
)
|
||||
|
||||
|
||||
def test_build_trade_subscription_key_rejects_empty_symbols() -> None:
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
match="at least one non-empty symbol",
|
||||
):
|
||||
build_trade_subscription_key(
|
||||
["", " "],
|
||||
)
|
||||
|
||||
|
||||
def test_build_trade_subscribe_message_returns_transport_message() -> None:
|
||||
result = build_trade_subscribe_message(
|
||||
["BTC/USD_LEVERAGE"],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
assert isinstance(result, TransportTextMessage)
|
||||
|
||||
|
||||
def test_build_trade_subscribe_message_builds_dzengi_document() -> None:
|
||||
result = build_trade_subscribe_message(
|
||||
[
|
||||
"ETH/USD_LEVERAGE",
|
||||
"BTC/USD_LEVERAGE",
|
||||
],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
document = json.loads(result.payload)
|
||||
|
||||
assert document == {
|
||||
"correlationId": "trade-subscription-1",
|
||||
"destination": TRADE_SUBSCRIPTION_DESTINATION,
|
||||
"payload": {
|
||||
"symbols": [
|
||||
"BTC/USD_LEVERAGE",
|
||||
"ETH/USD_LEVERAGE",
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def test_build_trade_subscribe_message_generates_uuid() -> None:
|
||||
result = build_trade_subscribe_message(
|
||||
["BTC/USD_LEVERAGE"],
|
||||
)
|
||||
|
||||
document = json.loads(result.payload)
|
||||
|
||||
generated_id = UUID(document["correlationId"])
|
||||
|
||||
assert str(generated_id) == document["correlationId"]
|
||||
|
||||
|
||||
def test_build_trade_subscribe_message_normalizes_symbols() -> None:
|
||||
result = build_trade_subscribe_message(
|
||||
[
|
||||
" BTC/USD_LEVERAGE ",
|
||||
"BTC/USD_LEVERAGE",
|
||||
"",
|
||||
],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
document = json.loads(result.payload)
|
||||
|
||||
assert document["payload"]["symbols"] == [
|
||||
"BTC/USD_LEVERAGE",
|
||||
]
|
||||
|
||||
|
||||
def test_build_trade_subscribe_message_rejects_empty_symbols() -> None:
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
match="at least one non-empty symbol",
|
||||
):
|
||||
build_trade_subscribe_message(
|
||||
[],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
|
||||
def test_build_trade_subscribe_command_returns_runtime_command() -> None:
|
||||
result = build_trade_subscribe_command(
|
||||
["BTC/USD_LEVERAGE"],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
assert isinstance(result, SubscribeCommand)
|
||||
assert result.subscription_key == "trades:BTC/USD_LEVERAGE"
|
||||
assert isinstance(result.message, TransportTextMessage)
|
||||
|
||||
|
||||
def test_build_trade_subscribe_command_contains_dzengi_message() -> None:
|
||||
result = build_trade_subscribe_command(
|
||||
["BTC/USD_LEVERAGE"],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
document = json.loads(result.message.payload)
|
||||
|
||||
assert document == {
|
||||
"correlationId": "trade-subscription-1",
|
||||
"destination": "trades.subscribe",
|
||||
"payload": {
|
||||
"symbols": [
|
||||
"BTC/USD_LEVERAGE",
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def test_build_trade_subscribe_command_uses_same_normalized_symbols() -> None:
|
||||
result = build_trade_subscribe_command(
|
||||
[
|
||||
"ETH/USD_LEVERAGE",
|
||||
" BTC/USD_LEVERAGE ",
|
||||
"ETH/USD_LEVERAGE",
|
||||
],
|
||||
correlation_id="trade-subscription-1",
|
||||
)
|
||||
|
||||
document = json.loads(result.message.payload)
|
||||
|
||||
assert result.subscription_key == (
|
||||
"trades:BTC/USD_LEVERAGE,ETH/USD_LEVERAGE"
|
||||
)
|
||||
assert document["payload"]["symbols"] == [
|
||||
"BTC/USD_LEVERAGE",
|
||||
"ETH/USD_LEVERAGE",
|
||||
]
|
||||
Reference in New Issue
Block a user