Skip to content

Commit e78e121

Browse files
committed
feat(api): add support for user identity provider deletion
1 parent 49a0032 commit e78e121

File tree

4 files changed

+53
-0
lines changed

4 files changed

+53
-0
lines changed

docs/gl_objects/users.rst

+4
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ Set an external identity for a user::
8080
user.extern_uid = '3'
8181
user.save()
8282

83+
Delete an external identity by provider name::
84+
85+
user.identityproviders.delete('oauth2_generic')
86+
8387
User custom attributes
8488
======================
8589

gitlab/tests/objects/test_users.py

+17
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,19 @@ def resp_get_user_status():
9595
yield rsps
9696

9797

98+
@pytest.fixture
99+
def resp_delete_user_identity(no_content):
100+
with responses.RequestsMock() as rsps:
101+
rsps.add(
102+
method=responses.DELETE,
103+
url="http://localhost/api/v4/users/1/identities/test_provider",
104+
json=no_content,
105+
content_type="application/json",
106+
status=204,
107+
)
108+
yield rsps
109+
110+
98111
def test_get_user(gl, resp_get_user):
99112
user = gl.users.get(1)
100113
assert isinstance(user, User)
@@ -118,3 +131,7 @@ def test_user_status(user, resp_get_user_status):
118131
def test_user_activate_deactivate(user, resp_activate):
119132
user.activate()
120133
user.deactivate()
134+
135+
136+
def test_delete_user_identity(user, resp_delete_user_identity):
137+
user.identityproviders.delete("test_provider")

gitlab/v4/objects/__init__.py

+12
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,17 @@ class UserStatusManager(GetWithoutIdMixin, RESTManager):
217217
_from_parent_attrs = {"user_id": "id"}
218218

219219

220+
class UserIdentityProviderManager(DeleteMixin, RESTManager):
221+
"""Manager for user identities.
222+
223+
This manager does not actually manage objects but enables
224+
functionality for deletion of user identities by provider.
225+
"""
226+
227+
_path = "/users/%(user_id)s/identities"
228+
_from_parent_attrs = {"user_id": "id"}
229+
230+
220231
class UserImpersonationToken(ObjectDeleteMixin, RESTObject):
221232
pass
222233

@@ -320,6 +331,7 @@ class User(SaveMixin, ObjectDeleteMixin, RESTObject):
320331
("emails", "UserEmailManager"),
321332
("events", "UserEventManager"),
322333
("gpgkeys", "UserGPGKeyManager"),
334+
("identityproviders", "UserIdentityProviderManager"),
323335
("impersonationtokens", "UserImpersonationTokenManager"),
324336
("keys", "UserKeyManager"),
325337
("memberships", "UserMembershipManager"),

tools/functional/api/test_users.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""
2+
GitLab API:
3+
https://docs.gitlab.com/ee/api/users.html
4+
https://docs.gitlab.com/ee/api/users.html#delete-authentication-identity-from-user
5+
"""
6+
7+
8+
def test_user_identities(gl, user):
9+
provider = "test_provider"
10+
11+
user.provider = provider
12+
user.extern_uid = "1"
13+
user.save()
14+
15+
assert provider in [item["provider"] for item in user.identities]
16+
17+
user.identityproviders.delete(provider)
18+
user = gl.users.get(user.id)
19+
20+
assert provider not in [item["provider"] for item in user.identities]

0 commit comments

Comments
 (0)