Skip to content

Commit 517e2bd

Browse files
committed
add tests for errors and exceptional cases
1 parent ce10336 commit 517e2bd

File tree

2 files changed

+154
-0
lines changed

2 files changed

+154
-0
lines changed

tests/test_error.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import pytest
2+
3+
from taskiq.error import Error
4+
from taskiq.exceptions import SecurityError, TaskiqResultTimeoutError
5+
6+
7+
class SimpleError(Error):
8+
__template__ = "simple"
9+
10+
11+
class ValueTemplateError(Error):
12+
__template__ = "value={value}"
13+
value: int
14+
15+
16+
class DefaultValueTemplateError(Error):
17+
__template__ = "value={value}"
18+
value: int = 10
19+
20+
21+
class BaseError(Error):
22+
__template__ = "base={base}, child={child}"
23+
base: int = 1
24+
25+
26+
class ChildError(BaseError):
27+
child: str
28+
29+
30+
class MissingAnnotationError(Error):
31+
__template__ = "value={value}"
32+
33+
34+
class IndexedTemplateError(Error):
35+
__template__ = "{payload[key]}"
36+
payload: dict[str, str]
37+
38+
39+
def test_simple_error_message_and_repr() -> None:
40+
error = SimpleError()
41+
assert str(error) == "simple"
42+
assert error.args == ("simple",)
43+
assert repr(error).endswith(".SimpleError()")
44+
45+
46+
def test_template_with_required_value() -> None:
47+
error = ValueTemplateError(value=3)
48+
assert str(error) == "value=3"
49+
assert repr(error).endswith(".ValueTemplateError(value=3)")
50+
51+
52+
def test_missing_argument_raises_type_error() -> None:
53+
with pytest.raises(TypeError, match="Missing arguments: 'value'"):
54+
ValueTemplateError()
55+
56+
57+
def test_undeclared_argument_raises_type_error() -> None:
58+
with pytest.raises(TypeError, match="Undeclared arguments: 'extra'"):
59+
ValueTemplateError(value=1, extra=2)
60+
61+
62+
def test_default_value_is_used_without_kwargs() -> None:
63+
error = DefaultValueTemplateError()
64+
assert str(error) == "value=10"
65+
assert repr(error).endswith(".DefaultValueTemplateError(value=10)")
66+
67+
68+
def test_annotations_are_collected_from_inheritance() -> None:
69+
error = ChildError(child="ok")
70+
assert str(error) == "base=1, child=ok"
71+
assert repr(error).endswith(".ChildError(base=1, child='ok')")
72+
73+
74+
def test_template_fields_must_be_annotated() -> None:
75+
with pytest.raises(ValueError, match="Fields must be annotated: 'value'"):
76+
MissingAnnotationError()
77+
78+
79+
def test_indexed_template_field_does_not_require_extra_annotation() -> None:
80+
error = IndexedTemplateError(payload={"key": "value"})
81+
assert str(error) == "value"
82+
83+
84+
def test_taskiq_exceptions_use_error_base_correctly() -> None:
85+
timeout_error = TaskiqResultTimeoutError(timeout=1.5)
86+
security_error = SecurityError(description="boom")
87+
assert str(timeout_error) == "Waiting for task results has timed out, timeout=1.5"
88+
assert str(security_error) == "Security exception occurred: boom"

tests/test_exceptions_flow.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import re
2+
3+
import pytest
4+
5+
from taskiq import InMemoryBroker
6+
from taskiq.brokers.shared_broker import AsyncSharedBroker
7+
from taskiq.exceptions import (
8+
SharedBrokerListenError,
9+
SharedBrokerSendTaskError,
10+
TaskBrokerMismatchError,
11+
UnknownTaskError,
12+
)
13+
from taskiq.message import BrokerMessage
14+
15+
16+
def _broker_message(task_name: str) -> BrokerMessage:
17+
return BrokerMessage(
18+
task_id="task-id",
19+
task_name=task_name,
20+
message=b"{}",
21+
labels={},
22+
)
23+
24+
25+
async def test_inmemory_broker_raises_unknown_task_error() -> None:
26+
broker = InMemoryBroker()
27+
28+
with pytest.raises(
29+
UnknownTaskError,
30+
match=re.escape(
31+
"Cannot send unknown task to the queue, task name - missing.task",
32+
),
33+
):
34+
await broker.kick(_broker_message("missing.task"))
35+
36+
37+
async def test_shared_broker_raises_send_task_error() -> None:
38+
broker = AsyncSharedBroker()
39+
40+
with pytest.raises(
41+
SharedBrokerSendTaskError,
42+
match="You cannot use kiq directly on shared task",
43+
):
44+
await broker.kick(_broker_message("any.task"))
45+
46+
47+
async def test_shared_broker_raises_listen_error() -> None:
48+
broker = AsyncSharedBroker()
49+
50+
with pytest.raises(SharedBrokerListenError, match="Shared broker cannot listen"):
51+
await broker.listen()
52+
53+
54+
def test_registering_task_in_another_broker_raises_mismatch_error() -> None:
55+
first_broker = InMemoryBroker()
56+
second_broker = InMemoryBroker()
57+
58+
@first_broker.task(task_name="test.task")
59+
async def test_task() -> None:
60+
return None
61+
62+
with pytest.raises(
63+
TaskBrokerMismatchError,
64+
match="Task already has a different broker",
65+
):
66+
second_broker._register_task(test_task.task_name, test_task)

0 commit comments

Comments
 (0)