mirror of
https://github.com/ManiMatter/decluttarr.git
synced 2026-04-17 21:53:58 +02:00
141 lines
5.0 KiB
Python
141 lines
5.0 KiB
Python
from unittest.mock import MagicMock
|
|
import pytest
|
|
from src.jobs.remove_failed_imports import RemoveFailedImports
|
|
from tests.jobs.test_utils import removal_job_fix
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"item, expected_result",
|
|
[
|
|
# Valid item scenario
|
|
(
|
|
{
|
|
"status": "completed",
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "importPending",
|
|
"statusMessages": [{"messages": ["Import failed"]}],
|
|
},
|
|
True
|
|
),
|
|
# Invalid item with wrong status
|
|
(
|
|
{
|
|
"status": "downloading",
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "importPending",
|
|
"statusMessages": [{"messages": ["Import failed"]}],
|
|
},
|
|
False
|
|
),
|
|
# Invalid item with missing required fields
|
|
(
|
|
{
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "importPending",
|
|
"statusMessages": [{"messages": ["Import failed"]}],
|
|
},
|
|
False
|
|
),
|
|
# Invalid item with wrong trackedDownloadStatus
|
|
(
|
|
{
|
|
"status": "completed",
|
|
"trackedDownloadStatus": "downloading",
|
|
"trackedDownloadState": "importPending",
|
|
"statusMessages": [{"messages": ["Import failed"]}],
|
|
},
|
|
False
|
|
),
|
|
# Invalid item with wrong trackedDownloadState
|
|
(
|
|
{
|
|
"status": "completed",
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "downloaded",
|
|
"statusMessages": [{"messages": ["Import failed"]}],
|
|
},
|
|
False
|
|
),
|
|
]
|
|
)
|
|
async def test_is_valid_item(item, expected_result):
|
|
#Fix
|
|
removal_job = removal_job_fix(RemoveFailedImports)
|
|
|
|
# Act
|
|
result = removal_job._is_valid_item(item) # pylint: disable=W0212
|
|
|
|
# Assert
|
|
assert result == expected_result
|
|
|
|
|
|
|
|
|
|
# Fixture with 3 valid items with different messages and downloadId
|
|
@pytest.fixture(name="queue_data")
|
|
def fixture_queue_data():
|
|
return [
|
|
{
|
|
"downloadId": "1",
|
|
"status": "completed",
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "importPending",
|
|
"statusMessages": [{"messages": ["Import failed due to issue A"]}],
|
|
},
|
|
{
|
|
"downloadId": "2",
|
|
"status": "completed",
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "importFailed",
|
|
"statusMessages": [{"messages": ["Import failed due to issue B"]}],
|
|
},
|
|
{
|
|
"downloadId": "3",
|
|
"status": "completed",
|
|
"trackedDownloadStatus": "warning",
|
|
"trackedDownloadState": "importBlocked",
|
|
"statusMessages": [{"messages": ["Import blocked due to issue C"]}],
|
|
}
|
|
]
|
|
|
|
|
|
# Test the different patterns and check if the right downloads are selected
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"patterns, expected_download_ids, removal_messages_expected",
|
|
[
|
|
(["*"], ["1", "2", "3"], True), # Match everything, expect removal messages
|
|
(["Import failed*"], ["1", "2"], True), # Match "Import failed", expect removal messages
|
|
(["Import blocked*"], ["3"], True), # Match "Import blocked", expect removal messages
|
|
(["*due to issue A"], ["1"], True), # Match "due to issue A", expect removal messages
|
|
(["Import failed due to issue C"], [], False), # No match for "Import failed due to issue C", expect no removal messages
|
|
],
|
|
)
|
|
async def test_find_affected_items_with_patterns(queue_data, patterns, expected_download_ids, removal_messages_expected):
|
|
# Arrange
|
|
removal_job = removal_job_fix(RemoveFailedImports, queue_data=queue_data)
|
|
|
|
# Mock the job settings for message patterns
|
|
removal_job.job = MagicMock()
|
|
removal_job.job.message_patterns = patterns
|
|
|
|
# Act
|
|
affected_items = await removal_job._find_affected_items() # pylint: disable=W0212
|
|
|
|
# Assert
|
|
assert isinstance(affected_items, list)
|
|
|
|
# Check if the correct downloadIds are in the affected items
|
|
affected_download_ids = [item["downloadId"] for item in affected_items]
|
|
|
|
# Assert the affected download IDs are as expected
|
|
assert sorted(affected_download_ids) == sorted(expected_download_ids)
|
|
|
|
|
|
# Check if removal messages are expected and present
|
|
for item in affected_items:
|
|
if removal_messages_expected:
|
|
assert "removal_messages" in item, f"Expected removal messages for item {item['downloadId']}"
|
|
assert len(item["removal_messages"]) > 0, f"Expected non-empty removal messages for item {item['downloadId']}"
|
|
else:
|
|
assert "removal_messages" not in item, f"Did not expect removal messages for item {item['downloadId']}" |