Skip to content

Commit 19b38bd

Browse files
nejchJohnVillalovos
authored andcommitted
feat(objects): support fetching PATs via id or self endpoint
1 parent 3abc557 commit 19b38bd

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

docs/gl_objects/personal_access_tokens.rst

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ List personal access tokens from other user_id (admin only)::
3131

3232
access_tokens = gl.personal_access_tokens.list(user_id=25)
3333

34+
Get a personal access token by id::
35+
36+
gl.personal_access_tokens.get(123)
37+
38+
Get the personal access token currently used::
39+
40+
gl.personal_access_tokens.get("self")
41+
3442
Revoke a personal access token fetched via list::
3543

3644
access_token = access_tokens[0]

gitlab/v4/objects/personal_access_tokens.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from typing import Any, cast, Union
2+
13
from gitlab.base import RESTManager, RESTObject
2-
from gitlab.mixins import CreateMixin, DeleteMixin, ListMixin, ObjectDeleteMixin
4+
from gitlab.mixins import CreateMixin, DeleteMixin, ObjectDeleteMixin, RetrieveMixin
35
from gitlab.types import ArrayAttribute, RequiredOptional
46

57
__all__ = [
@@ -14,11 +16,16 @@ class PersonalAccessToken(ObjectDeleteMixin, RESTObject):
1416
pass
1517

1618

17-
class PersonalAccessTokenManager(DeleteMixin, ListMixin, RESTManager):
19+
class PersonalAccessTokenManager(DeleteMixin, RetrieveMixin, RESTManager):
1820
_path = "/personal_access_tokens"
1921
_obj_cls = PersonalAccessToken
2022
_list_filters = ("user_id",)
2123

24+
def get(
25+
self, id: Union[str, int], lazy: bool = False, **kwargs: Any
26+
) -> PersonalAccessToken:
27+
return cast(PersonalAccessToken, super().get(id=id, lazy=lazy, **kwargs))
28+
2229

2330
class UserPersonalAccessToken(RESTObject):
2431
pass

tests/unit/objects/test_personal_access_tokens.py

+54-9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
token_url = "http://localhost/api/v4/personal_access_tokens"
1515
single_token_url = f"{token_url}/{token_id}"
16+
self_token_url = f"{token_url}/self"
1617
user_token_url = f"http://localhost/api/v4/users/{user_id}/personal_access_tokens"
1718

1819
content = {
@@ -41,15 +42,47 @@ def resp_create_user_personal_access_token():
4142

4243

4344
@pytest.fixture
44-
def resp_personal_access_token(no_content):
45-
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
45+
def resp_list_personal_access_tokens():
46+
with responses.RequestsMock() as rsps:
4647
rsps.add(
4748
method=responses.GET,
4849
url=token_url,
4950
json=[content],
5051
content_type="application/json",
5152
status=200,
5253
)
54+
yield rsps
55+
56+
57+
@pytest.fixture
58+
def resp_get_personal_access_token():
59+
with responses.RequestsMock() as rsps:
60+
rsps.add(
61+
method=responses.GET,
62+
url=single_token_url,
63+
json=content,
64+
content_type="application/json",
65+
status=200,
66+
)
67+
yield rsps
68+
69+
70+
@pytest.fixture
71+
def resp_get_personal_access_token_self():
72+
with responses.RequestsMock() as rsps:
73+
rsps.add(
74+
method=responses.GET,
75+
url=self_token_url,
76+
json=content,
77+
content_type="application/json",
78+
status=200,
79+
)
80+
yield rsps
81+
82+
83+
@pytest.fixture
84+
def resp_delete_personal_access_token(no_content):
85+
with responses.RequestsMock() as rsps:
5386
rsps.add(
5487
method=responses.DELETE,
5588
url=single_token_url,
@@ -69,26 +102,38 @@ def test_create_personal_access_token(gl, resp_create_user_personal_access_token
69102
assert access_token.name == token_name
70103

71104

72-
def test_list_personal_access_tokens(gl, resp_personal_access_token):
105+
def test_list_personal_access_tokens(gl, resp_list_personal_access_tokens):
73106
access_tokens = gl.personal_access_tokens.list()
74107
assert len(access_tokens) == 1
75108
assert access_tokens[0].revoked is False
76109
assert access_tokens[0].name == token_name
77110

78111

79-
def test_list_personal_access_tokens_filter(gl, resp_personal_access_token):
112+
def test_list_personal_access_tokens_filter(gl, resp_list_personal_access_tokens):
80113
access_tokens = gl.personal_access_tokens.list(user_id=user_id)
81114
assert len(access_tokens) == 1
82115
assert access_tokens[0].revoked is False
83116
assert access_tokens[0].user_id == user_id
84117

85118

86-
def test_revoke_personal_access_token(gl, resp_personal_access_token):
87-
access_token = gl.personal_access_tokens.list(user_id=user_id)[0]
119+
def test_get_personal_access_token(gl, resp_get_personal_access_token):
120+
access_token = gl.personal_access_tokens.get(token_id)
121+
122+
assert access_token.revoked is False
123+
assert access_token.user_id == user_id
124+
125+
126+
def test_get_personal_access_token_self(gl, resp_get_personal_access_token_self):
127+
access_token = gl.personal_access_tokens.get("self")
128+
129+
assert access_token.revoked is False
130+
assert access_token.user_id == user_id
131+
132+
133+
def test_delete_personal_access_token(gl, resp_delete_personal_access_token):
134+
access_token = gl.personal_access_tokens.get(token_id, lazy=True)
88135
access_token.delete()
89-
assert resp_personal_access_token.assert_call_count(single_token_url, 1)
90136

91137

92-
def test_revoke_personal_access_token_by_id(gl, resp_personal_access_token):
138+
def test_revoke_personal_access_token_by_id(gl, resp_delete_personal_access_token):
93139
gl.personal_access_tokens.delete(token_id)
94-
assert resp_personal_access_token.assert_call_count(single_token_url, 1)

0 commit comments

Comments
 (0)