forked from zovos/bot_tg
114 lines
5.4 KiB
Python
114 lines
5.4 KiB
Python
import sys
|
||
import os
|
||
import unittest
|
||
from unittest.mock import MagicMock, patch
|
||
|
||
# Вставляем путь к проекту в sys.path
|
||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||
|
||
# 1. Глобальный мок для psycopg2, пула соединений и функции get_conn,
|
||
# чтобы избежать реального подключения к БД во время импорта и выполнения тестов.
|
||
import psycopg2
|
||
psycopg2.connect = MagicMock()
|
||
import psycopg2.pool
|
||
psycopg2.pool.ThreadedConnectionPool = MagicMock()
|
||
|
||
import db
|
||
# Мокаем get_conn как контекстный менеджер
|
||
mock_conn = MagicMock()
|
||
mock_cur = MagicMock()
|
||
mock_conn.cursor.return_value = mock_cur
|
||
# Для RealDictCursor
|
||
mock_cur_dict = MagicMock()
|
||
mock_conn.cursor.return_value = mock_cur_dict
|
||
|
||
mock_get_conn = MagicMock()
|
||
mock_get_conn.return_value.__enter__.return_value = mock_conn
|
||
db.get_conn = mock_get_conn
|
||
|
||
# 2. Импортируем тестируемые модули после настройки моков
|
||
from games.betting import place_bet
|
||
from games.casino import play_casino
|
||
from games.economy import economy
|
||
|
||
class TestPrecision(unittest.TestCase):
|
||
|
||
@patch('games.betting.get_user_length')
|
||
@patch('games.betting.update_user_length')
|
||
def test_place_bet_exact_balance(self, mock_update_user_length, mock_get_user_length):
|
||
# Баланс 0.199999988 (32-bit float представление 0.2)
|
||
mock_get_user_length.return_value = 0.199999988
|
||
mock_update_user_length.return_value = 0.0
|
||
|
||
match = {
|
||
"id": "match_123",
|
||
"home": "Team A",
|
||
"away": "Team B",
|
||
"odds": {"Team A": 2.0, "Team B": 1.8}
|
||
}
|
||
|
||
# Ставка ровно 0.2 должна быть успешной благодаря округлению round(amount, 2) <= round(current, 2)
|
||
success, message = place_bet(12345, match, "dota2", "Team A", 0.2)
|
||
|
||
self.assertTrue(success)
|
||
self.assertIn("Ставка принята!", message)
|
||
|
||
# Ставка 0.21 при балансе 0.199999988 должна быть отклонена
|
||
success_fail, message_fail = place_bet(12345, match, "dota2", "Team A", 0.21)
|
||
self.assertFalse(success_fail)
|
||
self.assertIn("Не хватает, фраер", message_fail)
|
||
|
||
@patch('games.casino.economy.get_user_balance')
|
||
@patch('games.casino.spin_slots')
|
||
@patch('games.casino.economy.update_balance')
|
||
def test_casino_exact_balance(self, mock_update, mock_spin, mock_get_user_balance):
|
||
# Баланс 0.199999988
|
||
mock_get_user_balance.return_value = 0.199999988
|
||
mock_spin.return_value = (["🍒", "🍒", "🍇"], 2)
|
||
mock_update.return_value = 0.0
|
||
|
||
# Ставка ровно 0.2 в казино должна быть успешной
|
||
result = play_casino(12345, 0.2)
|
||
self.assertNotIn("Столько нет, фраер", result)
|
||
|
||
# Ставка 0.21 при балансе 0.199999988 должна быть отклонена
|
||
result_fail = play_casino(12345, 0.21)
|
||
self.assertIn("Столько нет, фраер", result_fail)
|
||
|
||
@patch('games.economy.economy.get_user_balance')
|
||
@patch('games.economy.economy.get_setting')
|
||
def test_economy_deposit_exact_balance(self, mock_get_setting, mock_get_user_balance):
|
||
# Баланс 9.999999 (32-bit float представление 10.0), минимальный вклад 10.0
|
||
mock_get_user_balance.return_value = 9.999999
|
||
mock_get_setting.side_effect = lambda key: "10.0" if key == "deposit_min_amount" else "7.5"
|
||
|
||
# Вклад на 10.0 при балансе 9.999999 (эквивалентен 10.0) должен пройти успешно благодаря округлению
|
||
success, msg = economy.create_deposit(12345, 10.0, 30)
|
||
self.assertTrue(success)
|
||
self.assertEqual(msg, "Вклад успешно открыт!")
|
||
|
||
# Вклад на 10.01 должен быть отклонен из-за нехватки баланса
|
||
success_fail, msg_fail = economy.create_deposit(12345, 10.01, 30)
|
||
self.assertFalse(success_fail)
|
||
self.assertIn("Недостаточно средств", msg_fail)
|
||
|
||
# Вклад на 9.99 должен быть отклонен из-за минимальной суммы
|
||
success_fail2, msg_fail2 = economy.create_deposit(12345, 9.99, 30)
|
||
self.assertFalse(success_fail2)
|
||
self.assertIn("Минимальная сумма вклада", msg_fail2)
|
||
|
||
@patch('games.economy.economy.get_user_balance')
|
||
def test_economy_transfer_exact_balance(self, mock_get_user_balance):
|
||
# При балансе 9.999999 (эквивалентен 10.0) лимит перевода (20%) составляет ровно 2.0.
|
||
mock_get_user_balance.return_value = 9.999999
|
||
|
||
# Перевод ровно 2.0 должен пройти успешно
|
||
success = economy.transfer_money(12345, 67890, 2.0, "Test transfer")
|
||
self.assertTrue(success)
|
||
|
||
# Перевод 2.01 должен превысить 20% лимит (2.0) и отклониться
|
||
success_fail = economy.transfer_money(12345, 67890, 2.01, "Test transfer")
|
||
self.assertFalse(success_fail)
|
||
|
||
if __name__ == '__main__':
|
||
unittest.main()
|