|
1 | 1 | import uuid |
2 | 2 | from pathlib import Path |
3 | | -from unittest.mock import Mock, patch |
| 3 | +from unittest.mock import MagicMock, Mock, patch |
4 | 4 |
|
5 | 5 | import pytest |
6 | 6 | import requests |
7 | 7 | import responses |
| 8 | +from packaging.version import Version |
8 | 9 |
|
| 10 | +from blueapi import __version__ |
9 | 11 | from blueapi.client.rest import ( |
10 | 12 | BlueapiRestClient, |
11 | 13 | BlueskyRemoteControlError, |
@@ -196,3 +198,36 @@ def test_parameter_error_other_string(): |
196 | 198 | input=34, |
197 | 199 | ) |
198 | 200 | assert str(p1) == "Invalid value 34 for field field_one.0: error_message" |
| 201 | + |
| 202 | + |
| 203 | +@pytest.mark.parametrize( |
| 204 | + "server_version,logging_warning_present", |
| 205 | + [(__version__, False), ("0.0.1", True), (None, False)], |
| 206 | +) |
| 207 | +@patch("blueapi.client.rest.TypeAdapter") |
| 208 | +@patch("blueapi.client.rest.requests.Session.request") |
| 209 | +@patch("blueapi.client.rest.LOGGER") |
| 210 | +def test_server_and_client_versions( |
| 211 | + mock_logger: MagicMock, |
| 212 | + mock_request: Mock, |
| 213 | + mock_type_adapter: Mock, |
| 214 | + rest: BlueapiRestClient, |
| 215 | + server_version: str, |
| 216 | + logging_warning_present: bool, |
| 217 | +): |
| 218 | + response = Mock(spec=requests.Response) |
| 219 | + response.status_code = 200 |
| 220 | + response.headers = {"x-blueapi-version": server_version} |
| 221 | + mock_request.return_value = response |
| 222 | + |
| 223 | + rest.get_plans() |
| 224 | + |
| 225 | + if logging_warning_present: |
| 226 | + mock_logger.warning.assert_called_once_with( |
| 227 | + f"Version mismatch: Blueapi server version is " |
| 228 | + f"{Version(server_version).base_version} " |
| 229 | + f"but client version is {Version(__version__).base_version}. " |
| 230 | + f"Some features may not work as expected." |
| 231 | + ) |
| 232 | + else: |
| 233 | + mock_logger.assert_not_called() |
0 commit comments