refactor(scheduler): separate scheduler logic from scan/rescan logic
- Extract rescan logic into new RescanService (src/server/services/rescan_service.py) - SchedulerService now only handles APScheduler cron scheduling - Move scheduler sub-services (folder_rename, folder_scan, key_resolution) to scheduler/ folder - Keep RescanOrchestrator as backward-compatible alias - Update all imports across api/, server/, and test files
This commit is contained in:
@@ -15,7 +15,7 @@ import pytest
|
||||
from apscheduler.triggers.cron import CronTrigger
|
||||
|
||||
from src.server.models.config import AppConfig, SchedulerConfig
|
||||
from src.server.services.scheduler_service import (
|
||||
from src.server.services.scheduler.scheduler_service import (
|
||||
_JOB_ID,
|
||||
SchedulerService,
|
||||
SchedulerServiceError,
|
||||
@@ -36,7 +36,7 @@ def _make_app_config(**scheduler_kwargs) -> AppConfig:
|
||||
|
||||
@pytest.fixture
|
||||
def mock_config_service():
|
||||
with patch("src.server.services.scheduler_service.get_config_service") as mock:
|
||||
with patch("src.server.services.scheduler.scheduler_service.get_config_service") as mock:
|
||||
svc = Mock()
|
||||
svc.load_config.return_value = _make_app_config(
|
||||
enabled=True,
|
||||
@@ -105,7 +105,7 @@ class TestStart:
|
||||
self, scheduler_service, mock_config_service
|
||||
):
|
||||
with patch(
|
||||
"src.server.services.scheduler_service.AsyncIOScheduler"
|
||||
"src.server.services.scheduler.scheduler_service.AsyncIOScheduler"
|
||||
) as MockScheduler:
|
||||
mock_sched = MagicMock()
|
||||
mock_sched.running = False
|
||||
@@ -137,9 +137,9 @@ class TestStartEmptyDays:
|
||||
@pytest.mark.asyncio
|
||||
async def test_no_job_added_when_days_empty(self, scheduler_service):
|
||||
with patch(
|
||||
"src.server.services.scheduler_service.get_config_service"
|
||||
"src.server.services.scheduler.scheduler_service.get_config_service"
|
||||
) as mock_cs, patch(
|
||||
"src.server.services.scheduler_service.AsyncIOScheduler"
|
||||
"src.server.services.scheduler.scheduler_service.AsyncIOScheduler"
|
||||
) as MockScheduler:
|
||||
svc = Mock()
|
||||
svc.load_config.return_value = _make_app_config(
|
||||
@@ -409,7 +409,7 @@ class TestPerformRescanFolderScan:
|
||||
|
||||
with patch("src.server.utils.dependencies.get_anime_service", return_value=mock_anime), \
|
||||
patch("src.server.services.websocket_service.get_websocket_service", return_value=mock_ws), \
|
||||
patch("src.server.services.folder_scan_service.FolderScanService") as MockFSS:
|
||||
patch("src.server.services.scheduler.folder_scan_service.FolderScanService") as MockFSS:
|
||||
MockFSS.return_value.run_folder_scan = mock_folder_scan
|
||||
await scheduler_service._perform_rescan()
|
||||
|
||||
@@ -434,7 +434,7 @@ class TestPerformRescanFolderScan:
|
||||
|
||||
with patch("src.server.utils.dependencies.get_anime_service", return_value=mock_anime), \
|
||||
patch("src.server.services.websocket_service.get_websocket_service", return_value=mock_ws), \
|
||||
patch("src.server.services.folder_scan_service.FolderScanService") as MockFSS:
|
||||
patch("src.server.services.scheduler.folder_scan_service.FolderScanService") as MockFSS:
|
||||
MockFSS.return_value.run_folder_scan = mock_folder_scan
|
||||
await scheduler_service._perform_rescan()
|
||||
|
||||
@@ -459,7 +459,7 @@ class TestPerformRescanFolderScan:
|
||||
|
||||
with patch("src.server.utils.dependencies.get_anime_service", return_value=mock_anime), \
|
||||
patch("src.server.services.websocket_service.get_websocket_service", return_value=mock_ws), \
|
||||
patch("src.server.services.folder_scan_service.FolderScanService") as MockFSS:
|
||||
patch("src.server.services.scheduler.folder_scan_service.FolderScanService") as MockFSS:
|
||||
MockFSS.return_value.run_folder_scan = mock_folder_scan
|
||||
# Should NOT raise
|
||||
await scheduler_service._perform_rescan()
|
||||
@@ -498,7 +498,7 @@ class TestInMemoryJobStore:
|
||||
self, scheduler_service, mock_config_service
|
||||
):
|
||||
with patch(
|
||||
"src.server.services.scheduler_service.AsyncIOScheduler"
|
||||
"src.server.services.scheduler.scheduler_service.AsyncIOScheduler"
|
||||
) as MockScheduler:
|
||||
mock_sched = MagicMock()
|
||||
mock_sched.running = False
|
||||
@@ -517,7 +517,7 @@ class TestInMemoryJobStore:
|
||||
self, scheduler_service, mock_config_service
|
||||
):
|
||||
with patch(
|
||||
"src.server.services.scheduler_service.AsyncIOScheduler"
|
||||
"src.server.services.scheduler.scheduler_service.AsyncIOScheduler"
|
||||
) as MockScheduler:
|
||||
mock_sched = MagicMock()
|
||||
mock_sched.running = False
|
||||
@@ -540,7 +540,7 @@ class TestStartupRecovery:
|
||||
self, scheduler_service, mock_config_service
|
||||
):
|
||||
with patch(
|
||||
"src.server.services.scheduler_service.AsyncIOScheduler"
|
||||
"src.server.services.scheduler.scheduler_service.AsyncIOScheduler"
|
||||
) as MockScheduler:
|
||||
mock_job = MagicMock()
|
||||
next_run_dt = datetime(2026, 5, 25, 3, 0, tzinfo=timezone.utc)
|
||||
@@ -551,7 +551,7 @@ class TestStartupRecovery:
|
||||
MockScheduler.return_value = mock_sched
|
||||
|
||||
with patch(
|
||||
"src.server.services.scheduler_service.logger"
|
||||
"src.server.services.scheduler.scheduler_service.logger"
|
||||
) as mock_logger:
|
||||
await scheduler_service.start()
|
||||
info_calls = [str(c) for c in mock_logger.info.call_args_list]
|
||||
|
||||
Reference in New Issue
Block a user