diff --git a/importTools/update_locations.py b/importTools/update_locations.py index 1a0327e7..9b1f9fc6 100755 --- a/importTools/update_locations.py +++ b/importTools/update_locations.py @@ -151,6 +151,7 @@ def __init__(self, name): "login_path": "/".join( [self.address.strip("/"), os.environ[f"{name}_LOGIN"].strip("/")] ), + "token_prefix": os.environ.get(f"{name}_TOKEN_PREFIX"), } diff --git a/sdk/python/scilog/authmixin.py b/sdk/python/scilog/authmixin.py index cc8cb1d8..cad851e8 100644 --- a/sdk/python/scilog/authmixin.py +++ b/sdk/python/scilog/authmixin.py @@ -22,6 +22,7 @@ def __init__(self, address, options=None): self._username = options.get("username") self._password = options.get("password") self._login_path = options.get("login_path") + self.options = options def __repr__(self): tn = typename(self) diff --git a/sdk/python/scilog/scicat.py b/sdk/python/scilog/scicat.py index f089ffca..5e2c8577 100644 --- a/sdk/python/scilog/scicat.py +++ b/sdk/python/scilog/scicat.py @@ -1,4 +1,4 @@ -from .authmixin import HEADER_JSON, AuthError, AuthMixin +from .authmixin import HEADER_JSON, AuthError from .httpclient import HttpClient @@ -6,12 +6,13 @@ class SciCatRestAPI(HttpClient): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.login_path = self._login_path or "https://dacat.psi.ch/auth/msad" + self.token_prefix = self.options.get("token_prefix", "") def authenticate(self, username, password): auth_payload = {"username": username, "password": password} res = self._login(auth_payload, HEADER_JSON) try: - token = res["id"] + token = f"{self.token_prefix}{res['id']}" except KeyError as e: raise SciCatAuthError(res) from e else: diff --git a/sdk/python/tests/test_scicat.py b/sdk/python/tests/test_scicat.py new file mode 100644 index 00000000..e9a84bce --- /dev/null +++ b/sdk/python/tests/test_scicat.py @@ -0,0 +1,47 @@ +from unittest.mock import ANY, Mock, patch + +import pytest + +from scilog import SciCat + + +@patch("requests.post") +@patch("requests.get") +@pytest.mark.parametrize( + "token_prefix", + [ + "", + "Bearer ", + ], +) +def test_get_proposals(mock_post, mock_get, token_prefix): + address = "http://scicat" + options = { + "username": f"username{token_prefix}", + "password": "password", + "login_path": f"{address}/login", + "token_prefix": token_prefix, + } + headers = {"Content-type": "application/json", "Accept": "application/json"} + token = "token123" + + scicat = SciCat(address, options=options) + mock_response = Mock() + mock_response.json.return_value = {"id": token} + mock_get.return_value = mock_response + scicat.http_client.config = {} + scicat.proposals + mock_get.assert_called_with( + options["login_path"], + json={"username": options["username"], "password": options["password"]}, + headers=headers, + timeout=ANY, + verify=True, + ) + mock_post.assert_called_with( + f"{address}/proposals", + params=None, + headers={**headers, "Authorization": f"{token_prefix}{token}"}, + timeout=ANY, + verify=True, + )