- Add missing TMDB async mock methods (_ensure_session, close)
to all TMDB mocks in test_nfo_workflow.py
- Refactor test_anime_add_nfo_isolation.py to mock get_nfo_factory()
instead of asserting on series_app.nfo_service directly
- Patch get_nfo_factory in test_background_loader_service.py
to align with factory-based NFOService creation
Fixes test failures caused by NFOService refactoring that introduced
explicit TMDB session lifecycle and NFO factory pattern.
Add comprehensive test coverage for Tasks 1.1–1.5 and 2.1:
- test_scheduler_config_model.py: folder_scan_enabled defaults, explicit
values, backward compatibility with old configs, serialization roundtrip
- test_folder_scan_service.py (new): prerequisites, NFO repair integration,
folder rename integration, poster check/download, semaphore values,
NFO thumb URL extraction, full end-to-end scan flow
- test_scheduler_service.py: scheduler _perform_rescan integration with
folder_scan_enabled (called when enabled, skipped when disabled, error
handling and broadcasting), folder_scan_enabled in get_status output
- test_nfo_repair_startup.py: verify perform_nfo_repair_scan is NOT called
during FastAPI lifespan startup and IS called from FolderScanService
All 90 tests pass.
- Fix structlog format string in folder_scan_service (%(key)d -> kwargs)
- Add nfo_download_poster setting check before poster download
- Create missing NFO fixture files (tvshow.nfo.bad/good) for repair tests
- Fix test_context_used_in_logging to check all call args not format string
- Fix test_system_settings_integration isolation via reset_all_scans
- Add showtitle and namedseason to mapper output
- Add multi-language fallback (en-US, ja-JP) for empty overview
- Use search result overview as last resort fallback
- Add tests for new NFO creation behavior
- Fixed _remove_episode_from_missing_list to also update in-memory
Serie.episodeDict and refresh series_list
- Added _remove_episode_from_memory helper method
- Enhanced logging for download completion and episode removal
- Added 5 unit tests for missing episode removal
When TMDB returns an empty German (de-DE) overview for anime (e.g.
Basilisk), the NFO plot tag was missing. Now both create and update
paths call _enrich_details_with_fallback() which fetches the English
(en-US) overview as a fallback.
Additionally, the <plot> XML element is always written (even when
empty) via the always_write parameter on _add_element(), ensuring
consistent NFO structure regardless of creation path.
Changes:
- nfo_service.py: add _enrich_details_with_fallback() method, call it
in create_tvshow_nfo and update_tvshow_nfo
- nfo_generator.py: add always_write param to _add_element(), use it
for <plot> tag
- test_nfo_service.py: add TestEnrichDetailsWithFallback with 4 tests
- Implement sync_single_series_after_scan to persist scanned series to database
- Enhanced _broadcast_series_updated to include full NFO metadata (nfo_created_at, nfo_updated_at, tmdb_id, tvdb_id)
- Add immediate episode scanning in add_series endpoint when background loader isn't running
- Implement updateSingleSeries in frontend to handle series_updated WebSocket events
- Add SERIES_UPDATED event constant to WebSocket event definitions
- Update background loader to use sync_single_series_after_scan method
- Simplified background loader initialization in FastAPI app
- Add comprehensive tests for series update WebSocket payload and episode counting logic
- Import reorganization: move get_background_loader_service to dependencies module
✅ COMPLETE: 18/18 tests passing
Test Coverage:
- Concurrent scan prevention: Second scan blocked, multiple attempts handled, lock released after completion
- Scan cancellation: Cancel active scan, cancel when none active, cancelled scans in history, new scan after cancellation
- Database race conditions: AsyncIO lock prevents races, scan state consistency with concurrent reads, thread-safe history updates
- Scan state consistency: is_scanning flag consistency, current_scan object consistency, status API consistency, concurrent status checks
- Scheduler prevention: Scheduler skips rescan if already running, properly sets scan_in_progress flag
- AnimeService: Ignores concurrent rescan requests
All concurrent operation scenarios validated with proper lock management and state consistency.
- Created tests/unit/test_nfo_batch_operations.py
* 19 comprehensive unit tests all passing
* Test concurrent operations with max_concurrent limits
* Test partial failure handling (continues processing)
* Test skip_existing and overwrite functionality
* Test media download options
* Test result accuracy and error messages
* Test edge cases (empty, single, large, duplicates)
- Updated docs/instructions.md
* Marked NFO batch operations tests as completed
* Documented 19/19 passing tests
- Implemented comprehensive test suite for NFO service
- 73 unit tests covering:
- FSK rating extraction from German content ratings
- Year extraction from series names with parentheses
- TMDB to NFO model conversion
- NFO file creation with TMDB integration
- NFO file updates with media refresh
- Media file downloads (poster, logo, fanart)
- NFO ID parsing (TMDB, TVDB, IMDb)
- Edge cases for empty data, malformed XML, missing fields
- Configuration options (image sizes, auto-create)
- File cleanup and close operations
Coverage: 90.65% (target: 80%+)
- Statements covered: 202/222
- Branches covered: 79/88
Test results: All 73 tests passing
- Mocked TMDB API client and image downloader
- Used AsyncMock for async operations
- Tested both success and error paths
- Verified concurrent operations work correctly
- Validated XML parsing and ID extraction