173 lines
4.4 KiB
Python
173 lines
4.4 KiB
Python
# app/tests/unit/integrations/exchange/test_status.py
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from src.integrations.exchange.status import (
|
|
ExchangeRuntimeStatus,
|
|
ExchangeStatusCode,
|
|
build_market_status_from_symbol_status,
|
|
)
|
|
|
|
|
|
_SYMBOL = "BTC/USD_LEVERAGE"
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"raw_status",
|
|
[
|
|
"TRADING",
|
|
"OPEN",
|
|
"ACTIVE",
|
|
"ENABLED",
|
|
"ONLINE",
|
|
" trading ",
|
|
],
|
|
)
|
|
def test_open_instrument_status_preserves_legacy_contract(
|
|
raw_status: str,
|
|
) -> None:
|
|
status = build_market_status_from_symbol_status(
|
|
raw_status=raw_status,
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
assert status == ExchangeRuntimeStatus(
|
|
code=ExchangeStatusCode.OPEN,
|
|
is_open=True,
|
|
is_available=True,
|
|
is_auth_ok=True,
|
|
title="Биржа доступна",
|
|
message="Рынок открыт.",
|
|
ui_line="🟢 Биржа доступна",
|
|
reason="market_open",
|
|
raw_status=raw_status.strip().upper(),
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"raw_status",
|
|
[
|
|
"NOT_TRADABLE",
|
|
"TRADING_DISABLED",
|
|
"MARKET_DISABLED",
|
|
"UNAVAILABLE_FOR_TRADING",
|
|
"CLOSE_ONLY",
|
|
"REDUCE_ONLY",
|
|
"VIEW_ONLY",
|
|
],
|
|
)
|
|
def test_not_tradable_status_preserves_legacy_contract(
|
|
raw_status: str,
|
|
) -> None:
|
|
status = build_market_status_from_symbol_status(
|
|
raw_status=raw_status,
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
assert status == ExchangeRuntimeStatus(
|
|
code=ExchangeStatusCode.BREAK,
|
|
is_open=False,
|
|
is_available=True,
|
|
is_auth_ok=True,
|
|
title="Рынок недоступен",
|
|
message=(
|
|
"Этот рынок недоступен для торговли: "
|
|
"BTC/USD_LEVERAGE."
|
|
),
|
|
ui_line="⛔️ Рынок недоступен для торговли",
|
|
reason="market_not_tradable",
|
|
raw_status=raw_status,
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"raw_status",
|
|
[
|
|
"BREAK",
|
|
"CLOSED",
|
|
"HALT",
|
|
"HALTED",
|
|
"PAUSED",
|
|
"SUSPENDED",
|
|
"DISABLED",
|
|
"SETTLING",
|
|
"POST_ONLY",
|
|
],
|
|
)
|
|
def test_break_status_preserves_legacy_contract(
|
|
raw_status: str,
|
|
) -> None:
|
|
status = build_market_status_from_symbol_status(
|
|
raw_status=raw_status,
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
assert status == ExchangeRuntimeStatus(
|
|
code=ExchangeStatusCode.BREAK,
|
|
is_open=False,
|
|
is_available=True,
|
|
is_auth_ok=True,
|
|
title="Перерыв в торгах",
|
|
message="Торги по BTC/USD_LEVERAGE временно остановлены.",
|
|
ui_line="⏸️ Перерыв в торгах",
|
|
reason="market_break",
|
|
raw_status=raw_status,
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
|
|
def test_unknown_status_preserves_legacy_contract() -> None:
|
|
status = build_market_status_from_symbol_status(
|
|
raw_status=" maintenance ",
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
assert status == ExchangeRuntimeStatus(
|
|
code=ExchangeStatusCode.UNKNOWN,
|
|
is_open=False,
|
|
is_available=True,
|
|
is_auth_ok=True,
|
|
title="Статус торгов неизвестен",
|
|
message=(
|
|
"Биржа вернула неизвестный статус инструмента: "
|
|
"MAINTENANCE."
|
|
),
|
|
ui_line="⚠️ Статус торгов неизвестен",
|
|
reason="market_status_unknown",
|
|
raw_status="MAINTENANCE",
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"raw_status",
|
|
[
|
|
None,
|
|
"",
|
|
" ",
|
|
],
|
|
)
|
|
def test_empty_status_preserves_legacy_unknown_contract(
|
|
raw_status: str | None,
|
|
) -> None:
|
|
status = build_market_status_from_symbol_status(
|
|
raw_status=raw_status,
|
|
symbol=_SYMBOL,
|
|
)
|
|
|
|
assert status == ExchangeRuntimeStatus(
|
|
code=ExchangeStatusCode.UNKNOWN,
|
|
is_open=False,
|
|
is_available=True,
|
|
is_auth_ok=True,
|
|
title="Статус торгов неизвестен",
|
|
message="Биржа вернула неизвестный статус инструмента.",
|
|
ui_line="⚠️ Статус торгов неизвестен",
|
|
reason="market_status_unknown",
|
|
raw_status=None,
|
|
symbol=_SYMBOL,
|
|
) |