From 5582c817230d04663976e67d58562331bebad509 Mon Sep 17 00:00:00 2001 From: Maximilien Cuony Date: Wed, 14 Jan 2026 12:07:49 +0100 Subject: [PATCH] [monitorlib] Handle gracefully missing field in versionning client --- .../clients/versioning/client_interuss.py | 11 ++ .../versioning/client_interuss_test.py | 106 ++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 monitoring/monitorlib/clients/versioning/client_interuss_test.py diff --git a/monitoring/monitorlib/clients/versioning/client_interuss.py b/monitoring/monitorlib/clients/versioning/client_interuss.py index b7abd515a2..f1a267c67e 100644 --- a/monitoring/monitorlib/clients/versioning/client_interuss.py +++ b/monitoring/monitorlib/clients/versioning/client_interuss.py @@ -43,6 +43,17 @@ def get_version(self, version_type: str | None) -> GetVersionResponse: raise VersionQueryError( f"Response to get version could not be parsed: {str(e)}", query ) + + if not resp.has_field_with_value("system_identity"): + raise VersionQueryError( + "Response to get version didn't return a system identity" + ) + + if not resp.has_field_with_value("system_version"): + raise VersionQueryError( + "Response to get version didn't return a system version" + ) + if resp.system_identity != version_type: raise VersionQueryError( f"Response to get version indicated version for system '{resp.system_identity}' when the version for system '{version_type}' was requested" diff --git a/monitoring/monitorlib/clients/versioning/client_interuss_test.py b/monitoring/monitorlib/clients/versioning/client_interuss_test.py new file mode 100644 index 0000000000..d63db18b31 --- /dev/null +++ b/monitoring/monitorlib/clients/versioning/client_interuss_test.py @@ -0,0 +1,106 @@ +from datetime import datetime + +import pytest +from implicitdict import StringBasedDateTime + +from monitoring.monitorlib.fetch import ( + Query, + RequestDescription, + ResponseDescription, +) +from monitoring.monitorlib.infrastructure import UTMClientSession +from monitoring.uss_qualifier.configurations.configuration import ParticipantID + +from .client_interuss import InterUSSVersioningClient, VersionQueryError + + +@pytest.fixture +def client(): + return InterUSSVersioningClient(UTMClientSession(prefix_url="/"), ParticipantID()) + + +def build_query_response(code, data): + return Query( + request=RequestDescription( + method=None, + url=None, + initiated_at=StringBasedDateTime(datetime.fromtimestamp(0)), + ), + response=ResponseDescription(elapsed_s=0, reported=None, code=code, json=data), + ) + + +def test_get_version_nominal(mocker, client): + mocker.patch( + "monitoring.monitorlib.clients.versioning.client_interuss.query_and_describe", + return_value=build_query_response( + 200, {"system_identity": "test", "system_version": "test_version"} + ), + ) + + assert client.get_version("test").version == "test_version" + + +def test_get_version_non_200(mocker, client): + mocker.patch( + "monitoring.monitorlib.clients.versioning.client_interuss.query_and_describe", + return_value=build_query_response( + 500, {"system_identity": "test", "system_version": "test_version"} + ), + ) + + with pytest.raises(VersionQueryError, match="rather than 200 as expected"): + client.get_version("test") + + +def test_get_version_wrong_body(mocker, client): + mocker.patch( + "monitoring.monitorlib.clients.versioning.client_interuss.query_and_describe", + return_value=build_query_response(200, None), + ) + + with pytest.raises( + VersionQueryError, match="Response to get version could not be parsed" + ): + client.get_version("test") + + +def test_get_version_no_system_identity(mocker, client): + mocker.patch( + "monitoring.monitorlib.clients.versioning.client_interuss.query_and_describe", + return_value=build_query_response(200, {"system_version": "test_version"}), + ) + + with pytest.raises( + VersionQueryError, + match="Response to get version didn't return a system identity", + ): + client.get_version("test") + + +def test_get_version_no_system_version(mocker, client): + mocker.patch( + "monitoring.monitorlib.clients.versioning.client_interuss.query_and_describe", + return_value=build_query_response(200, {"system_identity": "test"}), + ) + + with pytest.raises( + VersionQueryError, + match="Response to get version didn't return a system version", + ): + client.get_version("test") + + +def test_get_version_another_identity(mocker, client): + mocker.patch( + "monitoring.monitorlib.clients.versioning.client_interuss.query_and_describe", + return_value=build_query_response( + 200, {"system_identity": "test2", "system_version": "test_version"} + ), + ) + + with pytest.raises( + VersionQueryError, + match="Response to get version indicated version for system 'test2'", + ): + client.get_version("test")