kopia lustrzana https://github.com/bellingcat/auto-archiver
85 wiersze
2.6 KiB
Python
85 wiersze
2.6 KiB
Python
import pytest
|
|
|
|
from auto_archiver.core import Media
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_media(mocker):
|
|
"""Creates a mock Media object."""
|
|
mock: Media = mocker.MagicMock(spec=Media)
|
|
mock.filename = "mock_file.txt"
|
|
return mock
|
|
|
|
|
|
@pytest.fixture
|
|
def enricher(setup_module, mock_binary_dependencies):
|
|
return setup_module("metadata_enricher", {})
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"output,expected",
|
|
[
|
|
("Key1: Value1\nKey2: Value2", {"Key1": "Value1", "Key2": "Value2"}),
|
|
("InvalidLine", {}),
|
|
("", {}),
|
|
],
|
|
)
|
|
def test_get_metadata(enricher, output, expected, mocker):
|
|
mock_run = mocker.patch("subprocess.run")
|
|
mock_run.return_value.stdout = output
|
|
mock_run.return_value.stderr = ""
|
|
mock_run.return_value.returncode = 0
|
|
|
|
result = enricher.get_metadata("test.jpg")
|
|
assert result == expected
|
|
mock_run.assert_called_once_with(["exiftool", "test.jpg"], capture_output=True, text=True)
|
|
|
|
|
|
def test_get_metadata_exiftool_not_found(enricher, mocker):
|
|
mock_run = mocker.patch("subprocess.run")
|
|
mock_run.side_effect = FileNotFoundError
|
|
result = enricher.get_metadata("test.jpg")
|
|
assert result == {}
|
|
|
|
|
|
def test_enrich_sets_metadata(enricher, mocker):
|
|
media1 = mocker.Mock(filename="img1.jpg")
|
|
media2 = mocker.Mock(filename="img2.jpg")
|
|
metadata = mocker.Mock()
|
|
metadata.media = [media1, media2]
|
|
enricher.get_metadata = lambda f: {"key": "value"} if f == "img1.jpg" else {}
|
|
|
|
enricher.enrich(metadata)
|
|
|
|
media1.set.assert_called_once_with("metadata", {"key": "value"})
|
|
media2.set.assert_not_called()
|
|
assert metadata.media == [media1, media2]
|
|
|
|
|
|
def test_enrich_empty_media(enricher, mocker):
|
|
metadata = mocker.Mock()
|
|
metadata.media = []
|
|
# Should not raise errors
|
|
enricher.enrich(metadata)
|
|
|
|
|
|
def test_get_metadata_error_handling(enricher, mocker):
|
|
mocker.patch("subprocess.run", side_effect=Exception("Test error"))
|
|
mock_log = mocker.patch("loguru.logger.error")
|
|
result = enricher.get_metadata("test.jpg")
|
|
assert result == {}
|
|
assert "Error occurred: " in mock_log.call_args[0][0]
|
|
|
|
|
|
def test_metadata_pickle(enricher, unpickle, mocker):
|
|
mock_run = mocker.patch("subprocess.run")
|
|
# Uses pickled values
|
|
mock_run.return_value = unpickle("metadata_enricher_exif.pickle")
|
|
metadata = unpickle("metadata_enricher_ytshort_input.pickle")
|
|
expected = unpickle("metadata_enricher_ytshort_expected.pickle")
|
|
enricher.enrich(metadata)
|
|
expected_media = expected.media
|
|
actual_media = metadata.media
|
|
assert len(expected_media) == len(actual_media)
|
|
assert actual_media[0].properties.get("metadata") == expected_media[0].properties.get("metadata")
|