Files
astrbot_plugin_qq_group_dai…/tests/verify_docker.py
T

136 lines
5.1 KiB
Python

import sys
import asyncio
import unittest
from unittest.mock import MagicMock, AsyncMock, patch
# Add paths for Docker environment
sys.path.append("/AstrBot")
sys.path.append("/AstrBot/data/plugins") # Ensure we can import the plugin as a package
# Import real modules using package path
try:
from astrbot_plugin_qq_group_daily_analysis.src.scheduler.auto_scheduler import (
AutoScheduler,
)
from astrbot_plugin_qq_group_daily_analysis.main import QQGroupDailyAnalysis
from astrbot.api.event import filter
except ImportError as e:
print(f"ImportError in Docker: {e}")
# Fallback to local paths if testing locally
sys.path.append(r"c:\Helianthus\astrpro\AstrBot-master\data\plugins")
from astrbot_plugin_qq_group_daily_analysis.src.scheduler.auto_scheduler import (
AutoScheduler,
)
from astrbot_plugin_qq_group_daily_analysis.main import QQGroupDailyAnalysis
from astrbot.api.event import filter
class TestPhase3Docker(unittest.IsolatedAsyncioTestCase):
async def test_schedule_jobs(self):
"""Test that schedule_jobs correctly adds jobs to APScheduler."""
# Mocks for Logic only
config_manager = MagicMock()
config_manager.get_enable_auto_analysis.return_value = True
config_manager.get_auto_analysis_time.return_value = ["09:00", "18:30"]
context = MagicMock()
scheduler = MagicMock()
context.cron_manager.scheduler = scheduler
# Instantiate AutoScheduler
auto_scheduler = AutoScheduler(
config_manager,
MagicMock(), # message_handler
MagicMock(), # analyzer
MagicMock(), # report_generator
MagicMock(), # bot_manager
MagicMock(), # retry_manager
)
# Call schedule_jobs
auto_scheduler.schedule_jobs(context)
# Verify add_job was called twice
self.assertEqual(scheduler.add_job.call_count, 2)
# Verify call arguments
args, kwargs = scheduler.add_job.call_args_list[0]
self.assertEqual(
kwargs["id"], "astrbot_plugin_qq_group_daily_analysis_trigger_0"
)
# Verify trigger via string representation to avoid attribute errors with real CronTrigger objects
trigger_str = str(kwargs["trigger"])
self.assertTrue(
"hour='9'" in trigger_str or "hour=9" in trigger_str,
f"Trigger mismatch: {trigger_str}",
)
self.assertTrue(
"minute='0'" in trigger_str or "minute=0" in trigger_str,
f"Trigger mismatch: {trigger_str}",
)
args, kwargs = scheduler.add_job.call_args_list[1]
self.assertEqual(
kwargs["id"], "astrbot_plugin_qq_group_daily_analysis_trigger_1"
)
trigger_str = str(kwargs["trigger"])
self.assertTrue(
"hour='18'" in trigger_str or "hour=18" in trigger_str,
f"Trigger mismatch: {trigger_str}",
)
self.assertTrue(
"minute='30'" in trigger_str or "minute=30" in trigger_str,
f"Trigger mismatch: {trigger_str}",
)
async def test_main_on_platform_loaded(self):
"""Test that main.py's on_platform_loaded triggers job scheduling."""
context = MagicMock()
config = MagicMock()
# Patch dependencies in main.py using full package path
with (
patch(
"astrbot_plugin_qq_group_daily_analysis.main.ConfigManager"
) as MockConfigManager,
patch(
"astrbot_plugin_qq_group_daily_analysis.main.BotManager"
) as MockBotManager,
patch(
"astrbot_plugin_qq_group_daily_analysis.main.MessageAnalyzer"
) as MockMessageAnalyzer,
patch(
"astrbot_plugin_qq_group_daily_analysis.main.ReportGenerator"
) as MockReportGenerator,
patch(
"astrbot_plugin_qq_group_daily_analysis.main.RetryManager"
) as MockRetryManager,
patch(
"astrbot_plugin_qq_group_daily_analysis.main.AutoScheduler"
) as MockAutoScheduler,
):
mock_auto_scheduler_instance = MockAutoScheduler.return_value
mock_config_instance = MockConfigManager.return_value
mock_config_instance.get_enable_auto_analysis.return_value = True
mock_bot_manager_instance = MockBotManager.return_value
mock_bot_manager_instance.initialize_from_config = AsyncMock(
return_value={"test_platform": MagicMock()}
)
# Instantiate plugin
plugin = QQGroupDailyAnalysis(context, config)
# Call on_platform_loaded
event = MagicMock()
await plugin.on_platform_loaded(event)
# Verify initialized_from_config called
mock_bot_manager_instance.initialize_from_config.assert_called_once()
# Verify schedule_jobs called
mock_auto_scheduler_instance.schedule_jobs.assert_called_once_with(context)
if __name__ == "__main__":
unittest.main()