Files
BlackVortexAIandClaude Fable 5.1 4276ddab80 Close workflow-reachable file, model and endpoint boundaries
- Text logs accept only .txt, .json and .log names; other endings are
  rejected before any write.
- LoRA paths from workflows are approved by one shared rule: inside the
  configured ComfyUI LoRA folders and .safetensors only, for loading and
  for the Civitai metadata hashes alike. Metadata fails closed when the
  folders are unknown.
- BV Remote LLM Provider no longer has an endpoint widget. The destination
  is resolved by the backend from the provider catalog, the approved
  API-key binding or the local settings file; the Configure dialog takes
  the destination for custom bearer profiles and workflows saved before
  this change drop the stale widget value on load.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 14:01:58 +02:00

63 lines
3.1 KiB
Python

from pathlib import Path
import tempfile
import unittest
from py.util.text_log import safe_log_name, write_text_log
class TextLogWriterTests(unittest.TestCase):
def test_safe_log_name_removes_paths_and_reserved_names(self):
self.assertEqual(safe_log_name("../../enhancer diff.json"), "enhancer_diff.json")
self.assertEqual(safe_log_name("CON"), "_CON.txt")
def test_safe_log_name_accepts_only_text_suffixes(self):
self.assertEqual(safe_log_name("run"), "run.txt")
self.assertEqual(safe_log_name("run.LOG"), "run.LOG")
for name in ("payload.pt", "payload.py", "payload.html", "page.htm", "report.v2"):
with self.subTest(name=name), self.assertRaisesRegex(ValueError, "must end with one of"):
safe_log_name(name)
def test_rejected_suffix_writes_nothing(self):
with tempfile.TemporaryDirectory() as directory:
for mode in ("overwrite", "append", "timestamped"):
with self.subTest(mode=mode), self.assertRaises(ValueError):
write_text_log(directory, "payload", "payload.pt", mode)
log_directory = Path(directory) / "bv_logs"
self.assertEqual(list(log_directory.iterdir()) if log_directory.exists() else [], [])
def test_overwrite_uses_stable_file_and_utf8(self):
with tempfile.TemporaryDirectory() as directory:
first = write_text_log(directory, "eins ä", "result.txt", "overwrite")
second = write_text_log(directory, "zwei", "result.txt", "overwrite")
self.assertEqual(first, second)
self.assertEqual(second.read_text(encoding="utf-8"), "zwei")
self.assertEqual(second.parent, Path(directory).resolve() / "bv_logs")
def test_append_separates_runs_and_timestamped_preserves_suffix(self):
with tempfile.TemporaryDirectory() as directory:
appended = write_text_log(directory, "first", "diagnostics.log", "append")
write_text_log(directory, "second", "diagnostics.log", "append")
content = appended.read_text(encoding="utf-8")
self.assertIn("first", content)
self.assertIn("second", content)
timestamped = write_text_log(directory, "{}", "diff.json", "timestamped")
self.assertEqual(timestamped.suffix, ".json")
self.assertTrue(timestamped.name.startswith("diff-"))
def test_rejects_unknown_mode(self):
with tempfile.TemporaryDirectory() as directory:
with self.assertRaisesRegex(ValueError, "Unsupported BV text log mode"):
write_text_log(directory, "text", "name", "elsewhere")
def test_timestamped_mode_never_reuses_the_same_path(self):
with tempfile.TemporaryDirectory() as directory:
first = write_text_log(directory, "first", "enhancer.json", "timestamped")
second = write_text_log(directory, "second", "enhancer.json", "timestamped")
self.assertNotEqual(first, second)
self.assertEqual(first.read_text(encoding="utf-8"), "first")
self.assertEqual(second.read_text(encoding="utf-8"), "second")
if __name__ == "__main__":
unittest.main()