code-to10 v6 A11: whole-tree audit_log single-writer scan assertion
(cherry picked from commit 9308503f90090526bb91b5aa2ae0971f84781a1d)
This commit is contained in:
1 parent
e7acc143db
commit
e131e8658d
1 file changed
+74
@@ -0,0 +1,74 @@
|
|||||||
|
"""A11: whole-tree audit_log single-writer scan assertion.
|
||||||
|
|
||||||
|
Extends the pre-existing ``NoAuditBypassTestCase`` in
|
||||||
|
``test_audit_automations_chain.py`` (which only scanned
|
||||||
|
``cloud/*.py`` at the top level) to the whole tree: every
|
||||||
|
``.py`` file under the repository root is scanned for a
|
||||||
|
direct audit_log insert code form, except the test fixtures
|
||||||
|
themselves.
|
||||||
|
|
||||||
|
Scope and exclusions, stated so a future red test is readable:
|
||||||
|
|
||||||
|
- Production code: exactly one hit is allowed, ``cloud/auth.py``
|
||||||
|
(``audit_on_conn``, the unified port; ``AuthStore.audit`` is
|
||||||
|
that function plus a commit/retry wrapper, not a second write
|
||||||
|
path). Any new production hit -- any module, any subdirectory
|
||||||
|
(``cloud/skills/...``, ``tools/``, ``deploy/``, ``host.py``,
|
||||||
|
top level) -- turns this test red.
|
||||||
|
- Test fixtures excluded: ``cloud/tests/test_tamper_ledger.py``
|
||||||
|
(tamper simulation) and ``cloud/tests/test_chat_history.py``
|
||||||
|
(legacy-row simulation) deliberately insert audit_log rows
|
||||||
|
into throwaway databases, and
|
||||||
|
``cloud/tests/test_automation_run_due.py`` (a fake PG
|
||||||
|
connection whose ``execute`` matches intercepted audit_log
|
||||||
|
SQL strings and records params in memory -- it executes no
|
||||||
|
SQL at all). They are fixtures, not production writes, and
|
||||||
|
were already documented as out of scope by the pre-existing
|
||||||
|
test. They are listed by name here, not by a broad ``tests/``
|
||||||
|
exclusion, so a new test file that starts writing audit_log
|
||||||
|
directly would still turn this red.
|
||||||
|
- No pending production direct-write points were found at the
|
||||||
|
time this test was added (2026-11-02): the full-tree scan
|
||||||
|
returned only ``cloud/auth.py`` in production code. If a
|
||||||
|
future scan finds one, do NOT silently fix production code
|
||||||
|
under this test's name and do NOT land a red test: record
|
||||||
|
the point in the delivery report and route the fix to its
|
||||||
|
own batch.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import unittest
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
_PATTERN = re.compile(r"INSERT\s+INTO\s+audit_log", re.IGNORECASE)
|
||||||
|
# Fixture files that deliberately insert audit_log rows into
|
||||||
|
# throwaway test databases (see module docstring).
|
||||||
|
_FIXTURE_FILES = {
|
||||||
|
"cloud/tests/test_tamper_ledger.py",
|
||||||
|
"cloud/tests/test_chat_history.py",
|
||||||
|
"cloud/tests/test_automation_run_due.py",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AuditLogSingleWriterTestCase(unittest.TestCase):
|
||||||
|
def test_only_auth_writes_audit_log_tree_wide(self):
|
||||||
|
repo_root = Path(__file__).resolve().parents[2]
|
||||||
|
offenders = []
|
||||||
|
for path in sorted(repo_root.rglob("*.py")):
|
||||||
|
rel = path.relative_to(repo_root).as_posix()
|
||||||
|
if rel in _FIXTURE_FILES:
|
||||||
|
continue
|
||||||
|
# Skip nothing else: .git contains no .py files, and
|
||||||
|
# a work/host-worktrees checkout (if present) is a
|
||||||
|
# separate worktree's copy of the code, not this
|
||||||
|
# tree's production code.
|
||||||
|
if rel.startswith("work/host-worktrees/"):
|
||||||
|
continue
|
||||||
|
text = path.read_text(encoding="utf-8", errors="replace")
|
||||||
|
if _PATTERN.search(text):
|
||||||
|
offenders.append(rel)
|
||||||
|
self.assertEqual(offenders, ["cloud/auth.py"])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
Reference in new issue
Block a user