Cybersecurity-Projects/PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_verify_command.py

282 lines
7.9 KiB
Python

"""
End-to-end tests for the verify command.
Tests the complete CLI workflow for the verify command, including
comparing original and processed files and verifying output format.
"""
import shutil
from pathlib import Path
import pytest
from typer.testing import CliRunner
from src.main import app
runner = CliRunner()
@pytest.fixture
def output_dir(tmp_path):
"""Create a temporary output directory for processed files."""
output = tmp_path / "output"
output.mkdir()
yield output
if output.exists():
shutil.rmtree(output)
# ============== Image Tests ==============
def test_verify_command_jpeg_clean_status(output_dir):
"""Test verify command shows CLEAN status for properly scrubbed JPEG."""
from tests.conftest import get_jpg_test_file
JPG_TEST_FILE = get_jpg_test_file()
# First scrub the file
scrub_result = runner.invoke(
app,
["scrub",
JPG_TEST_FILE,
"--output",
str(output_dir)]
)
assert scrub_result.exit_code == 0
# Get the processed file path
processed_file = output_dir / f"processed_{Path(JPG_TEST_FILE).name}"
assert processed_file.exists()
# Now verify
result = runner.invoke(app, ["verify", JPG_TEST_FILE, str(processed_file)])
assert result.exit_code == 0, f"Failed with: {result.stdout}"
assert "Comparing" in result.stdout
assert "CLEAN" in result.stdout or "Removed" in result.stdout
# this test can be ran if a png with metadata is found and added to the assests folder.
# def test_verify_command_png_clean_status(output_dir):
# """Test verify command shows CLEAN status for properly scrubbed PNG."""
# from tests.conftest import get_png_test_file
# # PNG_TEST_FILE = get_png_test_file()
# # First scrub the file
# scrub_result = runner.invoke(
# app, ["scrub", PNG_TEST_FILE, "--output", str(output_dir)]
# )
# # Get the processed file path
# processed_file = output_dir / f"processed_{Path(PNG_TEST_FILE).name}"
# # Skip if scrub failed (PNG might have no metadata)
# if scrub_result.exit_code != 0 or not processed_file.exists():
# pytest.skip("PNG file had no metadata to scrub")
# # Now verify
# result = runner.invoke(app, ["verify", PNG_TEST_FILE, str(processed_file)])
# assert result.exit_code == 0, f"Failed with: {result.stdout}"
# assert "Comparing" in result.stdout
# ============== PDF Tests ==============
def test_verify_command_pdf_clean_status(output_dir):
"""Test verify command shows CLEAN status for properly scrubbed PDF."""
from tests.conftest import get_pdf_test_file
PDF_TEST_FILE = get_pdf_test_file()
# First scrub the file
scrub_result = runner.invoke(
app,
["scrub",
PDF_TEST_FILE,
"--output",
str(output_dir)]
)
assert scrub_result.exit_code == 0
# Get the processed file path
processed_file = output_dir / f"processed_{Path(PDF_TEST_FILE).name}"
assert processed_file.exists()
# Now verify
result = runner.invoke(app, ["verify", PDF_TEST_FILE, str(processed_file)])
assert result.exit_code == 0, f"Failed with: {result.stdout}"
assert "Comparing" in result.stdout
# ============== Excel Tests ==============
def test_verify_command_xlsx_clean_status(output_dir):
"""Test verify command shows CLEAN status for properly scrubbed Excel."""
from tests.conftest import get_xlsx_test_file
XLSX_TEST_FILE = get_xlsx_test_file()
# First scrub the file
scrub_result = runner.invoke(
app,
["scrub",
XLSX_TEST_FILE,
"--output",
str(output_dir)]
)
assert scrub_result.exit_code == 0
# Get the processed file path
processed_file = output_dir / f"processed_{Path(XLSX_TEST_FILE).name}"
assert processed_file.exists()
# Now verify
result = runner.invoke(app, ["verify", XLSX_TEST_FILE, str(processed_file)])
assert result.exit_code == 0, f"Failed with: {result.stdout}"
assert "Comparing" in result.stdout
# ============== PowerPoint Tests ==============
def test_verify_command_pptx_clean_status(output_dir):
"""Test verify command shows CLEAN status for properly scrubbed PowerPoint."""
from tests.conftest import get_pptx_test_file
PPTX_TEST_FILE = get_pptx_test_file()
# First scrub the file
scrub_result = runner.invoke(
app,
["scrub",
PPTX_TEST_FILE,
"--output",
str(output_dir)]
)
assert scrub_result.exit_code == 0
# Get the processed file path
processed_file = output_dir / f"processed_{Path(PPTX_TEST_FILE).name}"
assert processed_file.exists()
# Now verify
result = runner.invoke(app, ["verify", PPTX_TEST_FILE, str(processed_file)])
assert result.exit_code == 0, f"Failed with: {result.stdout}"
assert "Comparing" in result.stdout
# ============== Word Document Tests ==============
def test_verify_command_docx_clean_status(output_dir):
"""Test verify command shows CLEAN status for properly scrubbed Word doc."""
from tests.conftest import get_docx_test_file
DOCX_TEST_FILE = get_docx_test_file()
# First scrub the file
scrub_result = runner.invoke(
app,
["scrub",
DOCX_TEST_FILE,
"--output",
str(output_dir)]
)
assert scrub_result.exit_code == 0
# Get the processed file path
processed_file = output_dir / f"processed_{Path(DOCX_TEST_FILE).name}"
assert processed_file.exists()
# Now verify
result = runner.invoke(app, ["verify", DOCX_TEST_FILE, str(processed_file)])
assert result.exit_code == 0, f"Failed with: {result.stdout}"
assert "Comparing" in result.stdout
# ============== Error Tests ==============
def test_verify_command_original_file_not_found():
"""Test verify command handles missing original file."""
result = runner.invoke(
app,
["verify",
"nonexistent_file.jpg",
"also_nonexistent.jpg"]
)
assert result.exit_code != 0
def test_verify_command_processed_file_not_found():
"""Test verify command handles missing processed file."""
from tests.conftest import get_jpg_test_file
JPG_TEST_FILE = get_jpg_test_file()
result = runner.invoke(app, ["verify", JPG_TEST_FILE, "nonexistent_processed.jpg"])
assert result.exit_code != 0
# ============== Output Format Tests ==============
def test_verify_command_shows_removed_count(output_dir):
"""Test that verify command shows removed count in output."""
from tests.conftest import get_jpg_test_file
JPG_TEST_FILE = get_jpg_test_file()
# Scrub the file
runner.invoke(app, ["scrub", JPG_TEST_FILE, "--output", str(output_dir)])
processed_file = output_dir / f"processed_{Path(JPG_TEST_FILE).name}"
# Verify
result = runner.invoke(app, ["verify", JPG_TEST_FILE, str(processed_file)])
assert "Removed:" in result.stdout
def test_verify_command_shows_preserved_count(output_dir):
"""Test that verify command shows preserved count in output."""
from tests.conftest import get_jpg_test_file
JPG_TEST_FILE = get_jpg_test_file()
# Scrub the file
runner.invoke(app, ["scrub", JPG_TEST_FILE, "--output", str(output_dir)])
processed_file = output_dir / f"processed_{Path(JPG_TEST_FILE).name}"
# Verify
result = runner.invoke(app, ["verify", JPG_TEST_FILE, str(processed_file)])
assert "Preserved:" in result.stdout
def test_verify_command_shows_comparison_header(output_dir):
"""Test that verify command shows comparison header."""
from tests.conftest import get_jpg_test_file
JPG_TEST_FILE = get_jpg_test_file()
# Scrub the file
runner.invoke(app, ["scrub", JPG_TEST_FILE, "--output", str(output_dir)])
processed_file = output_dir / f"processed_{Path(JPG_TEST_FILE).name}"
# Verify
result = runner.invoke(app, ["verify", JPG_TEST_FILE, str(processed_file)])
assert "Comparing:" in result.stdout
assert Path(JPG_TEST_FILE).name in result.stdout