[GEMINI] Update forensics tests to metadata command and remove ctf inspect
This commit is contained in:
@@ -6,7 +6,7 @@ import sys
|
||||
from click.testing import CliRunner
|
||||
from ctf.utils import load_config, active_categories
|
||||
from ctf.forensics import get_metadata
|
||||
from ctf.cli_forensics import forensics_group, inspect
|
||||
from ctf.cli_forensics import forensics_group, metadata
|
||||
|
||||
# Define the persistent test environment path
|
||||
TEST_ENV = Path("tests/env")
|
||||
@@ -230,9 +230,9 @@ def test_inspect_extended_attributes():
|
||||
|
||||
# --- CLI Validation Tests ---
|
||||
|
||||
def test_forensics_inspect_cli_success():
|
||||
def test_forensics_metadata_cli_success():
|
||||
"""
|
||||
Verifies that 'forensics inspect' successfully runs via the CLI and prints
|
||||
Verifies that 'forensics metadata' successfully runs via the CLI and prints
|
||||
the metadata in a formatted table.
|
||||
"""
|
||||
runner = CliRunner()
|
||||
@@ -240,7 +240,7 @@ def test_forensics_inspect_cli_success():
|
||||
with open(test_file, "wb") as f:
|
||||
f.write(b"\x89PNG\r\n\x1a\n")
|
||||
|
||||
result = runner.invoke(forensics_group, ["inspect", str(test_file)])
|
||||
result = runner.invoke(forensics_group, ["metadata", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "Metadata: test_file.png" in result.output
|
||||
assert "Size" in result.output
|
||||
@@ -248,25 +248,9 @@ def test_forensics_inspect_cli_success():
|
||||
assert "Detected Type" in result.output
|
||||
assert "PNG Image" in result.output
|
||||
|
||||
def test_root_inspect_cli_success():
|
||||
def test_nested_metadata_cli_success():
|
||||
"""
|
||||
Verifies that 'ctf inspect' successfully runs at the root level and prints
|
||||
the metadata in a formatted table.
|
||||
"""
|
||||
from ctf.main import cli
|
||||
runner = CliRunner()
|
||||
test_file = TEST_ENV / "test_file_root.png"
|
||||
with open(test_file, "wb") as f:
|
||||
f.write(b"\x89PNG\r\n\x1a\n")
|
||||
|
||||
result = runner.invoke(cli, ["inspect", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "Metadata: test_file_root.png" in result.output
|
||||
assert "PNG Image" in result.output
|
||||
|
||||
def test_nested_inspect_cli_success():
|
||||
"""
|
||||
Verifies that 'ctf forensics inspect' successfully runs via the root CLI.
|
||||
Verifies that 'ctf forensics metadata' successfully runs via the root CLI.
|
||||
"""
|
||||
from ctf.main import cli
|
||||
runner = CliRunner()
|
||||
@@ -274,17 +258,17 @@ def test_nested_inspect_cli_success():
|
||||
with open(test_file, "wb") as f:
|
||||
f.write(b"\x89PNG\r\n\x1a\n")
|
||||
|
||||
result = runner.invoke(cli, ["forensics", "inspect", str(test_file)])
|
||||
result = runner.invoke(cli, ["forensics", "metadata", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "Metadata: test_file_nested.png" in result.output
|
||||
assert "PNG Image" in result.output
|
||||
|
||||
def test_forensics_inspect_cli_missing_file():
|
||||
def test_forensics_metadata_cli_missing_file():
|
||||
"""
|
||||
Verifies that the CLI fails gracefully when a non-existent file path is specified.
|
||||
"""
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(forensics_group, ["inspect", "non_existent_file.png"])
|
||||
result = runner.invoke(forensics_group, ["metadata", "non_existent_file.png"])
|
||||
assert result.exit_code != 0
|
||||
assert "does not exist" in result.output
|
||||
|
||||
@@ -340,18 +324,18 @@ def test_exif_cli_options():
|
||||
test_file = TEST_ENV / "mock_exif_image.png"
|
||||
|
||||
# Verify mutual exclusion error
|
||||
result_err = runner.invoke(cli, ["inspect", "-i", "-e", str(test_file)])
|
||||
result_err = runner.invoke(cli, ["forensics", "metadata", "-i", "-e", str(test_file)])
|
||||
assert result_err.exit_code != 0
|
||||
assert "Cannot specify more than one" in result_err.output
|
||||
|
||||
# Verify --inode hides EXIF data table
|
||||
result_inode = runner.invoke(cli, ["inspect", "-i", str(test_file)])
|
||||
result_inode = runner.invoke(cli, ["forensics", "metadata", "-i", str(test_file)])
|
||||
assert result_inode.exit_code == 0
|
||||
assert "Metadata: mock_exif_image.png" in result_inode.output
|
||||
assert "EXIF Metadata" not in result_inode.output
|
||||
|
||||
# Verify --exif hides POSIX table but displays EXIF data table
|
||||
result_exif = runner.invoke(cli, ["inspect", "-e", str(test_file)])
|
||||
result_exif = runner.invoke(cli, ["forensics", "metadata", "-e", str(test_file)])
|
||||
assert result_exif.exit_code == 0
|
||||
assert "Metadata: mock_exif_image.png" not in result_exif.output
|
||||
assert "EXIF Metadata" in result_exif.output
|
||||
@@ -391,7 +375,7 @@ def test_exif_cli_options_warning():
|
||||
with open(test_file, "wb") as f:
|
||||
f.write(b"\x89PNG\r\n\x1a\n")
|
||||
|
||||
result = runner.invoke(cli, ["inspect", "-e", str(test_file)])
|
||||
result = runner.invoke(cli, ["forensics", "metadata", "-e", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "No EXIF or comment metadata found" in result.output
|
||||
|
||||
@@ -410,7 +394,7 @@ def test_exif_cli_comment_only():
|
||||
with open(test_file, "wb") as f:
|
||||
f.write(mock_jpeg)
|
||||
|
||||
result = runner.invoke(cli, ["inspect", "-e", str(test_file)])
|
||||
result = runner.invoke(cli, ["forensics", "metadata", "-e", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "Comment" in result.output
|
||||
assert "flag{comment_only}" in result.output
|
||||
@@ -455,7 +439,7 @@ def test_adobe_xmp_cli():
|
||||
runner = CliRunner()
|
||||
test_file = TEST_ENV / "mock_xmp.jpg"
|
||||
|
||||
result = runner.invoke(cli, ["inspect", "-e", str(test_file)])
|
||||
result = runner.invoke(cli, ["forensics", "metadata", "-e", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "EXIF Metadata" in result.output
|
||||
assert "cc:license" in result.output
|
||||
@@ -510,19 +494,19 @@ def test_jpeg_iptc_parsing():
|
||||
|
||||
def test_cli_physical_option():
|
||||
"""
|
||||
Verifies the ctf inspect CLI supports -p/--physical and mutual exclusion rules.
|
||||
Verifies the ctf forensics metadata CLI supports -p/--physical and mutual exclusion rules.
|
||||
"""
|
||||
from ctf.main import cli
|
||||
runner = CliRunner()
|
||||
test_file = TEST_ENV / "mock_physical.jpg"
|
||||
|
||||
# Mutual exclusion check
|
||||
result_err = runner.invoke(cli, ["inspect", "-p", "-e", str(test_file)])
|
||||
result_err = runner.invoke(cli, ["forensics", "metadata", "-p", "-e", str(test_file)])
|
||||
assert result_err.exit_code != 0
|
||||
assert "Cannot specify more than one" in result_err.output
|
||||
|
||||
# Physical view check
|
||||
result_phys = runner.invoke(cli, ["inspect", "-p", str(test_file)])
|
||||
result_phys = runner.invoke(cli, ["forensics", "metadata", "-p", str(test_file)])
|
||||
assert result_phys.exit_code == 0
|
||||
assert "Physical Metadata" in result_phys.output
|
||||
assert "Image Size" in result_phys.output
|
||||
@@ -610,9 +594,9 @@ def test_adobe_xmp_formatting():
|
||||
assert meta.exif_data.get("exif:EmptyAttr") == "exif:Value"
|
||||
assert "rdf:Description" not in meta.exif_data
|
||||
|
||||
def test_inspect_decoded_hints_cli():
|
||||
def test_metadata_decoded_hints_cli():
|
||||
"""
|
||||
Verifies that inspect command successfully decodes and prints hex/base64 encoded metadata hints.
|
||||
Verifies that metadata command successfully decodes and prints hex/base64 encoded metadata hints.
|
||||
"""
|
||||
from ctf.main import cli
|
||||
runner = CliRunner()
|
||||
@@ -627,7 +611,7 @@ def test_inspect_decoded_hints_cli():
|
||||
with open(test_file, "wb") as f:
|
||||
f.write(mock_jpeg)
|
||||
|
||||
result = runner.invoke(cli, ["inspect", str(test_file)])
|
||||
result = runner.invoke(cli, ["forensics", "metadata", str(test_file)])
|
||||
assert result.exit_code == 0
|
||||
assert "Decoded Metadata Hints" in result.output
|
||||
assert "Comment" in result.output
|
||||
|
||||
Reference in New Issue
Block a user