summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNejc Habjan <hab.nejc@gmail.com>2020-09-07 23:37:54 +0200
committerNejc Habjan <hab.nejc@gmail.com>2020-09-07 23:39:14 +0200
commite78e121575deb7b5ce490b2293caa290860fc3e9 (patch)
tree9824031089ecedcd672c5d9b9910bf2f2323e4fb
parent49a0032f44a76cdcf17dd45da4b23e24a6b9572c (diff)
downloadgitlab-feat/delete-user-identities.tar.gz
feat(api): add support for user identity provider deletionfeat/delete-user-identities
-rw-r--r--docs/gl_objects/users.rst4
-rw-r--r--gitlab/tests/objects/test_users.py17
-rw-r--r--gitlab/v4/objects/__init__.py12
-rw-r--r--tools/functional/api/test_users.py20
4 files changed, 53 insertions, 0 deletions
diff --git a/docs/gl_objects/users.rst b/docs/gl_objects/users.rst
index 5b1cf3d..9f2d42c 100644
--- a/docs/gl_objects/users.rst
+++ b/docs/gl_objects/users.rst
@@ -80,6 +80,10 @@ Set an external identity for a user::
user.extern_uid = '3'
user.save()
+Delete an external identity by provider name::
+
+ user.identityproviders.delete('oauth2_generic')
+
User custom attributes
======================
diff --git a/gitlab/tests/objects/test_users.py b/gitlab/tests/objects/test_users.py
index ec282cf..f84e877 100644
--- a/gitlab/tests/objects/test_users.py
+++ b/gitlab/tests/objects/test_users.py
@@ -95,6 +95,19 @@ def resp_get_user_status():
yield rsps
+@pytest.fixture
+def resp_delete_user_identity(no_content):
+ with responses.RequestsMock() as rsps:
+ rsps.add(
+ method=responses.DELETE,
+ url="http://localhost/api/v4/users/1/identities/test_provider",
+ json=no_content,
+ content_type="application/json",
+ status=204,
+ )
+ yield rsps
+
+
def test_get_user(gl, resp_get_user):
user = gl.users.get(1)
assert isinstance(user, User)
@@ -118,3 +131,7 @@ def test_user_status(user, resp_get_user_status):
def test_user_activate_deactivate(user, resp_activate):
user.activate()
user.deactivate()
+
+
+def test_delete_user_identity(user, resp_delete_user_identity):
+ user.identityproviders.delete("test_provider")
diff --git a/gitlab/v4/objects/__init__.py b/gitlab/v4/objects/__init__.py
index f9a2c25..7dd8757 100644
--- a/gitlab/v4/objects/__init__.py
+++ b/gitlab/v4/objects/__init__.py
@@ -217,6 +217,17 @@ class UserStatusManager(GetWithoutIdMixin, RESTManager):
_from_parent_attrs = {"user_id": "id"}
+class UserIdentityProviderManager(DeleteMixin, RESTManager):
+ """Manager for user identities.
+
+ This manager does not actually manage objects but enables
+ functionality for deletion of user identities by provider.
+ """
+
+ _path = "/users/%(user_id)s/identities"
+ _from_parent_attrs = {"user_id": "id"}
+
+
class UserImpersonationToken(ObjectDeleteMixin, RESTObject):
pass
@@ -320,6 +331,7 @@ class User(SaveMixin, ObjectDeleteMixin, RESTObject):
("emails", "UserEmailManager"),
("events", "UserEventManager"),
("gpgkeys", "UserGPGKeyManager"),
+ ("identityproviders", "UserIdentityProviderManager"),
("impersonationtokens", "UserImpersonationTokenManager"),
("keys", "UserKeyManager"),
("memberships", "UserMembershipManager"),
diff --git a/tools/functional/api/test_users.py b/tools/functional/api/test_users.py
new file mode 100644
index 0000000..f70da4a
--- /dev/null
+++ b/tools/functional/api/test_users.py
@@ -0,0 +1,20 @@
+"""
+GitLab API:
+https://docs.gitlab.com/ee/api/users.html
+https://docs.gitlab.com/ee/api/users.html#delete-authentication-identity-from-user
+"""
+
+
+def test_user_identities(gl, user):
+ provider = "test_provider"
+
+ user.provider = provider
+ user.extern_uid = "1"
+ user.save()
+
+ assert provider in [item["provider"] for item in user.identities]
+
+ user.identityproviders.delete(provider)
+ user = gl.users.get(user.id)
+
+ assert provider not in [item["provider"] for item in user.identities]