Skip to content

Commit 73f6a6d

Browse files
committed
Add tests for dramatiq init function
Signed-off-by: Federico Busetti <[email protected]>
1 parent 69c22e2 commit 73f6a6d

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

tests/common/test_dramatiq.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from unittest.mock import patch, MagicMock
2+
from dramatiq.encoder import DecodeError
3+
from dramatiq import get_broker, get_encoder
4+
from dramatiq.brokers.stub import StubBroker
5+
6+
import pytest
7+
import orjson
8+
9+
from common import AppConfig
10+
from common.config import DramatiqConfig
11+
from common.dramatiq import ORJSONEncoder, init_dramatiq
12+
13+
14+
@patch("common.dramatiq.orjson.dumps", return_value=b"serialized")
15+
@patch("common.dramatiq.orjson.loads", return_value="deserialized")
16+
def test_orjson_encoder(
17+
mocked_loads: MagicMock,
18+
mocked_dumps: MagicMock,
19+
):
20+
encoder = ORJSONEncoder()
21+
22+
serialized = encoder.encode({})
23+
assert serialized == b"serialized"
24+
mocked_dumps.assert_called_once_with({})
25+
deserialized = encoder.decode(serialized)
26+
assert deserialized == "deserialized"
27+
mocked_loads.assert_called_once_with(b"serialized")
28+
29+
30+
@patch("common.dramatiq.orjson.loads", side_effect=orjson.JSONDecodeError("msg","doc", 123))
31+
def test_orjson_encoder_fails(
32+
mocked_loads: MagicMock,
33+
):
34+
encoder = ORJSONEncoder()
35+
36+
with pytest.raises(DecodeError):
37+
encoder.decode(b"serialized")
38+
39+
40+
def test_init_dramatiq_with_test_env():
41+
"""Test if the StubBroker is set in the 'test' environment."""
42+
config = AppConfig(ENVIRONMENT="test", DRAMATIQ=DramatiqConfig()) # Mock config
43+
init_dramatiq(config)
44+
assert isinstance(get_broker(), StubBroker)
45+
assert isinstance(get_encoder(), ORJSONEncoder)
46+
47+
48+
def test_init_dramatiq_with_redis():
49+
"""Test if the RedisBroker is set with a valid Redis URL."""
50+
redis_url = "redis://localhost:6379/0"
51+
config = AppConfig(
52+
ENVIRONMENT="production", DRAMATIQ=DramatiqConfig(REDIS_URL=redis_url)
53+
) # Mock config
54+
with patch("common.dramatiq.RedisBroker") as mock_redis_broker:
55+
init_dramatiq(config)
56+
mock_redis_broker.assert_called_once_with(url=redis_url)
57+
assert get_broker() == mock_redis_broker.return_value
58+
assert isinstance(get_encoder(), ORJSONEncoder)
59+
60+
61+
def test_init_dramatiq_without_redis_url():
62+
"""Test if an exception is raised when in non-test environment without Redis URL."""
63+
config = AppConfig(ENVIRONMENT="production", DRAMATIQ=DramatiqConfig(REDIS_URL=None)) # Mock config
64+
with pytest.raises(RuntimeError, match="Running a non-test environment without Redis URL set"):
65+
init_dramatiq(config)

0 commit comments

Comments
 (0)