Skip to content

Commit d0c2954

Browse files
Fix index out ouf bounds for axis error
1 parent 34cceb7 commit d0c2954

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

src/inspector/inspector.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -326,11 +326,20 @@ def _count_errors(
326326
unique_times, _, unique_counts = np.unique(
327327
timestamps, return_index=True, return_counts=True
328328
)
329-
time_indices = (
330-
((unique_times - min_date) // TIME_RANGE)
331-
.astype(f"timedelta64[{TIME_TYPE}]")
332-
.astype(int)
333-
)
329+
330+
# Compute indices
331+
deltas = unique_times - min_date
332+
time_indices = (deltas / np.timedelta64(TIME_RANGE, TIME_TYPE)).astype(int)
333+
334+
# Filter out-of-range indices
335+
valid_mask = (time_indices >= 0) & (time_indices < counts.size)
336+
if not np.all(valid_mask):
337+
invalid_count = np.count_nonzero(~valid_mask)
338+
logger.warning(f"{invalid_count} timestamps outside expected time range — ignored.")
339+
time_indices = time_indices[valid_mask]
340+
unique_counts = unique_counts[valid_mask]
341+
342+
# Fill counts
334343
counts[time_indices] = unique_counts
335344
else:
336345
logger.warning("Empty messages to inspect.")

tests/inspector/test_inspector.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,56 @@ def test_clear_data_with_existing_data(
221221

222222
class TestDataFunction(unittest.TestCase):
223223

224+
@patch("src.inspector.inspector.ClickHouseKafkaSender")
225+
@patch("src.inspector.inspector.ExactlyOnceKafkaProduceHandler")
226+
@patch("src.inspector.inspector.ExactlyOnceKafkaConsumeHandler")
227+
@patch("src.inspector.inspector.TIME_TYPE", "ms")
228+
@patch("src.inspector.inspector.TIME_RANGE", 1)
229+
def test_count_errors_valid_and_out_of_range(
230+
self, mock_kafka_consume_handler, mock_produce_handler, mock_clickhouse
231+
):
232+
"""Test that _count_errors correctly counts events
233+
and ignores timestamps outside the [begin, end] range.
234+
"""
235+
236+
# Mock Kafka handlers to avoid side effects
237+
mock_kafka_consume_handler.return_value = MagicMock()
238+
mock_produce_handler.return_value = MagicMock()
239+
mock_clickhouse.return_value = MagicMock()
240+
241+
sut = Inspector()
242+
243+
# Prepare timestamps
244+
begin_timestamp = datetime.now()
245+
end_timestamp = begin_timestamp + timedelta(milliseconds=2)
246+
247+
# Message within range
248+
in_range = DEFAULT_DATA.copy()
249+
in_range["timestamp"] = datetime.strftime(
250+
begin_timestamp + timedelta(milliseconds=1),
251+
TIMESTAMP_FORMAT,
252+
)
253+
254+
# Message outside range (should be ignored)
255+
out_of_range = DEFAULT_DATA.copy()
256+
out_of_range["timestamp"] = datetime.strftime(
257+
begin_timestamp + timedelta(milliseconds=10),
258+
TIMESTAMP_FORMAT,
259+
)
260+
261+
messages = [in_range, out_of_range]
262+
263+
# Execute
264+
result = sut._count_errors(messages, begin_timestamp, end_timestamp)
265+
266+
# The expected counts:
267+
# 1 ms → one event
268+
# 0 ms, 2 ms → no events
269+
expected = np.asarray([[0.0], [1.0], [0.0]])
270+
271+
np.testing.assert_array_equal(result, expected)
272+
273+
224274
@patch("src.inspector.inspector.ClickHouseKafkaSender")
225275
@patch("src.inspector.inspector.ExactlyOnceKafkaProduceHandler")
226276
@patch("src.inspector.inspector.ExactlyOnceKafkaConsumeHandler")

0 commit comments

Comments
 (0)