From 2b5f20d0ec11b6758362683591f147ca84c51b81 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 21 Apr 2026 14:22:32 +0100 Subject: [PATCH] fix: safer version --- application/updates/version_check.py | 16 +++++++++++++++- tests/test_version_check.py | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/application/updates/version_check.py b/application/updates/version_check.py index 70b9254d..eeeaeab2 100644 --- a/application/updates/version_check.py +++ b/application/updates/version_check.py @@ -192,8 +192,22 @@ def _release_lock(redis_client) -> None: def _fetch(instance_id: str) -> Optional[Dict[str, Any]]: + version = get_version() + if version in ("", "unknown"): + # The endpoint rejects payloads without a valid semver, and the + # rejection is otherwise logged at DEBUG — invisible under the + # usual ``-l INFO`` Celery worker start. Surface it loudly so a + # misconfigured release (missing or unset ``__version__``) is + # obvious instead of silently disabling the check. + logger.warning( + "version check: skipping — get_version() returned %r. " + "Set __version__ in application/version.py to a valid " + "version string.", + version, + ) + return None payload = { - "version": get_version(), + "version": version, "instance_id": instance_id, "python_version": platform.python_version(), "platform": sys.platform, diff --git a/tests/test_version_check.py b/tests/test_version_check.py index cb060fc0..0848ba0b 100644 --- a/tests/test_version_check.py +++ b/tests/test_version_check.py @@ -295,6 +295,31 @@ def test_redis_unavailable_proceeds_uncached(monkeypatch, enable_check): post_spy.assert_called_once() +@pytest.mark.unit +def test_unknown_version_warns_and_skips(monkeypatch, enable_check): + """get_version() → "unknown" must not hit the endpoint silently.""" + repo = _FakeRepo({"version_check_notice_shown": "1"}) + _install_repo(monkeypatch, repo) + _install_db_session(monkeypatch) + redis_client = _make_redis_mock(get_return=None, set_return=True) + monkeypatch.setattr(vc_module, "get_redis_instance", lambda: redis_client) + monkeypatch.setattr(vc_module, "get_version", lambda: "unknown") + + post_spy = MagicMock() + monkeypatch.setattr(vc_module.requests, "post", post_spy) + + with patch.object(vc_module, "logger") as mock_logger: + vc_module.run_check() + + post_spy.assert_not_called() + redis_client.setex.assert_not_called() + # Lock released so the next cycle can retry. + redis_client.delete.assert_called_once_with(vc_module.LOCK_KEY) + assert mock_logger.warning.called + assert "unknown" in mock_logger.warning.call_args.args[0].lower() \ + or mock_logger.warning.call_args.args[1:] == ("unknown",) + + @pytest.mark.unit def test_http_5xx_swallowed(monkeypatch, enable_check): repo = _FakeRepo({"version_check_notice_shown": "1"})