- Core infrastructure: config, state management, models - REST API server (aiohttp) with Discord-compatible endpoints - WebSocket Gateway server (websockets) with Discord Gateway protocol - State management with guilds, channels, users, messages, interactions - Pydantic models for Discord objects (User, Guild, Channel, Message, etc.) - CLI with start, test, reset, export, validate commands - YAML-based test scenario framework - Basic test scenario for /server_status command flow - Unit tests for models and state manager (19 passing) - GPL-3.0 license
83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
"""Tests for State Manager"""
|
|
|
|
import pytest
|
|
from apicord.config import EmulatorConfig
|
|
from apicord.state.manager import StateManager
|
|
from apicord.models.discord import User, Role, Channel, ChannelType, Guild
|
|
|
|
|
|
class TestStateManager:
|
|
@pytest.fixture
|
|
def config(self):
|
|
return EmulatorConfig(
|
|
bot_token="test_token_123",
|
|
bot_id="444444444444444444",
|
|
persist_state=False,
|
|
)
|
|
|
|
@pytest.fixture
|
|
async def state_manager(self, config):
|
|
manager = StateManager(config)
|
|
await manager.create_default_state(guilds=1, channels_per_guild=2, users=3)
|
|
return manager
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_create_default_state(self, state_manager):
|
|
assert len(state_manager.guilds) == 1
|
|
assert len(state_manager.channels) == 2
|
|
assert len(state_manager.users) == 4 # 3 test users + bot
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_bot_user_created(self, state_manager):
|
|
bot = state_manager.get_bot_user()
|
|
assert bot is not None
|
|
assert bot.id == "444444444444444444"
|
|
assert bot.username == "TestBot"
|
|
assert bot.bot is True
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_guild(self, state_manager):
|
|
guild = state_manager.get_guild(list(state_manager.guilds.keys())[0])
|
|
assert guild is not None
|
|
assert isinstance(guild, Guild)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_channel(self, state_manager):
|
|
channel = state_manager.get_channel(list(state_manager.channels.keys())[0])
|
|
assert channel is not None
|
|
assert isinstance(channel, Channel)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_get_user(self, state_manager):
|
|
user = state_manager.get_user(list(state_manager.users.keys())[0])
|
|
assert user is not None
|
|
assert isinstance(user, User)
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_add_message(self, state_manager):
|
|
from apicord.models.discord import Message
|
|
from datetime import datetime
|
|
|
|
channel_id = list(state_manager.channels.keys())[0]
|
|
message = Message(
|
|
id="999999999999999999",
|
|
channel_id=channel_id,
|
|
author=state_manager.get_bot_user(),
|
|
content="Test message",
|
|
timestamp=datetime.utcnow().isoformat() + "Z",
|
|
)
|
|
state_manager.add_message(message)
|
|
|
|
retrieved = state_manager.get_message(message.id)
|
|
assert retrieved is not None
|
|
assert retrieved.content == "Test message"
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_state_summary(self, state_manager):
|
|
summary = state_manager.get_state_summary()
|
|
assert "guilds" in summary
|
|
assert "channels" in summary
|
|
assert "users" in summary
|
|
assert summary["guilds"] == 1
|
|
assert summary["channels"] == 2
|
|
assert summary["users"] == 4 # 3 + bot |