Files
meshcore-bot/tests/test_bridge_bot_responses.py
T
Stacy Olivas ae57e651ea test: expanded test suite for v0.9.0 modules
Command tests:
- tests/commands/: test_base_command, test_cmd_command, test_dice_command,
  test_hello_command, test_help_command, test_magic8_command,
  test_ping_command, test_roll_command
- tests/test_bridge_bot_responses, test_channel_manager_logic,
  test_checkin_service, test_command_manager, test_command_prefix,
  test_config_merge, test_config_validation, test_db_manager,
  test_plugin_loader, test_profanity_filter, test_security_utils,
  test_service_plugin_loader, test_utils

Integration and unit:
- tests/integration/: test_path_graph_integration, test_path_resolution
- tests/regression/: test_keyword_escapes
- tests/unit/: test_mesh_graph, test_mesh_graph_edges,
  test_mesh_graph_multihop, test_mesh_graph_optimizations,
  test_mesh_graph_scoring, test_mesh_graph_validation,
  test_path_command_graph, test_path_command_graph_selection,
  test_path_command_multibyte

Helpers: tests/conftest.py, tests/helpers.py
2026-03-17 18:07:18 -07:00

123 lines
5.6 KiB
Python

"""Tests for bridge bot-responses: channel_sent_listeners registration and cleanup."""
from configparser import ConfigParser
from unittest.mock import MagicMock, patch
import pytest
from modules.service_plugins.discord_bridge_service import DiscordBridgeService
from modules.service_plugins.telegram_bridge_service import TelegramBridgeService
@pytest.fixture
def bridge_mock_bot(mock_logger):
"""Mock bot for bridge service tests."""
bot = MagicMock()
bot.logger = mock_logger
bot.config = ConfigParser()
bot.config.add_section("DiscordBridge")
bot.config.set("DiscordBridge", "bridge_bot_responses", "true")
bot.config.add_section("TelegramBridge")
bot.config.set("TelegramBridge", "bridge_bot_responses", "true")
bot.config.set("TelegramBridge", "api_token", "test-token")
bot.channel_sent_listeners = []
bot.meshcore = MagicMock()
return bot
class TestDiscordBridgeBotResponses:
"""Discord bridge: register/unregister channel_sent_listeners and bridge_bot_responses config."""
@pytest.mark.asyncio
async def test_start_registers_listener_when_bridge_bot_responses_true(self, bridge_mock_bot, mock_logger):
bridge_mock_bot.config.set("DiscordBridge", "bridge_bot_responses", "true")
with patch.object(DiscordBridgeService, "_load_channel_mappings", return_value=None):
service = DiscordBridgeService(bridge_mock_bot)
service.channel_webhooks = {"general": "https://discord.com/api/webhooks/123/abc"}
service.bridge_bot_responses = True
bridge_mock_bot.channel_sent_listeners = []
with patch.object(service, "http_session", None), patch(
"modules.service_plugins.discord_bridge_service.AIOHTTP_AVAILABLE", True
):
await service.start()
assert service._on_mesh_channel_message in bridge_mock_bot.channel_sent_listeners
@pytest.mark.asyncio
async def test_stop_unregisters_listener(self, bridge_mock_bot, mock_logger):
with patch.object(DiscordBridgeService, "_load_channel_mappings", return_value=None):
service = DiscordBridgeService(bridge_mock_bot)
service.channel_webhooks = {"general": "https://discord.com/api/webhooks/123/abc"}
bridge_mock_bot.channel_sent_listeners = [service._on_mesh_channel_message]
await service.stop()
assert service._on_mesh_channel_message not in bridge_mock_bot.channel_sent_listeners
@pytest.mark.asyncio
async def test_start_does_not_register_when_bridge_bot_responses_false(self, bridge_mock_bot, mock_logger):
bridge_mock_bot.config.set("DiscordBridge", "bridge_bot_responses", "false")
with patch.object(DiscordBridgeService, "_load_channel_mappings", return_value=None):
service = DiscordBridgeService(bridge_mock_bot)
service.channel_webhooks = {"general": "https://discord.com/api/webhooks/123/abc"}
service.bridge_bot_responses = False
bridge_mock_bot.channel_sent_listeners = []
with patch.object(service, "http_session", None), patch(
"modules.service_plugins.discord_bridge_service.AIOHTTP_AVAILABLE", True
):
await service.start()
assert len(bridge_mock_bot.channel_sent_listeners) == 0
class TestTelegramBridgeBotResponses:
"""Telegram bridge: register/unregister channel_sent_listeners and bridge_bot_responses config."""
@pytest.mark.asyncio
async def test_start_registers_listener_when_bridge_bot_responses_true(self, bridge_mock_bot, mock_logger):
bridge_mock_bot.config.set("TelegramBridge", "bridge_bot_responses", "true")
with patch.object(TelegramBridgeService, "_load_channel_mappings", return_value=None):
service = TelegramBridgeService(bridge_mock_bot)
service.channel_chat_ids = {"general": "@general"}
service.bridge_bot_responses = True
bridge_mock_bot.channel_sent_listeners = []
service.api_token = "test-token"
with patch.object(service, "http_session", None), patch(
"modules.service_plugins.telegram_bridge_service.AIOHTTP_AVAILABLE", True
):
await service.start()
assert service._on_mesh_channel_message in bridge_mock_bot.channel_sent_listeners
@pytest.mark.asyncio
async def test_stop_unregisters_listener(self, bridge_mock_bot, mock_logger):
with patch.object(TelegramBridgeService, "_load_channel_mappings", return_value=None):
service = TelegramBridgeService(bridge_mock_bot)
service.channel_chat_ids = {"general": "@general"}
service.api_token = "test-token"
bridge_mock_bot.channel_sent_listeners = [service._on_mesh_channel_message]
await service.stop()
assert service._on_mesh_channel_message not in bridge_mock_bot.channel_sent_listeners
@pytest.mark.asyncio
async def test_start_does_not_register_when_bridge_bot_responses_false(self, bridge_mock_bot, mock_logger):
bridge_mock_bot.config.set("TelegramBridge", "bridge_bot_responses", "false")
with patch.object(TelegramBridgeService, "_load_channel_mappings", return_value=None):
service = TelegramBridgeService(bridge_mock_bot)
service.channel_chat_ids = {"general": "@general"}
service.api_token = "test-token"
service.bridge_bot_responses = False
bridge_mock_bot.channel_sent_listeners = []
with patch.object(service, "http_session", None), patch(
"modules.service_plugins.telegram_bridge_service.AIOHTTP_AVAILABLE", True
):
await service.start()
assert len(bridge_mock_bot.channel_sent_listeners) == 0