fix: mount retry adapter on Redmine engine session
python-redmine exposes as a context manager, while the
actual requests.Session lives in . Mounting the
retry adapter on the wrong object caused:
'function' object has no attribute 'mount'
on startup. Update the related test to mock the real session.
This commit is contained in:
@@ -47,25 +47,22 @@ def _create_redmine() -> Redmine:
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
# Монтируем retry-адаптер на сессию для автоматических повторов
|
# Монтируем retry-адаптер на сессию для автоматических повторов.
|
||||||
|
# В python-redmine сессия живёт в engine, а redmine.session — контекстный менеджер.
|
||||||
retry_adapter = _make_retry_adapter()
|
retry_adapter = _make_retry_adapter()
|
||||||
redmine.session.mount("https://", retry_adapter)
|
redmine.engine.session.mount("https://", retry_adapter)
|
||||||
redmine.session.mount("http://", retry_adapter)
|
redmine.engine.session.mount("http://", retry_adapter)
|
||||||
|
|
||||||
return redmine
|
return redmine
|
||||||
|
|
||||||
|
|
||||||
def _fetch_issues_chunked(
|
def _fetch_issues_chunked(redmine: Redmine, issue_ids: List[int]) -> List[Issue]:
|
||||||
redmine: Redmine, issue_ids: List[int]
|
|
||||||
) -> List[Issue]:
|
|
||||||
"""Загружает задачи чанками, чтобы не превышать лимит длины URL (#21)."""
|
"""Загружает задачи чанками, чтобы не превышать лимит длины URL (#21)."""
|
||||||
all_issues: List[Issue] = []
|
all_issues: List[Issue] = []
|
||||||
for i in range(0, len(issue_ids), ISSUE_ID_CHUNK_SIZE):
|
for i in range(0, len(issue_ids), ISSUE_ID_CHUNK_SIZE):
|
||||||
chunk = issue_ids[i : i + ISSUE_ID_CHUNK_SIZE]
|
chunk = issue_ids[i : i + ISSUE_ID_CHUNK_SIZE]
|
||||||
issue_list_str = ",".join(str(x) for x in chunk)
|
issue_list_str = ",".join(str(x) for x in chunk)
|
||||||
issues = redmine.issue.filter(
|
issues = redmine.issue.filter(issue_id=issue_list_str, status_id="*", sort="project:asc")
|
||||||
issue_id=issue_list_str, status_id="*", sort="project:asc"
|
|
||||||
)
|
|
||||||
all_issues.extend(issues)
|
all_issues.extend(issues)
|
||||||
return all_issues
|
return all_issues
|
||||||
|
|
||||||
|
|||||||
@@ -196,16 +196,14 @@ def test_fetch_mounts_retry_adapter(mock_redmine_class):
|
|||||||
|
|
||||||
fetch_issues_with_spent_time("2026-01-01", "2026-01-31")
|
fetch_issues_with_spent_time("2026-01-01", "2026-01-31")
|
||||||
|
|
||||||
# Проверяем, что session.mount был вызван для http:// и https://
|
# Проверяем, что engine.session.mount был вызван для http:// и https://
|
||||||
mount_calls = mock_redmine.session.mount.call_args_list
|
mount_calls = mock_redmine.engine.session.mount.call_args_list
|
||||||
prefixes = [call.args[0] for call in mount_calls]
|
prefixes = [call.args[0] for call in mount_calls]
|
||||||
assert "https://" in prefixes
|
assert "https://" in prefixes
|
||||||
assert "http://" in prefixes
|
assert "http://" in prefixes
|
||||||
|
|
||||||
# Проверяем retry-конфигурацию адаптера
|
# Проверяем retry-конфигурацию адаптера
|
||||||
https_adapter = next(
|
https_adapter = next(call.args[1] for call in mount_calls if call.args[0] == "https://")
|
||||||
call.args[1] for call in mount_calls if call.args[0] == "https://"
|
|
||||||
)
|
|
||||||
max_retries = https_adapter.max_retries
|
max_retries = https_adapter.max_retries
|
||||||
assert max_retries.total == 3
|
assert max_retries.total == 3
|
||||||
assert 429 in max_retries.status_forcelist
|
assert 429 in max_retries.status_forcelist
|
||||||
|
|||||||
Reference in New Issue
Block a user