Add more tests.

This commit is contained in:
erinhmclark
2025-02-14 09:48:37 +00:00
parent 3fce593aad
commit 319c1e8f92
10 changed files with 102 additions and 33 deletions

View File

@@ -133,14 +133,6 @@ def unpickle():
return _unpickle
@pytest.fixture
def mock_python_dependencies():
with patch("auto_archiver.core.module") as mock_check_python_dep:
# Mock all Python dependencies as available
mock_check_python_dep.return_value = True
yield mock_check_python_dep
@pytest.fixture
def mock_binary_dependencies():
with patch("shutil.which") as mock_shutil_which:

View File

@@ -14,7 +14,7 @@ def mock_media():
@pytest.fixture
def enricher(setup_module):
def enricher(setup_module, mock_binary_dependencies):
return setup_module("metadata_enricher", {})
@@ -74,3 +74,16 @@ def test_get_metadata_error_handling(mock_run, mock_logger_error, enricher):
result = enricher.get_metadata("test.jpg")
assert result == {}
mock_logger_error.assert_called_once()
@pytest.mark.skip(reason="Requires ExifTool to be installed. TODO mock")
def test_metadata_pickle(enricher, unpickle):
# Uses a pickle of a YouTube short
metadata = unpickle("tests/data/metadata/metadata_enricher_ytshort_input.pickle")
expected = unpickle("tests/data/metadata/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")
assert metadata == expected

View File

@@ -38,11 +38,13 @@ def test_empty_metadata(metadata, enricher):
def test_ssl_enrich(metadata, enricher):
with patch("ssl.get_server_certificate", return_value="TEST_CERT"), \
patch("builtins.open", mock_open()) as mock_file:
media_len_before = len(metadata.media)
enricher.enrich(metadata)
ssl.get_server_certificate.assert_called_once_with(("example.com", 443))
mock_file.assert_called_once_with(f"{enricher.tmp_dir}/example-com.pem", "w")
mock_file().write.assert_called_once_with("TEST_CERT")
assert len(metadata.media) == media_len_before + 1
# Ensure the certificate is added to metadata
assert any(media.filename.endswith("example-com.pem") for media in metadata.media)

View File

@@ -5,12 +5,12 @@ from auto_archiver.modules.thumbnail_enricher import ThumbnailEnricher
@pytest.fixture
def thumbnail_enricher(setup_module) -> ThumbnailEnricher:
configs: dict = {
def thumbnail_enricher(setup_module, mock_binary_dependencies) -> ThumbnailEnricher:
config: dict = {
"thumbnails_per_minute": 60,
"max_thumbnails": 4,
}
return setup_module("thumbnail_enricher", configs)
return setup_module("thumbnail_enricher", config)
@pytest.fixture

View File

@@ -8,6 +8,9 @@ from auto_archiver.modules.s3_storage import S3Storage
from auto_archiver.modules.whisper_enricher import WhisperEnricher
TEST_S3_URL = "http://cdn.example.com/test.mp4"
@pytest.fixture
def enricher():
"""Fixture with mocked S3 and API dependencies"""
@@ -20,7 +23,7 @@ def enricher():
"steps": {"storages": ["s3_storage"]}
}
mock_s3 = MagicMock(spec=S3Storage)
mock_s3.get_cdn_url.return_value = "http://s3.example.com/media.mp3"
mock_s3.get_cdn_url.return_value = TEST_S3_URL
instance = WhisperEnricher()
instance.name = "whisper_enricher"
instance.display_name = "Whisper Enricher"
@@ -53,7 +56,7 @@ def test_successful_job_submission(enricher, metadata, mock_requests):
"""Test successful media processing with S3 configured"""
whisper, mock_s3 = enricher
# Configure mock S3 URL to match test expectation
mock_s3.get_cdn_url.return_value = "http://cdn.example.com/test.mp4"
mock_s3.get_cdn_url.return_value = TEST_S3_URL
# Create test media with matching CDN URL
m = Media("test.mp4")
@@ -78,6 +81,7 @@ def test_successful_job_submission(enricher, metadata, mock_requests):
mock_status_response, # First call: status check
mock_artifacts_response # Second call: artifacts check
]
# Run enrichment (without opening file)
whisper.enrich(metadata)
# Check API interactions
@@ -89,5 +93,43 @@ def test_successful_job_submission(enricher, metadata, mock_requests):
# Verify job status checks
assert mock_requests.get.call_count == 2
assert "artifact_0_text" in metadata.media[0].get("whisper_model")
assert "test transcript" in metadata.metadata.get("content")
assert metadata.media[0].get("whisper_model") == {'artifact_0_text': 'test transcript', 'job_artifacts_check': 'http://testapi/jobs/job123/artifacts', 'job_id': 'job123', 'job_status_check': 'http://testapi/jobs/job123'}
def test_submit_job(enricher):
"""Test job submission method"""
whisper, _ = enricher
m = Media("test.mp4")
m.add_url(TEST_S3_URL)
with patch("auto_archiver.modules.whisper_enricher.whisper_enricher.requests") as mock_requests:
mock_response = MagicMock()
mock_response.status_code = 201
mock_response.json.return_value = {"id": "job123"}
mock_requests.post.return_value = mock_response
job_id = whisper.submit_job(m)
assert job_id == "job123"
def test_submit_raises_status(enricher):
whisper, _ = enricher
m = Media("test.mp4")
m.add_url(TEST_S3_URL)
with patch("auto_archiver.modules.whisper_enricher.whisper_enricher.requests") as mock_requests:
mock_response = MagicMock()
mock_response.status_code = 400
mock_response.json.return_value = {"id": "job123"}
mock_requests.post.return_value = mock_response
with pytest.raises(AssertionError) as exc_info:
whisper.submit_job(m)
assert str(exc_info.value) == "calling the whisper api http://testapi returned a non-success code: 400"
# @pytest.mark.parametrize("test_url, status", ["http://cdn.example.com/test.mp4",])
def test_submit_job_fails(enricher):
"""Test assertion fails with non-S3 URL"""
whisper, mock_s3 = enricher
m = Media("test.mp4")
m.add_url("http://cdn.wrongurl.com/test.mp4")
with pytest.raises(AssertionError):
whisper.submit_job(m)

View File

@@ -162,4 +162,25 @@ def test_get_context():
def test_choose_most_complete():
pass
m_more = Metadata()
m_more.set_title("Title 1")
m_more.set_content("Content 1")
m_more.set_url("https://example.com")
m_less = Metadata()
m_less.set_title("Title 2")
m_less.set_content("Content 2")
m_less.set_url("https://example.com")
m_less.set_context("key", "value")
res = Metadata.choose_most_complete([m_more, m_less])
assert res.metadata.get("title") == "Title 1"
def test_choose_most_complete_from_pickles(unpickle):
# test most complete from pickles before and after an enricher has run
# Only compares length of media, not the actual media
m_before_enriching = unpickle("/Users/erinclark/PycharmProjects/auto-archiver/tests/data/metadata/metadata_enricher_ytshort_input.pickle")
m_after_enriching = unpickle("/Users/erinclark/PycharmProjects/auto-archiver/tests/data/metadata/metadata_enricher_ytshort_expected.pickle")
# Iterates `for r in results[1:]:`
res = Metadata.choose_most_complete([Metadata(), m_after_enriching, m_before_enriching])
assert res.media == m_after_enriching.media