Skip to content

Commit c01b7c4

Browse files
fh1chJohnVillalovos
authored andcommitted
feat: add support for Group Access Token API
See https://docs.gitlab.com/ee/api/group_access_tokens.html
1 parent 73ae955 commit c01b7c4

File tree

5 files changed

+167
-0
lines changed

5 files changed

+167
-0
lines changed

docs/api-objects.rst

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ API examples
2424
gl_objects/features
2525
gl_objects/geo_nodes
2626
gl_objects/groups
27+
gl_objects/group_access_tokens
2728
gl_objects/issues
2829
gl_objects/keys
2930
gl_objects/boards
+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#####################
2+
Group Access Tokens
3+
#####################
4+
5+
Get a list of group access tokens
6+
7+
References
8+
----------
9+
10+
* v4 API:
11+
12+
+ :class:`gitlab.v4.objects.GroupAccessToken`
13+
+ :class:`gitlab.v4.objects.GroupAccessTokenManager`
14+
+ :attr:`gitlab.Gitlab.group_access_tokens`
15+
16+
* GitLab API: https://docs.gitlab.com/ee/api/group_access_tokens.html
17+
18+
Examples
19+
--------
20+
21+
List group access tokens::
22+
23+
access_tokens = gl.groups.get(1, lazy=True).access_tokens.list()
24+
print(access_tokens[0].name)
25+
26+
Create group access token::
27+
28+
access_token = gl.groups.get(1).access_tokens.create({"name": "test", "scopes": ["api"]})
29+
30+
Revoke a group access tokens::
31+
32+
gl.groups.get(1).access_tokens.delete(42)
33+
# or
34+
access_token.delete()
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from gitlab.base import RESTManager, RESTObject
2+
from gitlab.mixins import CreateMixin, DeleteMixin, ListMixin, ObjectDeleteMixin
3+
4+
__all__ = [
5+
"GroupAccessToken",
6+
"GroupAccessTokenManager",
7+
]
8+
9+
10+
class GroupAccessToken(ObjectDeleteMixin, RESTObject):
11+
pass
12+
13+
14+
class GroupAccessTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
15+
_path = "/groups/{group_id}/access_tokens"
16+
_obj_cls = GroupAccessToken
17+
_from_parent_attrs = {"group_id": "id"}

gitlab/v4/objects/groups.py

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from .deploy_tokens import GroupDeployTokenManager # noqa: F401
1919
from .epics import GroupEpicManager # noqa: F401
2020
from .export_import import GroupExportManager, GroupImportManager # noqa: F401
21+
from .group_access_tokens import GroupAccessTokenManager # noqa: F401
2122
from .hooks import GroupHookManager # noqa: F401
2223
from .issues import GroupIssueManager # noqa: F401
2324
from .labels import GroupLabelManager # noqa: F401
@@ -49,6 +50,7 @@
4950
class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
5051
_short_print_attr = "name"
5152

53+
access_tokens: GroupAccessTokenManager
5254
accessrequests: GroupAccessRequestManager
5355
audit_events: GroupAuditEventManager
5456
badges: GroupBadgeManager
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
"""
2+
GitLab API: https://docs.gitlab.com/ee/api/group_access_tokens.html
3+
"""
4+
5+
import pytest
6+
import responses
7+
8+
9+
@pytest.fixture
10+
def resp_list_group_access_token():
11+
content = [
12+
{
13+
"user_id": 141,
14+
"scopes": ["api"],
15+
"name": "token",
16+
"expires_at": "2021-01-31",
17+
"id": 42,
18+
"active": True,
19+
"created_at": "2021-01-20T22:11:48.151Z",
20+
"revoked": False,
21+
}
22+
]
23+
24+
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
25+
rsps.add(
26+
method=responses.GET,
27+
url="http://localhost/api/v4/groups/1/access_tokens",
28+
json=content,
29+
content_type="application/json",
30+
status=200,
31+
)
32+
yield rsps
33+
34+
35+
@pytest.fixture
36+
def resp_create_group_access_token():
37+
content = {
38+
"user_id": 141,
39+
"scopes": ["api"],
40+
"name": "token",
41+
"expires_at": "2021-01-31",
42+
"id": 42,
43+
"active": True,
44+
"created_at": "2021-01-20T22:11:48.151Z",
45+
"revoked": False,
46+
}
47+
48+
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
49+
rsps.add(
50+
method=responses.POST,
51+
url="http://localhost/api/v4/groups/1/access_tokens",
52+
json=content,
53+
content_type="application/json",
54+
status=200,
55+
)
56+
yield rsps
57+
58+
59+
@pytest.fixture
60+
def resp_revoke_group_access_token():
61+
content = [
62+
{
63+
"user_id": 141,
64+
"scopes": ["api"],
65+
"name": "token",
66+
"expires_at": "2021-01-31",
67+
"id": 42,
68+
"active": True,
69+
"created_at": "2021-01-20T22:11:48.151Z",
70+
"revoked": False,
71+
}
72+
]
73+
74+
with responses.RequestsMock(assert_all_requests_are_fired=False) as rsps:
75+
rsps.add(
76+
method=responses.DELETE,
77+
url="http://localhost/api/v4/groups/1/access_tokens/42",
78+
json=content,
79+
content_type="application/json",
80+
status=204,
81+
)
82+
rsps.add(
83+
method=responses.GET,
84+
url="http://localhost/api/v4/groups/1/access_tokens",
85+
json=content,
86+
content_type="application/json",
87+
status=200,
88+
)
89+
yield rsps
90+
91+
92+
def test_list_group_access_tokens(gl, resp_list_group_access_token):
93+
access_tokens = gl.groups.get(1, lazy=True).access_tokens.list()
94+
assert len(access_tokens) == 1
95+
assert access_tokens[0].revoked is False
96+
assert access_tokens[0].name == "token"
97+
98+
99+
def test_create_group_access_token(gl, resp_create_group_access_token):
100+
access_tokens = gl.groups.get(1, lazy=True).access_tokens.create(
101+
{"name": "test", "scopes": ["api"]}
102+
)
103+
assert access_tokens.revoked is False
104+
assert access_tokens.user_id == 141
105+
assert access_tokens.expires_at == "2021-01-31"
106+
107+
108+
def test_revoke_group_access_token(
109+
gl, resp_list_group_access_token, resp_revoke_group_access_token
110+
):
111+
gl.groups.get(1, lazy=True).access_tokens.delete(42)
112+
access_token = gl.groups.get(1, lazy=True).access_tokens.list()[0]
113+
access_token.delete()

0 commit comments

Comments
 (0)