Build 060.16: add Trade Subscription Layer and subscription builders

This commit is contained in:
2026-07-20 00:49:45 +03:00
parent 02868561d6
commit be6beac560
6 changed files with 1793 additions and 0 deletions

View File

@@ -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",
]