diff --git a/src/blueapi/utils/numtracker.py b/src/blueapi/utils/numtracker.py index 91e3c66c2a..ddd489f877 100644 --- a/src/blueapi/utils/numtracker.py +++ b/src/blueapi/utils/numtracker.py @@ -105,6 +105,14 @@ async def create_scan( json = response.json() if json.get("errors") is not None: + for error in json["errors"]: + code = (error.get("extensions") or {}).get("code") + + if code == "AUTH_FAILED": + raise RuntimeError( + f"Not authorised to create a scan number for " + f"{instrument} and {instrument_session}." + ) 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..c69ff0b01d 100644 --- a/tests/unit_tests/utils/test_numtracker.py +++ b/tests/unit_tests/utils/test_numtracker.py @@ -33,6 +33,18 @@ def numtracker() -> NumtrackerClient: ], } +AUTH_ERROR = { + "data": None, + "errors": [ + { + "message": "No configuration available for instrument p46", + "locations": [{"line": 3, "column": 5}], + "path": ["scan"], + "extensions": {"code": "AUTH_FAILED"}, + } + ], +} + async def test_create_scan( numtracker: NumtrackerClient, httpx_mock: HTTPXMock, nt_query, nt_response @@ -109,3 +121,19 @@ async def test_create_scan_raises_runtime_error_on_graphql_error( ) with pytest.raises(RuntimeError, match="Numtracker error:"): await numtracker.create_scan("ab123", "p46") + + +async def test_create_scan_raises_runtime_auth_error_on_graphql_error( + numtracker: NumtrackerClient, httpx_mock: HTTPXMock, nt_query +): + httpx_mock.add_response( + method="POST", + url=URL, + match_json=nt_query, + status_code=200, + json=AUTH_ERROR, + ) + with pytest.raises( + RuntimeError, match="Not authorised to create a scan number for p46 and ab123" + ): + await numtracker.create_scan("ab123", "p46")