Skip to content

Commit ab4e63d

Browse files
vinnytherobotclaude
andcommitted
test(filters): add tests for --since/--until time filtering
Add comprehensive test coverage for time-based log filtering: - Test --since filter (exclude logs before time) - Test --until filter (exclude logs after time) - Test combined since+until range filtering - Test entries without timestamps - Test boundary conditions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3d43316 commit ab4e63d

1 file changed

Lines changed: 76 additions & 1 deletion

File tree

tests/test_filters.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import re
2+
from datetime import datetime, timedelta
23

3-
from logscope.viewer import line_passes_level, line_passes_search, parse_level_filter
4+
from logscope.viewer import line_passes_level, line_passes_search, parse_level_filter, line_passes_filters
5+
from logscope.parser import LogEntry
46

57

68
def test_parse_level_filter_single():
@@ -46,3 +48,76 @@ def test_line_passes_search_invert():
4648

4749
def test_line_passes_search_no_search_always_passes():
4850
assert line_passes_search("anything", None, pattern=None, use_regex=False, case_sensitive=False, invert_match=True) is True
51+
52+
53+
def make_entry(timestamp: datetime, level: str = "INFO", message: str = "test") -> LogEntry:
54+
"""Helper to create LogEntry for time filter tests."""
55+
return LogEntry(level=level, message=message, raw=f"[{level}] {message}", timestamp=timestamp)
56+
57+
58+
def test_line_passes_filters_since():
59+
"""Test that --since filters out entries before the given time."""
60+
entry_time = datetime(2026, 4, 5, 10, 0, 0)
61+
since_ok = datetime(2026, 4, 5, 9, 0, 0) # 1 hour before entry
62+
since_fail = datetime(2026, 4, 5, 11, 0, 0) # 1 hour after entry
63+
64+
entry = make_entry(entry_time)
65+
66+
assert line_passes_filters(entry, None, None, since_ok, None, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True
67+
assert line_passes_filters(entry, None, None, since_fail, None, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is False
68+
69+
70+
def test_line_passes_filters_until():
71+
"""Test that --until filters out entries after the given time."""
72+
entry_time = datetime(2026, 4, 5, 10, 0, 0)
73+
until_ok = datetime(2026, 4, 5, 11, 0, 0) # 1 hour after entry
74+
until_fail = datetime(2026, 4, 5, 9, 0, 0) # 1 hour before entry
75+
76+
entry = make_entry(entry_time)
77+
78+
assert line_passes_filters(entry, None, None, None, until_ok, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True
79+
assert line_passes_filters(entry, None, None, None, until_fail, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is False
80+
81+
82+
def test_line_passes_filters_since_until_range():
83+
"""Test combining --since and --until to create a time range."""
84+
entry_time = datetime(2026, 4, 5, 10, 0, 0)
85+
since = datetime(2026, 4, 5, 9, 0, 0)
86+
until = datetime(2026, 4, 5, 11, 0, 0)
87+
88+
entry = make_entry(entry_time)
89+
90+
# Entry within range passes
91+
assert line_passes_filters(entry, None, None, since, until, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True
92+
93+
# Entry before range fails
94+
entry_early = make_entry(datetime(2026, 4, 5, 8, 0, 0))
95+
assert line_passes_filters(entry_early, None, None, since, until, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is False
96+
97+
# Entry after range fails
98+
entry_late = make_entry(datetime(2026, 4, 5, 12, 0, 0))
99+
assert line_passes_filters(entry_late, None, None, since, until, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is False
100+
101+
102+
def test_line_passes_filters_no_timestamp():
103+
"""Test that entries without timestamp pass time filters."""
104+
entry = LogEntry(level="INFO", message="test", raw="[INFO] test", timestamp=None)
105+
106+
since = datetime(2026, 4, 5, 10, 0, 0)
107+
until = datetime(2026, 4, 5, 12, 0, 0)
108+
109+
# Should pass because no timestamp to filter
110+
assert line_passes_filters(entry, None, None, since, None, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True
111+
assert line_passes_filters(entry, None, None, None, until, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True
112+
113+
114+
def test_line_passes_filters_exact_boundary():
115+
"""Test that boundaries are inclusive for --since and exclusive for --until."""
116+
entry_time = datetime(2026, 4, 5, 10, 0, 0)
117+
entry = make_entry(entry_time)
118+
119+
# Exact since should pass (inclusive)
120+
assert line_passes_filters(entry, None, None, entry_time, None, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True
121+
122+
# Exact until should pass (inclusive)
123+
assert line_passes_filters(entry, None, None, None, entry_time, pattern=None, use_regex=False, case_sensitive=False, invert_match=False) is True

0 commit comments

Comments
 (0)