Skip to content

Commit 6d6bcc6

Browse files
committed
fix: TaskiqAdminMiddleware compatibility with python <3.11
1 parent 9339f9d commit 6d6bcc6

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

taskiq/middlewares/taskiq_admin_middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import asyncio
2-
from datetime import UTC, datetime
2+
from datetime import datetime, timezone
33
from logging import getLogger
44
from typing import Any
55
from urllib.parse import urljoin
@@ -48,7 +48,7 @@ def __init__(
4848

4949
@staticmethod
5050
def _now_iso() -> str:
51-
return datetime.now(UTC).replace(tzinfo=None).isoformat()
51+
return datetime.now(timezone.utc).replace(tzinfo=None).isoformat()
5252

5353
def _get_client(self) -> aiohttp.ClientSession:
5454
"""Create and cache session."""
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import asyncio
2+
from unittest.mock import AsyncMock, Mock, patch
3+
4+
import pytest
5+
6+
from taskiq import TaskiqMessage
7+
from taskiq.middlewares.taskiq_admin_middleware import TaskiqAdminMiddleware
8+
9+
10+
@pytest.fixture
11+
async def middleware() -> TaskiqAdminMiddleware:
12+
middleware = TaskiqAdminMiddleware(
13+
url="http://localhost:8000",
14+
api_token="test-token", # noqa: S106
15+
timeout=5,
16+
taskiq_broker_name="test-broker",
17+
)
18+
await middleware.startup()
19+
yield middleware
20+
await middleware.shutdown()
21+
22+
23+
@pytest.fixture
24+
def message() -> TaskiqMessage:
25+
return TaskiqMessage(
26+
task_id="task-123",
27+
task_name="test_task",
28+
labels={},
29+
args=[1, 2, 3],
30+
kwargs={"key": "value"},
31+
)
32+
33+
34+
def _make_mock_response() -> AsyncMock:
35+
"""Create a properly configured mock response object."""
36+
mock_response = AsyncMock()
37+
mock_response.__aenter__.return_value = mock_response
38+
mock_response.__aexit__.return_value = None
39+
mock_response.ok = True
40+
mock_response.raise_for_status = Mock()
41+
return mock_response
42+
43+
44+
class TestTaskiqAdminMiddlewarePostSend:
45+
@pytest.mark.anyio
46+
async def test_when_post_send_is_called__then_queued_endpoint_is_called(
47+
self,
48+
middleware: TaskiqAdminMiddleware,
49+
message: TaskiqMessage,
50+
) -> None:
51+
# Given
52+
with patch("aiohttp.ClientSession.post") as mock_post:
53+
mock_response = _make_mock_response()
54+
mock_post.return_value = mock_response
55+
56+
# When
57+
await middleware.post_send(message)
58+
await asyncio.sleep(0.1)
59+
60+
# Then
61+
mock_post.assert_called()
62+
assert mock_post.call_args is not None
63+
assert "/api/tasks/task-123/queued" in mock_post.call_args[0][0]
64+
65+
@pytest.mark.anyio
66+
async def test_when_post_send_is_called__then_payload_includes_task_info(
67+
self,
68+
middleware: TaskiqAdminMiddleware,
69+
message: TaskiqMessage,
70+
) -> None:
71+
# Given
72+
with patch("aiohttp.ClientSession.post") as mock_post:
73+
mock_response = _make_mock_response()
74+
mock_post.return_value = mock_response
75+
76+
# When
77+
await middleware.post_send(message)
78+
await asyncio.sleep(0.1)
79+
80+
# Then
81+
call_args = mock_post.call_args
82+
assert call_args is not None
83+
payload = call_args[1]["json"]
84+
assert payload["args"] == [1, 2, 3]
85+
assert payload["kwargs"] == {"key": "value"}
86+
assert payload["taskName"] == "test_task"
87+
assert payload["worker"] == "test-broker"
88+
assert "queuedAt" in payload

0 commit comments

Comments
 (0)