Skip to content

Commit 7388c6a

Browse files
Sobes76rusAnton
andauthored
feat: no result error (#137)
Co-authored-by: Anton <[email protected]>
1 parent 4b922c0 commit 7388c6a

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

taskiq/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,7 @@ class ResultIsReadyError(ResultBackendError):
3232

3333
class SecurityError(TaskiqError):
3434
"""Security related exception."""
35+
36+
37+
class NoResultError(TaskiqError):
38+
"""Error if user does not want to set result."""

taskiq/receiver/receiver.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from taskiq.abc.broker import AsyncBroker
1212
from taskiq.abc.middleware import TaskiqMiddleware
1313
from taskiq.context import Context
14+
from taskiq.exceptions import NoResultError
1415
from taskiq.message import TaskiqMessage
1516
from taskiq.receiver.params_parser import parse_params
1617
from taskiq.result import TaskiqResult
@@ -125,10 +126,11 @@ async def callback( # noqa: C901, WPS213
125126
if middleware.__class__.post_execute != TaskiqMiddleware.post_execute:
126127
await maybe_awaitable(middleware.post_execute(taskiq_msg, result))
127128
try:
128-
await self.broker.result_backend.set_result(taskiq_msg.task_id, result)
129-
for middleware in self.broker.middlewares:
130-
if middleware.__class__.post_save != TaskiqMiddleware.post_save:
131-
await maybe_awaitable(middleware.post_save(taskiq_msg, result))
129+
if not isinstance(result.error, NoResultError):
130+
await self.broker.result_backend.set_result(taskiq_msg.task_id, result)
131+
for middleware in self.broker.middlewares:
132+
if middleware.__class__.post_save != TaskiqMiddleware.post_save:
133+
await maybe_awaitable(middleware.post_save(taskiq_msg, result))
132134
except Exception as exc:
133135
logger.exception(
134136
"Can't set result in result backend. Cause: %s",

tests/cli/worker/test_receiver.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from taskiq.abc.broker import AsyncBroker
99
from taskiq.abc.middleware import TaskiqMiddleware
1010
from taskiq.brokers.inmemory_broker import InMemoryBroker
11+
from taskiq.exceptions import NoResultError, TaskiqResultTimeoutError
1112
from taskiq.message import TaskiqMessage
1213
from taskiq.receiver import Receiver
1314
from taskiq.result import TaskiqResult
@@ -284,3 +285,52 @@ async def task_sem() -> int:
284285
assert sem_num == max_async_tasks
285286
await listen_task
286287
assert sem_num == max_async_tasks + 2
288+
289+
290+
@pytest.mark.anyio
291+
async def test_no_result_error() -> None:
292+
broker = InMemoryBroker()
293+
executed = asyncio.Event()
294+
295+
@broker.task
296+
async def task_no_result() -> int:
297+
executed.set()
298+
raise NoResultError()
299+
300+
task = await task_no_result.kiq()
301+
with pytest.raises(TaskiqResultTimeoutError):
302+
await task.wait_result(timeout=1)
303+
304+
assert executed.is_set()
305+
assert not broker._running_tasks
306+
307+
308+
@pytest.mark.anyio
309+
async def test_result() -> None:
310+
broker = InMemoryBroker()
311+
312+
@broker.task
313+
async def task_no_result() -> str:
314+
return "some value"
315+
316+
task = await task_no_result.kiq()
317+
resp = await task.wait_result(timeout=1)
318+
319+
assert resp.return_value == "some value"
320+
assert not broker._running_tasks
321+
322+
323+
@pytest.mark.anyio
324+
async def test_error_result() -> None:
325+
broker = InMemoryBroker()
326+
327+
@broker.task
328+
async def task_no_result() -> str:
329+
raise ValueError("some error")
330+
331+
task = await task_no_result.kiq()
332+
resp = await task.wait_result(timeout=1)
333+
334+
assert resp.return_value is None
335+
assert not broker._running_tasks
336+
assert isinstance(resp.error, ValueError)

0 commit comments

Comments
 (0)