|
|
|
"""
|
|
Unit Tests for Service Layer Components
|
|
|
|
Tests individual service components in isolation.
|
|
"""
|
|
|
|
import pytest
|
|
import sys
|
|
import os
|
|
from unittest.mock import Mock, patch
|
|
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
|
|
|
|
from src.services.player_service import PlayerService
|
|
from src.services.chat_service import ChatService
|
|
from src.services.npc_service import NPCService
|
|
from src.services.mcp_service import MCPService
|
|
from src.services.plugin_service import PluginService
|
|
|
|
|
|
@pytest.mark.unit
|
|
class TestPlayerService:
|
|
"""Test player service functionality."""
|
|
|
|
def test_player_service_initialization(self):
|
|
"""Test player service initializes correctly."""
|
|
service = PlayerService()
|
|
assert service is not None
|
|
assert hasattr(service, 'players')
|
|
|
|
def test_create_player(self):
|
|
"""Test player creation."""
|
|
service = PlayerService()
|
|
player_id = service.create_player("TestPlayer")
|
|
assert player_id is not None
|
|
assert player_id in service.players
|
|
assert service.players[player_id]['name'] == "TestPlayer"
|
|
|
|
def test_get_player(self):
|
|
"""Test player retrieval."""
|
|
service = PlayerService()
|
|
player_id = service.create_player("TestPlayer")
|
|
player = service.get_player(player_id)
|
|
assert player is not None
|
|
assert player['name'] == "TestPlayer"
|
|
|
|
def test_get_all_players(self):
|
|
"""Test getting all players."""
|
|
service = PlayerService()
|
|
player_id1 = service.create_player("Player1")
|
|
player_id2 = service.create_player("Player2")
|
|
|
|
all_players = service.get_all_players()
|
|
assert len(all_players) == 2
|
|
assert player_id1 in all_players
|
|
assert player_id2 in all_players
|
|
|
|
def test_remove_player(self):
|
|
"""Test player removal."""
|
|
service = PlayerService()
|
|
player_id = service.create_player("TestPlayer")
|
|
assert player_id in service.players
|
|
|
|
service.remove_player(player_id)
|
|
assert player_id not in service.players
|
|
|
|
def test_move_player(self):
|
|
"""Test player movement."""
|
|
service = PlayerService()
|
|
player_id = service.create_player("TestPlayer")
|
|
|
|
|
|
player = service.get_player(player_id)
|
|
initial_x, initial_y = player['x'], player['y']
|
|
|
|
|
|
success = service.move_player(player_id, "right")
|
|
assert success
|
|
|
|
|
|
player = service.get_player(player_id)
|
|
assert player['x'] == initial_x + 1
|
|
assert player['y'] == initial_y
|
|
|
|
|
|
@pytest.mark.unit
|
|
class TestChatService:
|
|
"""Test chat service functionality."""
|
|
|
|
def test_chat_service_initialization(self):
|
|
"""Test chat service initializes correctly."""
|
|
service = ChatService()
|
|
assert service is not None
|
|
assert hasattr(service, 'messages')
|
|
|
|
def test_send_public_message(self):
|
|
"""Test sending public messages."""
|
|
service = ChatService()
|
|
message_id = service.send_public_message("player1", "Hello everyone!")
|
|
|
|
assert message_id is not None
|
|
messages = service.get_recent_messages()
|
|
assert len(messages) > 0
|
|
assert any(msg['content'] == "Hello everyone!" for msg in messages)
|
|
|
|
def test_send_private_message(self):
|
|
"""Test sending private messages."""
|
|
service = ChatService()
|
|
message_id = service.send_private_message("player1", "player2", "Hello privately!")
|
|
|
|
assert message_id is not None
|
|
private_messages = service.get_private_messages("player1", "player2")
|
|
assert len(private_messages) > 0
|
|
assert any(msg['content'] == "Hello privately!" for msg in private_messages)
|
|
|
|
def test_get_recent_messages(self):
|
|
"""Test getting recent messages."""
|
|
service = ChatService()
|
|
service.send_public_message("player1", "Message 1")
|
|
service.send_public_message("player2", "Message 2")
|
|
|
|
messages = service.get_recent_messages(limit=10)
|
|
assert len(messages) >= 2
|
|
assert any(msg['content'] == "Message 1" for msg in messages)
|
|
assert any(msg['content'] == "Message 2" for msg in messages)
|
|
|
|
|
|
@pytest.mark.unit
|
|
class TestNPCService:
|
|
"""Test NPC service functionality."""
|
|
|
|
def test_npc_service_initialization(self):
|
|
"""Test NPC service initializes correctly."""
|
|
service = NPCService()
|
|
assert service is not None
|
|
assert hasattr(service, 'npcs')
|
|
|
|
def test_get_all_npcs(self):
|
|
"""Test getting all NPCs."""
|
|
service = NPCService()
|
|
npcs = service.get_all_npcs()
|
|
assert isinstance(npcs, dict)
|
|
|
|
assert len(npcs) > 0
|
|
|
|
def test_donald_npc_exists(self):
|
|
"""Test that Donald NPC is properly initialized."""
|
|
service = NPCService()
|
|
npcs = service.get_all_npcs()
|
|
|
|
|
|
donald_exists = any(npc.get('id') == 'donald' for npc in npcs.values())
|
|
assert donald_exists, "Donald NPC should exist"
|
|
|
|
|
|
donald_npc = next((npc for npc in npcs.values() if npc.get('id') == 'donald'), None)
|
|
assert donald_npc is not None
|
|
assert donald_npc['name'] == 'Donald the Trader'
|
|
assert donald_npc['char'] == '💼'
|
|
|
|
def test_get_npc_by_id(self):
|
|
"""Test getting NPC by ID."""
|
|
service = NPCService()
|
|
donald = service.get_npc_by_id('donald')
|
|
assert donald is not None
|
|
assert donald['name'] == 'Donald the Trader'
|
|
|
|
|
|
@pytest.mark.unit
|
|
class TestMCPService:
|
|
"""Test MCP service functionality."""
|
|
|
|
def test_mcp_service_initialization(self):
|
|
"""Test MCP service initializes correctly."""
|
|
service = MCPService()
|
|
assert service is not None
|
|
|
|
def test_register_ai_agent(self):
|
|
"""Test AI agent registration."""
|
|
service = MCPService()
|
|
agent_id = "test_agent"
|
|
capabilities = ["chat", "move"]
|
|
|
|
success = service.register_ai_agent(agent_id, capabilities)
|
|
assert success
|
|
|
|
def test_get_game_state(self):
|
|
"""Test getting game state."""
|
|
service = MCPService()
|
|
game_state = service.get_game_state()
|
|
|
|
assert isinstance(game_state, dict)
|
|
assert 'players' in game_state
|
|
assert 'npcs' in game_state
|
|
assert 'world' in game_state
|
|
|
|
|
|
@pytest.mark.unit
|
|
class TestPluginService:
|
|
"""Test plugin service functionality."""
|
|
|
|
def test_plugin_service_initialization(self):
|
|
"""Test plugin service initializes correctly."""
|
|
service = PluginService()
|
|
assert service is not None
|
|
assert hasattr(service, '_loaded_plugins')
|
|
|
|
def test_load_plugins(self):
|
|
"""Test plugin loading."""
|
|
service = PluginService()
|
|
|
|
|
|
with patch('os.path.exists') as mock_exists, \
|
|
patch('os.listdir') as mock_listdir, \
|
|
patch('importlib.util.spec_from_file_location') as mock_spec:
|
|
|
|
mock_exists.return_value = True
|
|
mock_listdir.return_value = ['test_plugin.py']
|
|
|
|
|
|
mock_module = Mock()
|
|
mock_spec.return_value.loader.load_module.return_value = mock_module
|
|
|
|
service.load_plugins()
|
|
assert len(service._loaded_plugins) >= 0
|
|
|
|
def test_get_loaded_plugins(self):
|
|
"""Test getting loaded plugins."""
|
|
service = PluginService()
|
|
plugins = service.get_loaded_plugins()
|
|
assert isinstance(plugins, dict)
|
|
|
|
def test_plugin_directory_exists(self):
|
|
"""Test that plugin directory exists."""
|
|
plugins_dir = os.path.join(
|
|
os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
|
|
'plugins'
|
|
)
|
|
assert os.path.exists(plugins_dir), "Plugins directory should exist"
|
|
|
|
|
|
expected_plugins = [
|
|
'sample_plugin.py',
|
|
'trading_system_plugin.py',
|
|
'weather_plugin.py',
|
|
'enhanced_chat_plugin.py'
|
|
]
|
|
|
|
for plugin_file in expected_plugins:
|
|
plugin_path = os.path.join(plugins_dir, plugin_file)
|
|
assert os.path.exists(plugin_path), f"Plugin {plugin_file} should exist"
|
|
|