Files
new_lotto/tests/test_app.py
hyeonggil fd84a4da81 업로드
2026-03-28 09:58:17 +09:00

175 lines
5.5 KiB
Python

import os
import sys
import unittest
from pathlib import Path
from unittest.mock import MagicMock, patch
_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(_ROOT / "src"))
class TestConfig(unittest.TestCase):
def setUp(self):
self._saved = dict(os.environ)
def tearDown(self):
os.environ.clear()
os.environ.update(self._saved)
@patch("config._load_dotenv_if_present")
def test_load_config_defaults_game_count(self, _):
os.environ["LOTTO_USERNAME"] = "u"
os.environ["LOTTO_PASSWORD"] = "p"
os.environ["TELEGRAM_BOT_TOKEN"] = "t"
os.environ["TELEGRAM_CHAT_ID"] = "1"
os.environ.pop("GAME_COUNT", None)
from config import load_config
c = load_config()
self.assertEqual(c.GAME_COUNT, 5)
@patch("config._load_dotenv_if_present")
def test_load_config_game_count_invalid(self, _):
os.environ["LOTTO_USERNAME"] = "u"
os.environ["LOTTO_PASSWORD"] = "p"
os.environ["TELEGRAM_BOT_TOKEN"] = "t"
os.environ["TELEGRAM_CHAT_ID"] = "1"
os.environ["GAME_COUNT"] = "6"
from config import load_config
with self.assertRaises(ValueError):
load_config()
@patch("config._load_dotenv_if_present")
def test_load_config_missing_required(self, _):
os.environ.pop("LOTTO_USERNAME", None)
from config import load_config
with self.assertRaises(OSError):
load_config()
class TestLottoBuyer(unittest.TestCase):
@patch("lotto_buyer.requests.Session")
def test_login_success(self, SessionCls):
session = MagicMock()
SessionCls.return_value = session
session.cookies = {"JSESSIONID": "abc"}
post_resp = MagicMock()
post_resp.url = "https://dhlottery.co.kr/main.do"
session.post.return_value = post_resp
from lotto_buyer import LottoBuyer
b = LottoBuyer("user", "pw")
self.assertTrue(b.login())
session.get.assert_called_once()
session.post.assert_called_once()
@patch("lotto_buyer.requests.Session")
def test_login_fails_no_cookie(self, SessionCls):
session = MagicMock()
SessionCls.return_value = session
session.cookies = {}
session.post.return_value = MagicMock(url="https://dhlottery.co.kr/")
from lotto_buyer import LottoBuyer
b = LottoBuyer("user", "pw")
self.assertFalse(b.login())
@patch("lotto_buyer.requests.Session")
def test_buy_success(self, SessionCls):
session = MagicMock()
SessionCls.return_value = session
def get_side_effect(url, **kwargs):
r = MagicMock()
r.raise_for_status = MagicMock()
if "getGameInfo" in url:
r.json.return_value = {"curDrwNo": 1200}
elif "myPage" in url:
r.text = '보유금액<span class="money">9,000원'
else:
r.json.return_value = {}
r.text = ""
return r
session.get.side_effect = get_side_effect
def post_side_effect(url, data=None, **kwargs):
r = MagicMock()
r.raise_for_status = MagicMock()
if "saveBuy" in url:
r.json.return_value = {
"result": {
"resultMsg": "SUCCESS",
"ary645Lotto": [
{
"drwtNo1": 7,
"drwtNo2": 14,
"drwtNo3": 21,
"drwtNo4": 28,
"drwtNo5": 35,
"drwtNo6": 42,
}
],
}
}
else:
r.json.return_value = {}
return r
session.post.side_effect = post_side_effect
from lotto_buyer import LottoBuyer
b = LottoBuyer("u", "p")
result = b.buy(game_count=1)
self.assertTrue(result.success)
self.assertEqual(result.round_number, 1200)
self.assertEqual(result.total_price, 1000)
self.assertEqual(result.games[0], [7, 14, 21, 28, 35, 42])
def test_parse_bought_numbers(self):
from lotto_buyer import LottoBuyer
b = LottoBuyer("u", "p")
data = {
"result": {
"ary645Lotto": [
{
"drwtNo1": 10,
"drwtNo2": 9,
"drwtNo3": 8,
"drwtNo4": 7,
"drwtNo5": 6,
"drwtNo6": 5,
}
]
}
}
games = b._parse_bought_numbers(data)
self.assertEqual(games, [[5, 6, 7, 8, 9, 10]])
class TestTelegramNotifier(unittest.TestCase):
@patch("telegram_notifier.requests.post")
def test_send_success_calls_api(self, post):
post.return_value = MagicMock()
post.return_value.raise_for_status = MagicMock()
from telegram_notifier import TelegramNotifier
n = TelegramNotifier("token", "123")
n.send_success(100, [[1, 2, 3, 4, 5, 6]], 1000, 5000)
post.assert_called_once()
args, kwargs = post.call_args
self.assertIn("api.telegram.org/bottoken/sendMessage", args[0])
self.assertEqual(kwargs["json"]["chat_id"], "123")
self.assertIn("로또 구매 완료", kwargs["json"]["text"])
if __name__ == "__main__":
unittest.main()