First commit
This commit is contained in:
168
test_bot.py
Normal file
168
test_bot.py
Normal file
@@ -0,0 +1,168 @@
|
||||
"""
|
||||
Tests for VNDB Telegram Bot
|
||||
"""
|
||||
import asyncio
|
||||
import pytest
|
||||
from vndb_client import VndbClient
|
||||
from config import Config
|
||||
from utils import Formatter, ErrorHandler, QueryBuilder
|
||||
|
||||
|
||||
class TestVndbClient:
|
||||
"""Test VNDB client functionality"""
|
||||
|
||||
@pytest.fixture
|
||||
def client(self):
|
||||
"""Create VNDB client instance"""
|
||||
return VndbClient()
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_stats(self, client):
|
||||
"""Test getting database statistics"""
|
||||
stats = await client.get_stats()
|
||||
assert "vn" in stats
|
||||
assert "chars" in stats
|
||||
assert isinstance(stats["vn"], int)
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_get_schema(self, client):
|
||||
"""Test getting API schema"""
|
||||
schema = await client.get_schema()
|
||||
assert "db_types" in schema
|
||||
assert "fields" in schema
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_query_vn(self, client):
|
||||
"""Test querying visual novels"""
|
||||
results = await client.query_vn(
|
||||
filters=[["id", "=", "v17"]],
|
||||
fields=["title", "original"]
|
||||
)
|
||||
assert "results" in results
|
||||
assert len(results["results"]) > 0
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_query_vn_search(self, client):
|
||||
"""Test searching visual novels"""
|
||||
results = await client.query_vn(
|
||||
filters=[["search", "=", "Steins"]],
|
||||
fields=["title", "rating"],
|
||||
results=5
|
||||
)
|
||||
assert "results" in results
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_query_character(self, client):
|
||||
"""Test querying characters"""
|
||||
results = await client.query_character(
|
||||
fields=["name", "gender"],
|
||||
results=5
|
||||
)
|
||||
assert "results" in results
|
||||
assert len(results["results"]) > 0
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_query_tag(self, client):
|
||||
"""Test querying tags"""
|
||||
results = await client.query_tag(
|
||||
fields=["name"],
|
||||
results=5
|
||||
)
|
||||
assert "results" in results
|
||||
assert len(results["results"]) > 0
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_query_quote(self, client):
|
||||
"""Test querying quotes"""
|
||||
results = await client.query_quote(
|
||||
fields=["quote", "character"],
|
||||
results=2
|
||||
)
|
||||
assert "results" in results
|
||||
|
||||
|
||||
class TestFormatter:
|
||||
"""Test formatter utilities"""
|
||||
|
||||
def test_truncate_text(self):
|
||||
"""Test text truncation"""
|
||||
text = "A" * 300
|
||||
truncated = Formatter.truncate_text(text, 100)
|
||||
assert len(truncated) <= 100
|
||||
assert truncated.endswith("...")
|
||||
|
||||
def test_truncate_text_short(self):
|
||||
"""Test truncation of short text"""
|
||||
text = "Short text"
|
||||
truncated = Formatter.truncate_text(text, 100)
|
||||
assert truncated == text
|
||||
|
||||
def test_format_vn_item(self):
|
||||
"""Test VN item formatting"""
|
||||
vn = {
|
||||
"id": "v17",
|
||||
"title": "Clannad",
|
||||
"original": "クラナド",
|
||||
"released": "2004-04-28",
|
||||
"rating": 85,
|
||||
"votecount": 1000
|
||||
}
|
||||
formatted = Formatter.format_vn_item(vn)
|
||||
assert "v17" in formatted
|
||||
assert "Clannad" in formatted
|
||||
assert "8.5" in formatted
|
||||
|
||||
|
||||
class TestErrorHandler:
|
||||
"""Test error handling utilities"""
|
||||
|
||||
def test_format_error_http_error(self):
|
||||
"""Test formatting HTTP error"""
|
||||
error = Exception("HTTP Error")
|
||||
formatted = ErrorHandler.format_error(error)
|
||||
assert isinstance(formatted, str)
|
||||
assert len(formatted) > 0
|
||||
|
||||
def test_format_error_value_error(self):
|
||||
"""Test formatting ValueError"""
|
||||
error = ValueError("Invalid value")
|
||||
formatted = ErrorHandler.format_error(error)
|
||||
assert "Invalid value" in formatted
|
||||
|
||||
|
||||
class TestQueryBuilder:
|
||||
"""Test query builder utilities"""
|
||||
|
||||
def test_build_search_filter(self):
|
||||
"""Test building search filter"""
|
||||
filter_result = QueryBuilder.build_search_filter("Clannad")
|
||||
assert filter_result == ["search", "=", "Clannad"]
|
||||
|
||||
def test_build_id_filter(self):
|
||||
"""Test building ID filter"""
|
||||
filter_result = QueryBuilder.build_id_filter("v17")
|
||||
assert filter_result == ["id", "=", "v17"]
|
||||
|
||||
def test_build_complex_filter(self):
|
||||
"""Test building complex filter"""
|
||||
filter1 = ["search", "=", "Clannad"]
|
||||
filter2 = ["lang", "=", "en"]
|
||||
complex_filter = QueryBuilder.build_complex_filter(filter1, filter2)
|
||||
assert complex_filter[0] == "and"
|
||||
assert len(complex_filter) == 3
|
||||
|
||||
|
||||
class TestConfig:
|
||||
"""Test configuration"""
|
||||
|
||||
def test_config_dict(self):
|
||||
"""Test configuration as dictionary"""
|
||||
config_dict = Config.to_dict()
|
||||
assert "TELEGRAM_BOT_TOKEN" in config_dict
|
||||
assert "VNDB_TOKEN" in config_dict
|
||||
assert "LOG_LEVEL" in config_dict
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Run tests with pytest
|
||||
pytest.main([__file__, "-v"])
|
||||
Reference in New Issue
Block a user