-
Notifications
You must be signed in to change notification settings - Fork 53
Expand file tree
/
Copy pathtest_remove_unmonitored.py
More file actions
111 lines (99 loc) · 3.85 KB
/
Copy pathtest_remove_unmonitored.py
File metadata and controls
111 lines (99 loc) · 3.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import logging
from unittest.mock import AsyncMock, MagicMock
import pytest
import requests
from src.jobs.remove_unmonitored import RemoveUnmonitored
from tests.jobs.utils import shared_fix_affected_items, shared_test_affected_items
@pytest.mark.asyncio
@pytest.mark.parametrize(
("queue_data", "monitored_ids", "expected_download_ids"),
[
# All items monitored -> no affected items
(
[
{"downloadId": "1", "detail_item_id": 101},
{"downloadId": "2", "detail_item_id": 102},
],
{101: True, 102: True},
[],
),
# All items unmonitored -> all affected
(
[
{"downloadId": "1", "detail_item_id": 101},
{"downloadId": "2", "detail_item_id": 102},
],
{101: False, 102: False},
["1", "2"],
),
# One monitored, one not
(
[
{"downloadId": "1", "detail_item_id": 101},
{"downloadId": "2", "detail_item_id": 102},
],
{101: True, 102: False},
["2"],
),
# Shared downloadId, only one monitored -> not affected
(
[
{"downloadId": "1", "detail_item_id": 101},
{"downloadId": "1", "detail_item_id": 102},
],
{101: False, 102: True},
[],
),
# Shared downloadId, none monitored -> affected
(
[
{"downloadId": "1", "detail_item_id": 101},
{"downloadId": "1", "detail_item_id": 102},
],
{101: False, 102: False},
["1", "1"],
),
# One monitored, one not, one not matched yet
(
[
{"downloadId": "1", "detail_item_id": 101},
{"downloadId": "2", "detail_item_id": 102},
{"downloadId": "3", "detail_item_id": None},
],
{101: True, 102: False},
["2"],
),
],
)
async def test_find_affected_items(queue_data, monitored_ids, expected_download_ids):
# Arrange
removal_job = shared_fix_affected_items(RemoveUnmonitored, queue_data)
removal_job.arr.is_monitored = AsyncMock(side_effect=lambda id_: monitored_ids[id_])
# Act and Assert
await shared_test_affected_items(removal_job, expected_download_ids)
@pytest.mark.asyncio
async def test_stale_queue_item_is_skipped_and_processing_continues(caplog):
queue_data = [
{"downloadId": "stale", "detail_item_id": 101},
{"downloadId": "unmonitored", "detail_item_id": 102},
]
removal_job = shared_fix_affected_items(RemoveUnmonitored, queue_data)
removal_job.arr.detail_item_key = "book"
removal_job.arr.name = "Readarr"
not_found = requests.exceptions.HTTPError("404 Not Found")
not_found.response = MagicMock(status_code=404)
removal_job.arr.is_monitored = AsyncMock(side_effect=[not_found, False])
with caplog.at_level(logging.WARNING, logger="src.utils.log_setup"):
await shared_test_affected_items(removal_job, ["unmonitored"])
removal_job.arr.is_monitored.assert_awaited()
assert "Skipping stale queue item stale" in caplog.text
assert "book 101 no longer exists on Readarr" in caplog.text
@pytest.mark.asyncio
async def test_non_404_monitoring_error_is_raised():
queue_data = [{"downloadId": "failed", "detail_item_id": 101}]
removal_job = shared_fix_affected_items(RemoveUnmonitored, queue_data)
server_error = requests.exceptions.HTTPError("500 Server Error")
server_error.response = MagicMock(status_code=500)
removal_job.arr.is_monitored = AsyncMock(side_effect=server_error)
with pytest.raises(requests.exceptions.HTTPError, match="500 Server Error"):
await removal_job._find_affected_items() # pylint: disable=protected-access