Cybersecurity-Projects/PROJECTS/beginner/metadata-scrubber-tool/tests/integration/test_metadata_factory.py

322 lines
9.5 KiB
Python

"""
Integration tests for MetadataFactory.
Tests the factory pattern integration with all handler types (Image, PDF, Excel).
"""
import shutil
from pathlib import Path
import pytest
from src.core.jpeg_metadata import JpegProcessor
from src.core.png_metadata import PngProcessor
from src.services.excel_handler import ExcelHandler
from src.services.metadata_factory import MetadataFactory
from src.services.pdf_handler import PDFHandler
from src.utils.exceptions import UnsupportedFormatError
# Import path helpers from conftest
from tests.conftest import (
get_jpg_test_file,
get_pdf_test_file,
get_png_test_file,
get_xlsx_test_file,
)
# Test file paths (cross-platform)
JPG_TEST_FILE = get_jpg_test_file()
PNG_TEST_FILE = get_png_test_file()
PDF_TEST_FILE = get_pdf_test_file()
XLSX_TEST_FILE = get_xlsx_test_file()
# ============== Image Tests ==============
@pytest.mark.parametrize("x", [JPG_TEST_FILE, PNG_TEST_FILE])
def test_read_image_metadata(x):
"""Test reading image metadata through factory."""
assert Path(x).exists(), f"Test file not found: {x}"
handler = MetadataFactory.get_handler(str(x))
metadata = handler.read()
assert handler.metadata == metadata
assert isinstance(metadata, dict)
if isinstance(handler, JpegProcessor | PngProcessor):
assert (
handler.tags_to_delete is not None or handler.text_keys_to_delete is not None
)
@pytest.mark.parametrize("x", [JPG_TEST_FILE, PNG_TEST_FILE])
def test_wipe_image_metadata(x):
"""Test wiping image metadata through factory."""
assert Path(x).exists(), f"Test file not found: {x}"
handler = MetadataFactory.get_handler(str(x))
metadata = handler.read()
handler.wipe()
assert handler.processed_metadata != metadata
@pytest.mark.parametrize("x", [JPG_TEST_FILE, PNG_TEST_FILE])
def test_save_processed_image_metadata(x):
"""Test saving processed image metadata through factory."""
output_dir = Path("./tests/assets/output")
output_dir.mkdir(parents = True, exist_ok = True)
handler = MetadataFactory.get_handler(str(x))
handler.read()
handler.wipe()
output_file = output_dir / Path(x).name
handler.save(str(output_file))
assert output_file.exists()
shutil.rmtree(output_dir)
def test_image_format_detection():
"""Test format detection for images."""
handler = MetadataFactory.get_handler(JPG_TEST_FILE)
assert handler._detect_format() == "jpeg"
handler_png = MetadataFactory.get_handler(PNG_TEST_FILE)
assert handler_png._detect_format() == "png"
# ============== PDF Tests ==============
def test_read_pdf_metadata_via_factory():
"""Test reading PDF metadata through MetadataFactory."""
assert Path(PDF_TEST_FILE).exists(), f"Test file not found: {PDF_TEST_FILE}"
handler = MetadataFactory.get_handler(PDF_TEST_FILE)
assert isinstance(handler, PDFHandler)
metadata = handler.read()
assert handler.metadata == metadata
assert isinstance(metadata, dict)
assert handler.keys_to_delete is not None
def test_wipe_pdf_metadata_via_factory():
"""Test wiping PDF metadata through MetadataFactory."""
handler = MetadataFactory.get_handler(PDF_TEST_FILE)
metadata = handler.read()
handler.wipe()
assert handler.processed_metadata != metadata
def test_save_processed_pdf_metadata_via_factory():
"""Test saving processed PDF metadata through MetadataFactory."""
output_dir = Path("./tests/assets/output")
output_dir.mkdir(parents = True, exist_ok = True)
handler = MetadataFactory.get_handler(PDF_TEST_FILE)
handler.read()
handler.wipe()
output_file = output_dir / Path(PDF_TEST_FILE).name
handler.save(str(output_file))
assert output_file.exists()
shutil.rmtree(output_dir)
def test_pdf_format_detection():
"""Test format detection for PDF files."""
handler = MetadataFactory.get_handler(PDF_TEST_FILE)
assert handler._detect_format() == "pdf"
# ============== Excel Tests ==============
def test_read_excel_metadata_via_factory():
"""Test reading Excel metadata through MetadataFactory."""
assert Path(XLSX_TEST_FILE).exists(), f"Test file not found: {XLSX_TEST_FILE}"
handler = MetadataFactory.get_handler(XLSX_TEST_FILE)
assert isinstance(handler, ExcelHandler)
metadata = handler.read()
assert handler.metadata == metadata
assert isinstance(metadata, dict)
assert handler.keys_to_delete is not None
def test_wipe_excel_metadata_via_factory():
"""Test wiping Excel metadata through MetadataFactory."""
handler = MetadataFactory.get_handler(XLSX_TEST_FILE)
metadata = handler.read()
handler.wipe()
assert handler.processed_metadata != metadata
def test_save_processed_excel_metadata_via_factory():
"""Test saving processed Excel metadata through MetadataFactory."""
output_dir = Path("./tests/assets/output")
output_dir.mkdir(parents = True, exist_ok = True)
handler = MetadataFactory.get_handler(XLSX_TEST_FILE)
handler.read()
handler.wipe()
output_file = output_dir / Path(XLSX_TEST_FILE).name
handler.save(str(output_file))
assert output_file.exists()
shutil.rmtree(output_dir)
def test_excel_format_detection():
"""Test format detection for Excel files."""
handler = MetadataFactory.get_handler(XLSX_TEST_FILE)
assert handler._detect_format() == "xlsx"
# ============== PowerPoint Tests ==============
def test_read_pptx_metadata_via_factory():
"""Test reading PowerPoint metadata through MetadataFactory."""
from tests.conftest import get_pptx_test_file
PPTX_TEST_FILE = get_pptx_test_file()
assert Path(PPTX_TEST_FILE).exists(), f"Test file not found: {PPTX_TEST_FILE}"
from src.services.powerpoint_handler import PowerpointHandler
handler = MetadataFactory.get_handler(PPTX_TEST_FILE)
assert isinstance(handler, PowerpointHandler)
metadata = handler.read()
assert handler.metadata == metadata
assert isinstance(metadata, dict)
def test_wipe_pptx_metadata_via_factory():
"""Test wiping PowerPoint metadata through MetadataFactory."""
from tests.conftest import get_pptx_test_file
PPTX_TEST_FILE = get_pptx_test_file()
handler = MetadataFactory.get_handler(PPTX_TEST_FILE)
handler.read()
handler.wipe()
assert handler.processed_metadata is not None
def test_save_processed_pptx_metadata_via_factory():
"""Test saving processed PowerPoint metadata through MetadataFactory."""
from tests.conftest import get_pptx_test_file
PPTX_TEST_FILE = get_pptx_test_file()
output_dir = Path("./tests/assets/output")
output_dir.mkdir(parents = True, exist_ok = True)
handler = MetadataFactory.get_handler(PPTX_TEST_FILE)
handler.read()
handler.wipe()
output_file = output_dir / Path(PPTX_TEST_FILE).name
handler.save(str(output_file))
assert output_file.exists()
shutil.rmtree(output_dir)
def test_pptx_format_detection():
"""Test format detection for PowerPoint files."""
from tests.conftest import get_pptx_test_file
PPTX_TEST_FILE = get_pptx_test_file()
handler = MetadataFactory.get_handler(PPTX_TEST_FILE)
assert handler._detect_format() == "pptx"
# ============== Word Document Tests ==============
def test_read_docx_metadata_via_factory():
"""Test reading Word document metadata through MetadataFactory."""
from src.services.worddoc_handler import WorddocHandler
from tests.conftest import get_docx_test_file
DOCX_TEST_FILE = get_docx_test_file()
assert Path(DOCX_TEST_FILE).exists(), f"Test file not found: {DOCX_TEST_FILE}"
handler = MetadataFactory.get_handler(DOCX_TEST_FILE)
assert isinstance(handler, WorddocHandler)
metadata = handler.read()
assert handler.metadata == metadata
assert isinstance(metadata, dict)
def test_wipe_docx_metadata_via_factory():
"""Test wiping Word document metadata through MetadataFactory."""
from tests.conftest import get_docx_test_file
DOCX_TEST_FILE = get_docx_test_file()
handler = MetadataFactory.get_handler(DOCX_TEST_FILE)
handler.read()
handler.wipe()
assert handler.processed_metadata is not None
def test_save_processed_docx_metadata_via_factory():
"""Test saving processed Word document metadata through MetadataFactory."""
from tests.conftest import get_docx_test_file
DOCX_TEST_FILE = get_docx_test_file()
output_dir = Path("./tests/assets/output")
output_dir.mkdir(parents = True, exist_ok = True)
handler = MetadataFactory.get_handler(DOCX_TEST_FILE)
handler.read()
handler.wipe()
output_file = output_dir / Path(DOCX_TEST_FILE).name
handler.save(str(output_file))
assert output_file.exists()
shutil.rmtree(output_dir)
def test_docx_format_detection():
"""Test format detection for Word document files."""
from tests.conftest import get_docx_test_file
DOCX_TEST_FILE = get_docx_test_file()
handler = MetadataFactory.get_handler(DOCX_TEST_FILE)
assert handler._detect_format() == "docx"
# ============== Error Tests ==============
def test_unsupported_format_raises_error(tmp_path):
"""Test that unsupported file formats raise an error."""
fake_file = tmp_path / "test.txt"
fake_file.write_text("not an image")
with pytest.raises(UnsupportedFormatError):
MetadataFactory.get_handler(str(fake_file))
def test_save_without_output_path_raises_error():
"""Test that save() raises ValueError when output_path is empty."""
handler = MetadataFactory.get_handler(JPG_TEST_FILE)
handler.read()
handler.wipe()
with pytest.raises(ValueError):
handler.save("")