From a90618896d5dc6ebef4f387abc517dec118da93f Mon Sep 17 00:00:00 2001 From: 21in7 Date: Sun, 1 Mar 2026 12:54:21 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=97=94=ED=8A=B8=EB=A6=AC=ED=8F=AC?= =?UTF-8?q?=EC=9D=B8=ED=8A=B8=20=EB=B0=8F=20=EB=A1=9C=EA=B9=85=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=99=84=EB=A3=8C,=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20mock=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- main.py | 18 ++++++++++++++++++ src/logger_setup.py | 24 ++++++++++++++++++++++++ tests/test_exchange.py | 23 ++++++++++++----------- 3 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 main.py create mode 100644 src/logger_setup.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..8055649 --- /dev/null +++ b/main.py @@ -0,0 +1,18 @@ +import asyncio +from dotenv import load_dotenv +from src.config import Config +from src.bot import TradingBot +from src.logger_setup import setup_logger + +load_dotenv() + + +async def main(): + setup_logger(log_level="INFO") + config = Config() + bot = TradingBot(config) + await bot.run() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/src/logger_setup.py b/src/logger_setup.py new file mode 100644 index 0000000..b513c31 --- /dev/null +++ b/src/logger_setup.py @@ -0,0 +1,24 @@ +import sys +from loguru import logger + + +def setup_logger(log_level: str = "INFO"): + logger.remove() + logger.add( + sys.stdout, + format=( + "{time:YYYY-MM-DD HH:mm:ss} | " + "{level: <8} | " + "{name}:{line} - " + "{message}" + ), + level=log_level, + colorize=True, + ) + logger.add( + "logs/bot_{time:YYYY-MM-DD}.log", + rotation="00:00", + retention="30 days", + level="DEBUG", + encoding="utf-8", + ) diff --git a/tests/test_exchange.py b/tests/test_exchange.py index 7c8c9bc..c57a3e2 100644 --- a/tests/test_exchange.py +++ b/tests/test_exchange.py @@ -19,19 +19,20 @@ def config(): @pytest.mark.asyncio async def test_set_leverage(config): - client = BinanceFuturesClient(config) - with patch.object( - client.client, - "futures_change_leverage", - return_value={"leverage": 10}, - ): + with patch("src.exchange.Client") as MockClient: + mock_binance = MagicMock() + MockClient.return_value = mock_binance + mock_binance.futures_change_leverage.return_value = {"leverage": 10} + client = BinanceFuturesClient(config) result = await client.set_leverage(10) assert result is not None def test_calculate_quantity(config): - client = BinanceFuturesClient(config) - # 잔고 1000 USDT, 리스크 2%, 레버리지 10, 가격 0.5 - qty = client.calculate_quantity(balance=1000.0, price=0.5, leverage=10) - # 1000 * 0.02 * 10 / 0.5 = 400 - assert qty == pytest.approx(400.0, rel=0.01) + with patch("src.exchange.Client") as MockClient: + MockClient.return_value = MagicMock() + client = BinanceFuturesClient(config) + # 잔고 1000 USDT, 리스크 2%, 레버리지 10, 가격 0.5 + qty = client.calculate_quantity(balance=1000.0, price=0.5, leverage=10) + # 1000 * 0.02 * 10 / 0.5 = 400 + assert qty == pytest.approx(400.0, rel=0.01)