feat(classifier): ✨ add classifier feature on log entries
add classifier on log entries, clean test functions and uniform fixtures in windows-1252 since all logs are encoded in windows-1252
This commit is contained in:
+60
-10
@@ -4,10 +4,9 @@ from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from logwatcher.classifier import N2_PATTERNS
|
||||
from logwatcher.classifier import N2_PATTERNS, classify_log_entries
|
||||
from logwatcher.config import FIXTURE_PATH
|
||||
|
||||
ORIGINAL_LOGS_DIR = FIXTURE_PATH / "original_logs"
|
||||
from logwatcher.parser import parse_log_file
|
||||
|
||||
|
||||
def _pattern_name_to_filename(name: str) -> str:
|
||||
@@ -21,20 +20,20 @@ def _read_fixture(path: Path) -> str:
|
||||
Read a file with fallback Windows-1252.
|
||||
"""
|
||||
try:
|
||||
contenu = path.read_text(encoding="utf-8")
|
||||
content = path.read_text(encoding="utf-8")
|
||||
except UnicodeDecodeError:
|
||||
return path.read_text(encoding="windows-1252")
|
||||
if "\ufffd" not in contenu:
|
||||
return contenu
|
||||
content = path.read_text(encoding="windows-1252")
|
||||
if "\ufffd" not in content:
|
||||
return content
|
||||
return path.read_text(encoding="windows-1252") # TODO: improve coverage score
|
||||
|
||||
@pytest.mark.parametrize("name, pattern", N2_PATTERNS.items())
|
||||
def test_pattern_matches_fixture(name, pattern):
|
||||
def test_pattern_matches_fixture(valid_log_dir, name, pattern):
|
||||
"""
|
||||
Assert each N2 pattern must match at least one line in its fixture.
|
||||
"""
|
||||
|
||||
fixture = ORIGINAL_LOGS_DIR / _pattern_name_to_filename(name)
|
||||
fixture = valid_log_dir / _pattern_name_to_filename(name)
|
||||
if not fixture.exists():
|
||||
msg = f"No fixture named '{fixture}'"
|
||||
warnings.warn(msg)
|
||||
@@ -85,4 +84,55 @@ def test_no_orphan_fixtures():
|
||||
expected = {f"CR_{name.lower()}.txt" for name in N2_PATTERNS}
|
||||
actual = {f.name for f in FIXTURE_PATH.glob("CR_*.txt")}
|
||||
orphan = actual - expected
|
||||
assert not orphan, f"Fixtures orphelines (sans pattern) : {sorted(orphan)}"
|
||||
assert not orphan, f"Fixtures orphelines (sans pattern) : {sorted(orphan)}"
|
||||
|
||||
|
||||
def test_classify_log_entries_all_relevant(valid_log_dir: Path):
|
||||
"""
|
||||
Must return an empty irrelevant log entry list
|
||||
"""
|
||||
log_file = valid_log_dir / "only_relevant_logs.txt"
|
||||
log_entries = parse_log_file(log_file)
|
||||
|
||||
# all entries are relevant
|
||||
relevant, irrelevant = classify_log_entries(log_entries)
|
||||
|
||||
assert relevant and not irrelevant
|
||||
|
||||
|
||||
def test_classify_log_entries_none_relevant(valid_log_dir: Path):
|
||||
"""
|
||||
Must return an empty relevant log entry list
|
||||
"""
|
||||
log_file = valid_log_dir / "no_relevant_error.txt"
|
||||
log_entries = parse_log_file(log_file)
|
||||
|
||||
# all entries are relevant
|
||||
relevant, irrelevant = classify_log_entries(log_entries)
|
||||
|
||||
assert not relevant and irrelevant
|
||||
|
||||
|
||||
def test_classify_log_entries_mixed(valid_log_dir: Path):
|
||||
"""
|
||||
Test classification on relevant and irrelevant log entry list
|
||||
"""
|
||||
log_file = valid_log_dir / "mixed_logs.txt"
|
||||
log_entries = parse_log_file(log_file)
|
||||
|
||||
relevant, irrelevant = classify_log_entries(log_entries)
|
||||
|
||||
assert len(relevant) and len(irrelevant)
|
||||
assert len(relevant) + len(irrelevant) == len(log_entries)
|
||||
|
||||
|
||||
def test_classify_log_entries_empty_log_entries(invalid_log_dir: Path):
|
||||
"""
|
||||
Test classification on an empty log entry list
|
||||
"""
|
||||
empty_file = invalid_log_dir / "empty_file.txt"
|
||||
log_entries = parse_log_file(empty_file)
|
||||
|
||||
relevant, irrelevant = classify_log_entries(log_entries)
|
||||
|
||||
assert not relevant and not irrelevant
|
||||
|
||||
Reference in New Issue
Block a user