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()
|
||||
redmine.session.mount("https://", retry_adapter)
|
||||
redmine.session.mount("http://", retry_adapter)
|
||||
redmine.engine.session.mount("https://", retry_adapter)
|
||||
redmine.engine.session.mount("http://", retry_adapter)
|
||||
|
||||
return redmine
|
||||
|
||||
|
||||
def _fetch_issues_chunked(
|
||||
redmine: Redmine, issue_ids: List[int]
|
||||
) -> List[Issue]:
|
||||
def _fetch_issues_chunked(redmine: Redmine, issue_ids: List[int]) -> List[Issue]:
|
||||
"""Загружает задачи чанками, чтобы не превышать лимит длины URL (#21)."""
|
||||
all_issues: List[Issue] = []
|
||||
for i in range(0, len(issue_ids), ISSUE_ID_CHUNK_SIZE):
|
||||
chunk = issue_ids[i : i + ISSUE_ID_CHUNK_SIZE]
|
||||
issue_list_str = ",".join(str(x) for x in chunk)
|
||||
issues = redmine.issue.filter(
|
||||
issue_id=issue_list_str, status_id="*", sort="project:asc"
|
||||
)
|
||||
issues = redmine.issue.filter(issue_id=issue_list_str, status_id="*", sort="project:asc")
|
||||
all_issues.extend(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")
|
||||
|
||||
# Проверяем, что session.mount был вызван для http:// и https://
|
||||
mount_calls = mock_redmine.session.mount.call_args_list
|
||||
# Проверяем, что engine.session.mount был вызван для http:// и https://
|
||||
mount_calls = mock_redmine.engine.session.mount.call_args_list
|
||||
prefixes = [call.args[0] for call in mount_calls]
|
||||
assert "https://" in prefixes
|
||||
assert "http://" in prefixes
|
||||
|
||||
# Проверяем retry-конфигурацию адаптера
|
||||
https_adapter = next(
|
||||
call.args[1] for call in mount_calls if call.args[0] == "https://"
|
||||
)
|
||||
https_adapter = next(call.args[1] for call in mount_calls if call.args[0] == "https://")
|
||||
max_retries = https_adapter.max_retries
|
||||
assert max_retries.total == 3
|
||||
assert 429 in max_retries.status_forcelist
|
||||
|
||||
Reference in New Issue
Block a user