Skip to content

Commit 09f0a93

Browse files
committed
more tests
1 parent 26581e3 commit 09f0a93

File tree

4 files changed

+98
-6
lines changed

4 files changed

+98
-6
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ exclude_lines = [
4040
"if typing.TYPE_CHECKING:",
4141
"@abstractmethod",
4242
]
43-
omit = ["main.py"]
43+
omit = ["main.py"] # No logic here besides argparse
4444

4545

4646
[tool.coverage.html]

tests/test_consume.py

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,84 @@
1+
from unittest import mock
12
from unittest.mock import patch
23

34
import pytest
5+
from confluent_kafka import TopicPartition
46

57
from saluki.consume import consume
68

9+
710
@patch("saluki.consume.Consumer")
811
def test_go_forwards_with_no_offset_raises(_):
912
with pytest.raises(ValueError):
1013
consume("broker", "topic", go_forwards=True, offset=None)
1114

12-
# test that tries going forwards that consumes from offset
1315

14-
# test that checks start offset
16+
@patch("saluki.consume.Consumer")
17+
def test_go_forwards_with_offset_assigns_at_offset(mock_consumer):
18+
expected_topic = "topic"
19+
expected_offset = 1234
20+
expected_partition = 1
21+
consume(
22+
"broker",
23+
expected_topic,
24+
go_forwards=True,
25+
offset=expected_offset,
26+
partition=expected_partition,
27+
)
28+
mock_assign = mock_consumer.return_value.assign
29+
30+
mock_assign.assert_called_with(
31+
[TopicPartition(expected_topic, expected_partition, expected_offset)]
32+
)
33+
34+
35+
@patch("saluki.consume.Consumer")
36+
def test_consume_with_offset_and_num_of_messages_goes_back_offset_minus_messages(
37+
mock_consumer,
38+
):
39+
expected_offset = 1234
40+
expected_topic = "sometopic"
41+
num_messages = 3
42+
expected_start_offset = expected_offset - num_messages + 1
43+
44+
consume("broker", expected_topic, offset=expected_offset, num_messages=num_messages)
45+
46+
mock_assign = mock_consumer.return_value.assign
47+
mock_assign.assert_called_once()
48+
49+
mock_assign_call = mock_assign.call_args.args[0][0]
50+
assert mock_assign_call.topic == expected_topic
51+
assert mock_assign_call.offset == expected_start_offset
52+
53+
54+
@patch("saluki.consume.Consumer")
55+
def test_consume_with_no_offset_and_num_of_messages_goes_back_high_watermark_minus_messages(
56+
mock_consumer,
57+
):
58+
expected_topic = "sometopic"
59+
num_messages = 3
60+
high_watermark_offset = 2345
61+
expected_start_offset = high_watermark_offset - num_messages
62+
63+
mock_consumer.return_value.get_watermark_offsets.return_value = (
64+
None,
65+
high_watermark_offset,
66+
)
67+
68+
consume("broker", topic=expected_topic, num_messages=num_messages)
69+
mock_assign = mock_consumer.return_value.assign
70+
mock_assign.assert_called_once()
71+
72+
mock_assign_call = mock_assign.call_args.args[0][0]
73+
74+
assert mock_assign_call.topic == expected_topic
75+
assert mock_assign_call.offset == expected_start_offset
76+
1577

16-
# test that catches exception
78+
def test_consume_but_exception_thrown_consumer_is_closed():
79+
with (
80+
mock.patch("saluki.consume.Consumer") as c,
81+
):
82+
c.return_value.consume.side_effect = Exception
83+
consume("somebroker", "sometopic", num_messages=1)
84+
c.return_value.close.assert_called_once()

tests/test_listen.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from saluki.listen import listen
66
from unittest import mock
77

8+
89
def test_listen_with_partition_assigns_to_partition():
910
expected_partition = 123
1011
topic = "sometopic"

tests/test_utils.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,23 @@
1+
from unittest.mock import Mock
2+
13
import pytest
24

3-
from saluki.utils import parse_kafka_uri
5+
from saluki.utils import parse_kafka_uri, _parse_timestamp, _deserialise_and_print_messages
6+
from confluent_kafka import Message
7+
8+
@pytest.fixture
9+
def mock_message():
10+
return Mock(spec=Message)
11+
12+
def test_deserialising_message_with_no_message_continues(mock_message):
13+
_deserialise_and_print_messages([mock_message])
14+
15+
def test_deserialising_message_with_error_continues(mock_message):
16+
pass
17+
18+
def test_deserialising_message_with_wrong_partition_continues(mock_message):
19+
pass
20+
421

522

623
# test with normal payload
@@ -11,8 +28,14 @@
1128

1229
# test exception while deserialising
1330

14-
# test _parse_timestamp
1531

32+
def test_parse_timestamp_with_valid_timestamp(mock_message):
33+
mock_message.timestamp.return_value = (1, 1753434939336)
34+
assert _parse_timestamp(mock_message) == '2025-07-25 10:15:39.336000'
35+
36+
def test_parse_timestamp_with_timestamp_not_available(mock_message):
37+
mock_message.timestamp.return_value = (2, "blah")
38+
assert _parse_timestamp(mock_message) == "Unknown"
1639

1740
def test_uri_with_broker_name_and_topic_successfully_split():
1841
test_broker = "localhost"

0 commit comments

Comments
 (0)