From 9fa71720563621ee29bd9303721215fe9f063872 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 4 Jul 2026 13:18:44 +0900 Subject: [PATCH] chore: add log redaction test --- dzgui/util/redact.py | 1 + tests/test_log_redaction.py | 55 +++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 tests/test_log_redaction.py diff --git a/dzgui/util/redact.py b/dzgui/util/redact.py index 75c2dc9..2f701cd 100644 --- a/dzgui/util/redact.py +++ b/dzgui/util/redact.py @@ -3,6 +3,7 @@ import re from typing import Literal api_filter = r"(.*&key=)([^&]*)(.*)" +# FIXME: handle whitespace after directory name ($HOME root) home_filter = r"(/home/)([^/]*)(.*)" REDACTED = r"\1REDACTED\3" REDACTION_PATTERNS = [api_filter, home_filter] diff --git a/tests/test_log_redaction.py b/tests/test_log_redaction.py new file mode 100644 index 0000000..eb7d88d --- /dev/null +++ b/tests/test_log_redaction.py @@ -0,0 +1,55 @@ +import logging +import pytest + +from dzgui.util.redact import RedactionFilter, REDACTION_PATTERNS + + +class RecordsListHandler(logging.Handler): + def __init__(self) -> None: + super().__init__() + self.records_list = [] + + def emit(self, record: logging.LogRecord) -> None: + self.records_list.append(record) + + def pop(self) -> None: + return self.records_list[-1].msg + + +@pytest.mark.redact +@pytest.mark.parametrize( + "log_error, expect", + [ + ("/home/SENSITIVE_USERNAME/subdir", "/home/REDACTED/subdir"), + ( + "https://url.com/?api&key=SENSITIVE_KEY&results=10", + "https://url.com/?api&key=REDACTED&results=10", + ), + ( + "https://url.com/?api&key=SENSITIVE_KEY", + "https://url.com/?api&key=REDACTED", + ), + ( + "Error in directory: '/home/SENSITIVE_USERNAME/'", + "Error in directory: '/home/REDACTED/'", + ), + ( + "Error in directory: '/home/SENSITIVE_USERNAME'", + "Error in directory: '/home/REDACTED'", + ), + ], +) +def test_log_redaction(log_error: str, expect: str) -> None: + logger = logging.getLogger("TEST") + + handler = RecordsListHandler() + logger.addHandler(handler) + logger.setLevel(logging.DEBUG) + + _filter = RedactionFilter(patterns=REDACTION_PATTERNS) + logger.addFilter(_filter) + + logger.critical(log_error) + redacted = handler.pop() + print(redacted) + assert expect == redacted