"""Robot Framework helper for exception handling tests. Provides a CLI-style interface for Robot to invoke error classification, redaction, and wrapping. Usage:: python robot/helper_security_exceptions.py classify python robot/helper_security_exceptions.py redact python robot/helper_security_exceptions.py wrap """ from __future__ import annotations import json import sys from pathlib import Path # Ensure the src directory is on the import path. _SRC = str(Path(__file__).resolve().parents[1] / "src") if _SRC not in sys.path: sys.path.insert(0, _SRC) from cleveragents.core.error_handling import ( # noqa: E402 classify_error, format_error_for_cli, redact_error_details, wrap_unexpected, ) from cleveragents.core.exceptions import ( # noqa: E402 AuthenticationError, CleverAgentsError, ConfigurationError, DatabaseError, ValidationError, ) _ERROR_TYPES: dict[str, type[Exception]] = { "validation": ValidationError, "auth": AuthenticationError, "config": ConfigurationError, "database": DatabaseError, "bare": Exception, } def _cmd_classify(args: list[str]) -> int: """Classify an error by type name.""" if len(args) < 1: print("Usage: classify ") return 1 etype = args[0] exc_cls = _ERROR_TYPES.get(etype, Exception) exc = exc_cls("test error") info = classify_error(exc) output = format_error_for_cli(info) print(f"exc-classify-ok: code={info.code.value} name={info.code.name}") print(output) return 0 def _cmd_redact(args: list[str]) -> int: """Redact a key-value pair.""" if len(args) < 2: print("Usage: redact ") return 1 details = {args[0]: args[1]} redacted = redact_error_details(details) print(f"exc-redact-ok: {json.dumps(redacted)}") return 0 def _cmd_wrap(args: list[str]) -> int: """Wrap a bare Exception.""" if len(args) < 1: print("Usage: wrap ") return 1 exc = Exception(args[0]) wrapped = wrap_unexpected(exc) is_ca = isinstance(wrapped, CleverAgentsError) print(f"exc-wrap-ok: is_ca={is_ca} msg={wrapped.message}") return 0 def main() -> int: """Entry point called by Robot Framework ``Run Process``.""" if len(sys.argv) < 2: print("Usage: helper_security_exceptions.py ...") return 1 command = sys.argv[1] args = sys.argv[2:] dispatch = { "classify": _cmd_classify, "redact": _cmd_redact, "wrap": _cmd_wrap, } handler = dispatch.get(command) if handler is None: print(f"Unknown command: {command}") return 1 return handler(args) if __name__ == "__main__": sys.exit(main())