- Updated AGENTS.md to reflect changes in CLI commands and module organization, including the addition of an enrichment step and new functional modules. - Introduced analysis.json, identities.json, inventory.csv, and plan.json to support enriched metadata and execution planning. - Added CODE_IMPROVEMENTS.md to document identified code issues and proposed solutions for future enhancements. - Updated README.md to include new enrichment features and configuration options. - Removed unused dependency on ffmpeg-python from pyproject.toml. These changes improve the overall functionality and maintainability of the Video Library Manager project.
146 lines
5.9 KiB
Python
146 lines
5.9 KiB
Python
"""Integration tests for report generation with analysis engine.
|
|
|
|
Tests the complete workflow from analysis to report generation.
|
|
"""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
from vlm.models import SeriesIdentity, VideoFile, MovieIdentity
|
|
from vlm.analysis import analyze_series_completeness, detect_duplicates
|
|
from vlm.reports import generate_completeness_report, generate_duplicate_report, generate_summary_report
|
|
|
|
|
|
class TestReportsIntegration:
|
|
"""Test report generation integrated with analysis engine."""
|
|
|
|
def test_completeness_workflow(self):
|
|
"""Test complete workflow from series analysis to completeness report."""
|
|
# Create test episodes with gaps
|
|
episodes = [
|
|
SeriesIdentity("Breaking Bad", 1, [1], 0.9, False, "Breaking.Bad.S01E01.mkv"),
|
|
SeriesIdentity("Breaking Bad", 1, [2], 0.9, False, "Breaking.Bad.S01E02.mkv"),
|
|
SeriesIdentity("Breaking Bad", 1, [4], 0.9, False, "Breaking.Bad.S01E04.mkv"),
|
|
SeriesIdentity("The Wire", 1, [1], 0.9, False, "The.Wire.S01E01.mkv"),
|
|
SeriesIdentity("The Wire", 1, [3], 0.9, False, "The.Wire.S01E03.mkv"),
|
|
]
|
|
|
|
# Analyze completeness
|
|
analysis = analyze_series_completeness(episodes)
|
|
|
|
# Generate text report
|
|
library_root = Path("/mnt/nas/videos")
|
|
text_report = generate_completeness_report(analysis, "text", library_root)
|
|
|
|
# Verify report contains expected information
|
|
assert "Breaking Bad" in text_report
|
|
assert "The Wire" in text_report
|
|
assert "Episodes missing:" in text_report
|
|
|
|
# Generate JSON report
|
|
json_report = generate_completeness_report(analysis, "json", library_root)
|
|
data = json.loads(json_report)
|
|
|
|
# Verify JSON structure
|
|
assert data["metadata"]["series_count"] == 2
|
|
assert len(data["series"]) == 2
|
|
|
|
def test_duplicate_workflow(self):
|
|
"""Test complete workflow from duplicate detection to duplicate report."""
|
|
# Create test identities and files
|
|
identities = [
|
|
MovieIdentity("The Matrix", 1999, 0.9, False, "The.Matrix.1999.1080p.mkv"),
|
|
MovieIdentity("The Matrix", 1999, 0.9, False, "The.Matrix.1999.720p.mkv"),
|
|
MovieIdentity("Inception", 2010, 0.9, False, "Inception.2010.mkv"),
|
|
]
|
|
|
|
files = [
|
|
VideoFile(
|
|
Path("/movies/The.Matrix.1999.1080p.mkv"),
|
|
"The.Matrix.1999.1080p.mkv",
|
|
2000000000,
|
|
datetime.now(),
|
|
"movie",
|
|
resolution="1920x1080",
|
|
codec="h264"
|
|
),
|
|
VideoFile(
|
|
Path("/movies/The.Matrix.1999.720p.mkv"),
|
|
"The.Matrix.1999.720p.mkv",
|
|
1000000000,
|
|
datetime.now(),
|
|
"movie",
|
|
resolution="1280x720",
|
|
codec="h264"
|
|
),
|
|
VideoFile(
|
|
Path("/movies/Inception.2010.mkv"),
|
|
"Inception.2010.mkv",
|
|
1500000000,
|
|
datetime.now(),
|
|
"movie"
|
|
),
|
|
]
|
|
|
|
# Detect duplicates
|
|
duplicates = detect_duplicates(list(zip(identities, files)))
|
|
|
|
# Generate text report
|
|
library_root = Path("/mnt/nas/videos")
|
|
text_report = generate_duplicate_report(duplicates, "text", library_root)
|
|
|
|
# Verify report contains expected information
|
|
assert "The Matrix (1999)" in text_report
|
|
assert "1920x1080" in text_report
|
|
assert "1280x720" in text_report
|
|
|
|
# Generate JSON report
|
|
json_report = generate_duplicate_report(duplicates, "json", library_root)
|
|
data = json.loads(json_report)
|
|
|
|
# Verify JSON structure
|
|
assert data["metadata"]["duplicate_groups"] == 1
|
|
assert len(data["duplicates"]) == 1
|
|
assert data["duplicates"][0]["file_count"] == 2
|
|
|
|
def test_summary_workflow(self):
|
|
"""Test summary report generation with mixed file types."""
|
|
# Create test files
|
|
files = [
|
|
VideoFile(Path("/movies/Movie1.mkv"), "Movie1.mkv", 2000000000, datetime.now(), "movie"),
|
|
VideoFile(Path("/movies/Movie2.mkv"), "Movie2.mkv", 1500000000, datetime.now(), "movie"),
|
|
VideoFile(Path("/series/Show.S01E01.mkv"), "Show.S01E01.mkv", 1000000000, datetime.now(), "series"),
|
|
VideoFile(Path("/series/Show.S01E02.mkv"), "Show.S01E02.mkv", 1000000000, datetime.now(), "series"),
|
|
VideoFile(Path("/anime/Anime1.mkv"), "Anime1.mkv", 800000000, datetime.now(), "anime"),
|
|
]
|
|
|
|
# Generate summary report
|
|
library_root = Path("/mnt/nas/videos")
|
|
report = generate_summary_report(files, library_root)
|
|
|
|
# Verify report contains expected information
|
|
assert "Total Files: 5" in report
|
|
assert "Movie:" in report
|
|
assert "Series:" in report
|
|
assert "Anime:" in report
|
|
assert "Category Breakdown:" in report
|
|
|
|
def test_all_reports_include_metadata(self):
|
|
"""Test that all reports include generation timestamp and library root."""
|
|
library_root = Path("/mnt/nas/videos")
|
|
|
|
# Test completeness report
|
|
completeness_report = generate_completeness_report([], "text", library_root)
|
|
assert "Generated:" in completeness_report
|
|
assert str(library_root) in completeness_report
|
|
|
|
# Test duplicate report
|
|
duplicate_report = generate_duplicate_report([], "text", library_root)
|
|
assert "Generated:" in duplicate_report
|
|
assert str(library_root) in duplicate_report
|
|
|
|
# Test summary report
|
|
summary_report = generate_summary_report([], library_root)
|
|
assert "Generated:" in summary_report
|
|
assert str(library_root) in summary_report
|