113 lines
3.3 KiB
Python
113 lines
3.3 KiB
Python
"""
|
||
Test file for bot.py
|
||
|
||
To run the bot:
|
||
python bot.py
|
||
|
||
To test the bot functionality:
|
||
python -m pytest tests/test_bot.py -v
|
||
or
|
||
python tests/test_bot.py
|
||
"""
|
||
|
||
import pytest
|
||
import asyncio
|
||
from unittest.mock import AsyncMock, MagicMock, patch
|
||
import sys
|
||
import os
|
||
|
||
# Add parent directory to path to import bot module
|
||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
from bot import cmd_start, fake_db
|
||
|
||
|
||
class TestBot:
|
||
"""Test cases for bot functionality"""
|
||
|
||
def setup_method(self):
|
||
"""Clear fake_db before each test"""
|
||
fake_db.clear()
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_start_command_without_token(self):
|
||
"""Test /start command without token"""
|
||
# Create mock message
|
||
message = AsyncMock()
|
||
message.from_user.id = 12345
|
||
message.from_user.username = "test_user"
|
||
message.answer = AsyncMock()
|
||
|
||
# Create mock command object
|
||
command = MagicMock()
|
||
command.args = None
|
||
|
||
# Call the handler
|
||
await cmd_start(message, command)
|
||
|
||
# Verify the response
|
||
message.answer.assert_called_once_with(
|
||
"Пожалуйста, перейдите по ссылке с сайта для авторизации."
|
||
)
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_start_command_with_valid_token(self):
|
||
"""Test /start command with valid token"""
|
||
# Setup: add token to fake_db
|
||
test_token = "test-token-123"
|
||
fake_db[test_token] = {"status": "pending"}
|
||
|
||
# Create mock message
|
||
message = AsyncMock()
|
||
message.from_user.id = 12345
|
||
message.from_user.username = "test_user"
|
||
message.answer = AsyncMock()
|
||
|
||
# Create mock command object
|
||
command = MagicMock()
|
||
command.args = test_token
|
||
|
||
# Call the handler
|
||
await cmd_start(message, command)
|
||
|
||
# Verify the response
|
||
message.answer.assert_called_once_with(
|
||
"Успешная авторизация! Вернитесь на сайт, вас должно автоматически авторизовать."
|
||
)
|
||
|
||
# Verify fake_db was updated
|
||
assert fake_db[test_token]["status"] == "success"
|
||
assert fake_db[test_token]["telegram_id"] == 12345
|
||
assert fake_db[test_token]["username"] == "test_user"
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_start_command_with_invalid_token(self):
|
||
"""Test /start command with invalid token"""
|
||
# Create mock message
|
||
message = AsyncMock()
|
||
message.from_user.id = 12345
|
||
message.from_user.username = "test_user"
|
||
message.answer = AsyncMock()
|
||
|
||
# Create mock command object
|
||
command = MagicMock()
|
||
command.args = "invalid-token"
|
||
|
||
# Call the handler
|
||
await cmd_start(message, command)
|
||
|
||
# Verify the response
|
||
message.answer.assert_called_once_with(
|
||
"Ошибка: неверный или истекший токен."
|
||
)
|
||
|
||
# Verify fake_db was not updated
|
||
assert "invalid-token" not in fake_db
|
||
|
||
|
||
if __name__ == "__main__":
|
||
"""Run tests directly"""
|
||
print("Running bot tests...")
|
||
pytest.main([__file__, "-v"])
|
||
|