From fe5176dbe75d9bb122aeb8f25602ebbc64552409 Mon Sep 17 00:00:00 2001 From: JerrettDavis Date: Tue, 14 Jul 2026 23:44:33 -0500 Subject: [PATCH] test(proxy): cover resilient extension loading --- headroom/proxy/extensions.py | 2 -- tests/test_proxy_extensions.py | 46 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 tests/test_proxy_extensions.py diff --git a/headroom/proxy/extensions.py b/headroom/proxy/extensions.py index 54ae08de0..9ead7a6cd 100644 --- a/headroom/proxy/extensions.py +++ b/headroom/proxy/extensions.py @@ -138,8 +138,6 @@ def install_all( # A failing extension disables *itself* and the proxy keeps running # without it — covers environment/auth failures and compatibility # errors (e.g. a plugin built against a core API this version lacks). - # ponytail: if an extension ever needs mandatory fail-closed abort, - # define ExtensionFatalError in this module and re-raise it here. log.warning( "proxy extension %r failed to install and was skipped: %s", name, diff --git a/tests/test_proxy_extensions.py b/tests/test_proxy_extensions.py new file mode 100644 index 000000000..95e76145e --- /dev/null +++ b/tests/test_proxy_extensions.py @@ -0,0 +1,46 @@ +from __future__ import annotations + +import logging +from typing import Any + +from headroom.proxy import extensions + + +def test_install_all_skips_failed_extension_and_continues( + caplog, + capsys, + monkeypatch, +) -> None: + calls: list[str] = [] + + def good(app: Any, config: Any) -> None: + calls.append("good") + + def bad(app: Any, config: Any) -> None: + calls.append("bad") + raise RuntimeError("missing optional dependency") + + monkeypatch.setattr( + extensions, + "discover", + lambda: iter([("bad_ext", bad), ("good_ext", good)]), + ) + + with caplog.at_level(logging.WARNING, logger=extensions.log.name): + installed = extensions.install_all(object(), object(), enabled=["bad_ext", "good_ext"]) + + assert installed == ["good_ext"] + assert calls == ["bad", "good"] + assert "bad_ext" in capsys.readouterr().err + assert "failed to install and was skipped" in caplog.text + assert "proxy extensions skipped due to install errors: bad_ext" in caplog.text + + +def test_install_all_warns_for_missing_requested_extension(caplog, monkeypatch) -> None: + monkeypatch.setattr(extensions, "discover", lambda: iter([])) + + with caplog.at_level(logging.WARNING, logger=extensions.log.name): + installed = extensions.install_all(object(), object(), enabled=["missing_ext"]) + + assert installed == [] + assert "proxy extensions requested but not found: missing_ext" in caplog.text