Pārlūkot izejas kodu

Refactor LDAP test dependencies and error handling

Makes LDAP module import optional with graceful fallback
Adds integration test markers for LDAP-specific tests
Replaces deprecated SkipTest with pytest.skip
Removes unused imports and cleans up test dependencies

Part of test infrastructure modernization efforts
Harsh Gupta 9 mēneši atpakaļ
vecāks
revīzija
e0404ce651

+ 14 - 11
apps/useradmin/src/useradmin/test_ldap.py

@@ -15,16 +15,11 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+import logging
+from unittest.mock import patch
 
-from __future__ import absolute_import
-
-import sys
-from unittest.mock import MagicMock, Mock, patch
-
-import ldap
 import pytest
 from django.conf import settings
-from django.db.utils import DatabaseError
 from django.urls import reverse
 
 import desktop.conf
@@ -45,6 +40,13 @@ from useradmin.views import (
   sync_ldap_users_groups,
 )
 
+LOG = logging.getLogger()
+
+try:
+  import ldap
+except ImportError:
+  LOG.warning('ldap module is not available')
+
 
 def get_multi_ldap_config():
   return {'multi_ldap_conf': {
@@ -54,6 +56,7 @@ def get_multi_ldap_config():
 
 
 @pytest.mark.django_db
+@pytest.mark.integration
 class TestUserAdminLdap(BaseUserAdminTests):
   def test_useradmin_ldap_user_group_membership_sync(self):
     settings.MIDDLEWARE.append('useradmin.middleware.LdapSynchronizationMiddleware')
@@ -436,7 +439,7 @@ class TestUserAdminLdap(BaseUserAdminTests):
 
   def test_useradmin_ldap_user_integration(self):
     if is_live_cluster():
-      raise SkipTest('HUE-2897: Skipping because the DB may not be case sensitive')
+      pytest.skip('HUE-2897: Skipping because the DB may not be case sensitive')
 
     done = []
 
@@ -516,7 +519,7 @@ class TestUserAdminLdap(BaseUserAdminTests):
 
   def test_useradmin_ldap_force_uppercase(self):
     if is_live_cluster():
-      raise SkipTest('HUE-2897: Skipping because the DB may not be case sensitive')
+      pytest.skip('HUE-2897: Skipping because the DB may not be case sensitive')
 
     done = []
 
@@ -542,7 +545,7 @@ class TestUserAdminLdap(BaseUserAdminTests):
 
   def test_add_ldap_users(self):
     if is_live_cluster():
-      raise SkipTest('HUE-2897: Skipping because the DB may not be case sensitive')
+      pytest.skip('HUE-2897: Skipping because the DB may not be case sensitive')
 
     done = []
 
@@ -619,7 +622,7 @@ class TestUserAdminLdap(BaseUserAdminTests):
 
   def test_add_ldap_users_force_uppercase(self):
     if is_live_cluster():
-      raise SkipTest('HUE-2897: Skipping because the DB may not be case sensitive')
+      pytest.skip('HUE-2897: Skipping because the DB may not be case sensitive')
 
     done = []
 

+ 10 - 6
apps/useradmin/src/useradmin/test_ldap_deprecated.py

@@ -15,13 +15,9 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+import logging
+from unittest.mock import patch
 
-from __future__ import absolute_import
-
-import sys
-from unittest.mock import MagicMock, Mock, patch
-
-import ldap
 import pytest
 from django.conf import settings
 from django.urls import reverse
@@ -44,8 +40,16 @@ from useradmin.views import (
   sync_ldap_users_groups,
 )
 
+LOG = logging.getLogger()
+
+try:
+  import ldap
+except ImportError:
+  LOG.warning('ldap module is not available')
+
 
 @pytest.mark.django_db
+@pytest.mark.integration
 class TestUserAdminLdapDeprecated(BaseUserAdminTests):
   def test_useradmin_ldap_user_group_membership_sync(self):
     settings.MIDDLEWARE.append('useradmin.middleware.LdapSynchronizationMiddleware')

+ 15 - 9
apps/useradmin/src/useradmin/tests.py

@@ -20,14 +20,12 @@ import re
 import sys
 import json
 import time
-import urllib.error
+import logging
 import urllib.parse
-import urllib.request
 from builtins import object
 from datetime import datetime
-from unittest.mock import Mock, patch
+from unittest.mock import patch
 
-import ldap
 import pytest
 from django.conf import settings
 from django.contrib.sessions.models import Session
@@ -46,7 +44,7 @@ from desktop.conf import APP_BLACKLIST, ENABLE_ORGANIZATIONS, ENABLE_PROMETHEUS
 from desktop.lib.django_test_util import make_logged_in_client
 from desktop.lib.i18n import smart_str
 from desktop.lib.test_utils import grant_access
-from desktop.views import home, samlgroup_check
+from desktop.views import home
 from hadoop import pseudo_hdfs4
 from hadoop.pseudo_hdfs4 import is_live_cluster
 from useradmin.forms import UserChangeForm
@@ -55,6 +53,14 @@ from useradmin.metrics import active_users, active_users_per_instance
 from useradmin.middleware import ConcurrentUserSessionMiddleware
 from useradmin.models import Group, GroupPermission, HuePermission, User, UserProfile, get_default_user_group, get_profile
 
+LOG = logging.getLogger()
+
+try:
+  from ldap import SCOPE_SUBTREE
+except ImportError:
+  LOG.warning('ldap module is not available')
+  SCOPE_SUBTREE = None
+
 
 class MockRequest(dict):
   pass
@@ -111,7 +117,7 @@ class LdapTestConnection(object):
   def remove_posix_user_group_for_test(self, user, group):
     self._instance.groups[group]['posix_members'].remove(user)
 
-  def find_users(self, username_pattern, search_attr=None, user_name_attr=None, find_by_dn=False, scope=ldap.SCOPE_SUBTREE):
+  def find_users(self, username_pattern, search_attr=None, user_name_attr=None, find_by_dn=False, scope=SCOPE_SUBTREE):
     """ Returns info for a particular user via a case insensitive search """
     if find_by_dn:
       data = [attrs for attrs in list(self._instance.users.values()) if attrs['dn'] == username_pattern]
@@ -123,12 +129,12 @@ class LdapTestConnection(object):
     return data
 
   def find_groups(self, groupname_pattern, search_attr=None, group_name_attr=None,
-                  group_member_attr=None, group_filter=None, find_by_dn=False, scope=ldap.SCOPE_SUBTREE):
+                  group_member_attr=None, group_filter=None, find_by_dn=False, scope=SCOPE_SUBTREE):
     """ Return all groups in the system with parents and children """
     if find_by_dn:
       data = [attrs for attrs in list(self._instance.groups.values()) if attrs['dn'] == groupname_pattern]
       # SCOPE_SUBTREE means we return all sub-entries of the desired entry along with the desired entry.
-      if data and scope == ldap.SCOPE_SUBTREE:
+      if data and scope == SCOPE_SUBTREE:
         sub_data = [attrs for attrs in list(self._instance.groups.values()) if attrs['dn'].endswith(data[0]['dn'])]
         data.extend(sub_data)
     else:
@@ -137,7 +143,7 @@ class LdapTestConnection(object):
       data = [self._instance.groups.get(groupname) for groupname in groupnames]
     return data
 
-  def find_members_of_group(self, dn, search_attr, ldap_filter, scope=ldap.SCOPE_SUBTREE):
+  def find_members_of_group(self, dn, search_attr, ldap_filter, scope=SCOPE_SUBTREE):
     members = []
     for group_info in self._instance.groups:
       if group_info['dn'] == dn:

+ 1 - 0
desktop/core/src/desktop/auth/backend_tests.py

@@ -26,6 +26,7 @@ from useradmin.models import User
 
 
 @pytest.mark.django_db
+@pytest.mark.integration
 class TestLdapBackend():
 
   def setup_method(self):

+ 12 - 4
desktop/core/src/desktop/auth/views_test.py

@@ -15,17 +15,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import sys
+import logging
 import datetime
 from builtins import object
-from unittest.mock import MagicMock, Mock, patch
+from unittest.mock import MagicMock, Mock
 
 import pytest
 from django.conf import settings
-from django.db.utils import DataError
 from django.test import TestCase
 from django.test.client import Client
-from django_auth_ldap import backend as django_auth_ldap_backend
 
 from desktop import conf, middleware
 from desktop.auth import backend
@@ -39,6 +37,15 @@ from useradmin.models import Group, User, get_default_user_group, get_profile
 from useradmin.tests import LdapTestConnection
 from useradmin.views import import_ldap_groups
 
+LOG = logging.getLogger()
+
+
+try:
+  from django_auth_ldap import backend as django_auth_ldap_backend
+except ImportError:
+  LOG.warning('django_auth_ldap module is not installed')
+  django_auth_ldap_backend = Mock(LDAPSettings=Mock(), LDAPBackend=Mock())
+
 
 def get_mocked_config():
   return {'mocked_ldap': {'users': {}, 'groups': {}}}
@@ -166,6 +173,7 @@ class TestLoginWithHadoop(PseudoHdfsTestBase):
 
 
 @pytest.mark.django_db
+@pytest.mark.integration
 class TestLdapLogin(PseudoHdfsTestBase):
   reset = []
   test_username = 'test_ldap_login'