diff --git a/src/blueapi/utils/numtracker.py b/src/blueapi/utils/numtracker.py index 91e3c66c2a..0fde7c699e 100644 --- a/src/blueapi/utils/numtracker.py +++ b/src/blueapi/utils/numtracker.py @@ -105,6 +105,18 @@ async def create_scan( json = response.json() if json.get("errors") is not None: + for error in json["errors"]: + code = error.get("extensions", {}).get("code") + match code: + case "AUTH_FAILED": + raise RuntimeError( + f"Not authorised to create a scan number for " + f"{instrument} and {instrument_session}" + ) + case "AUTH_MISSING": + raise RuntimeError("Numtracker authentication missing") + case "AUTH_SERVER_ERROR": + raise RuntimeError("Numtracker server authentication error") raise RuntimeError(f"Numtracker error: {json['errors']}") new_collection = NumtrackerScanMutationResponse.model_validate(json["data"]) diff --git a/tests/unit_tests/utils/test_numtracker.py b/tests/unit_tests/utils/test_numtracker.py index 859dbaf098..1aa6df9e88 100644 --- a/tests/unit_tests/utils/test_numtracker.py +++ b/tests/unit_tests/utils/test_numtracker.py @@ -109,3 +109,41 @@ async def test_create_scan_raises_runtime_error_on_graphql_error( ) with pytest.raises(RuntimeError, match="Numtracker error:"): await numtracker.create_scan("ab123", "p46") + + +@pytest.mark.parametrize( + ("auth_error_code", "expected_message"), + [ + ("AUTH_FAILED", "Not authorised to create a scan number for p46 and ab123"), + ("AUTH_MISSING", "Numtracker authentication missing"), + ("AUTH_SERVER_ERROR", "Numtracker server authentication error"), + ("UNKNOWN_ERROR", "Numtracker error:"), + ], +) +async def test_numtracker_auth_error_types( + numtracker: NumtrackerClient, + httpx_mock: HTTPXMock, + nt_query, + auth_error_code, + expected_message, +): + error_response = { + "data": None, + "errors": [ + { + "message": "xyz", + "locations": [{"line": 3, "column": 5}], + "path": ["scan"], + "extensions": {"code": auth_error_code}, + } + ], + } + httpx_mock.add_response( + method="POST", + url=URL, + match_json=nt_query, + status_code=200, + json=error_response, + ) + with pytest.raises(RuntimeError, match=expected_message): + await numtracker.create_scan("ab123", "p46")