[Python-modules-commits] [mockldap] 01/01: New upstream version 0.3.0

Michael Fladischer fladi at moszumanska.debian.org
Wed Nov 1 18:29:25 UTC 2017


This is an automated email from the git hooks/post-receive script.

fladi pushed a commit to branch upstream
in repository mockldap.

commit 3dba39c13ea45e56e355833abf7f8ecfc1f49834
Author: Michael Fladischer <FladischerMichael at fladi.at>
Date:   Wed Nov 1 18:31:02 2017 +0100

    New upstream version 0.3.0
---
 CHANGES                                            |  11 +-
 PKG-INFO                                           |  14 +-
 README                                             |   4 +
 docs/source/conf.py                                |   9 +-
 docs/source/overview.rst                           |   4 +
 .../PKG-INFO                                       |  14 +-
 mockldap.egg-info/SOURCES.txt                      |  21 +
 .../dependency_links.txt                           |   0
 mockldap.egg-info/requires.txt                     |   8 +
 .../top_level.txt                                  |   0
 {src/mockldap => mockldap}/__init__.py             |  40 +-
 {src/mockldap => mockldap}/filter.py               |   2 +-
 {src/mockldap => mockldap}/ldapobject.py           |   6 +-
 {src/mockldap => mockldap}/recording.py            |   2 +-
 setup.py                                           |  51 +-
 src/mockldap.egg-info/SOURCES.txt                  |  22 -
 src/mockldap.egg-info/requires.txt                 |   3 -
 src/mockldap/tests.py                              | 699 ---------------------
 18 files changed, 119 insertions(+), 791 deletions(-)

diff --git a/CHANGES b/CHANGES
index 8e150c0..5d24560 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,14 +1,11 @@
-v0.2.8 - May 31, 2016 - Fix rename_s
-------------------------------------
+v0.3.0 - October 15, 2017
+-------------------------
 
 - Don't delete attribute when moving an entry to new subtree with unchanged rdn.
-  Thanks to Pär Wieslander.
-
 
-v0.2.7 - April 18, 2016 - attrlist
-----------------------------------
+- Add context manager support to :class:`~mockldap.MockLdap`.
 
-- Support ``'*'`` in attrlist.
+- Drop support for Python 2.6 and 3.3.
 
 
 v0.2.6 - September 29, 2015 - pyldap
diff --git a/PKG-INFO b/PKG-INFO
index 55ee385..40e4107 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,29 +1,33 @@
 Metadata-Version: 1.1
 Name: mockldap
-Version: 0.2.8
+Version: 0.3.0
 Summary: A simple mock implementation of python-ldap.
 Home-page: http://bitbucket.org/psagers/mockldap/
 Author: Peter Sagerson
-Author-email: psagers.pypi at ignorare.net
+Author-email: psagers at ignorare.net
 License: BSD
+Description-Content-Type: UNKNOWN
 Description: This project provides a mock replacement for python-ldap (pyldap on Python
         3). It's useful for any project that would like to write unit tests against
         LDAP code without relying on a running LDAP server.
         
+        * Repository: https://bitbucket.org/psagers/mockldap
+        * Documentation: https://mockldap.readthedocs.io/
+        * Mailing list: https://groups.google.com/group/django-auth-ldap
+        
 Keywords: mock,ldap
 Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: System Administrators
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python
 Classifier: Topic :: Internet :: WWW/HTTP
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/README b/README
index 6615e17..6f749f4 100644
--- a/README
+++ b/README
@@ -1,3 +1,7 @@
 This project provides a mock replacement for python-ldap (pyldap on Python
 3). It's useful for any project that would like to write unit tests against
 LDAP code without relying on a running LDAP server.
+
+* Repository: https://bitbucket.org/psagers/mockldap
+* Documentation: https://mockldap.readthedocs.io/
+* Mailing list: https://groups.google.com/group/django-auth-ldap
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 094559d..9dfe26c 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -17,7 +17,7 @@ import sys
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath('../../src'))
+sys.path.insert(0, os.path.abspath('../..'))
 
 # -- General configuration -----------------------------------------------------
 
@@ -33,9 +33,8 @@ extensions = [
 ]
 
 intersphinx_mapping = {
-    'python': ('http://docs.python.org/2/', 'http://docs.python.org/2/objects.inv'),
+    'python': ('http://docs.python.org/3/', 'http://docs.python.org/3/objects.inv'),
     'ldap': ('http://python-ldap.org/doc/html/', None),
-    'mock': ('http://www.voidspace.org.uk/python/mock/', None),
 }
 
 # Add any paths that contain templates here, relative to this directory.
@@ -61,7 +60,7 @@ copyright = u'2013, Peter Sagerson'
 # The short X.Y version.
 version = '0.2'
 # The full version, including alpha/beta/rc tags.
-release = '0.2.8'
+release = '0.2.6'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -134,7 +133,7 @@ html_theme = 'default'
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+#html_static_path = ['_static']
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
 # using the given strftime format.
diff --git a/docs/source/overview.rst b/docs/source/overview.rst
index 39668b6..3ed5cda 100644
--- a/docs/source/overview.rst
+++ b/docs/source/overview.rst
@@ -13,6 +13,10 @@ way to use mockldap is to provide some static directory content and then let
 for simple LDAP operations--this obviously isn't a complete Python LDAP server
 implementation--but those simple operations tend to cover a lot of cases.
 
+This example integrates with :class:`unittest.TestCase` by explicitly starting
+and stopping the :class:`~mockldap.MockLdap` object. You can also use these
+objects as context managers, if that's more convenient.
+
 
 .. _example:
 
diff --git a/src/mockldap.egg-info/PKG-INFO b/mockldap.egg-info/PKG-INFO
similarity index 74%
rename from src/mockldap.egg-info/PKG-INFO
rename to mockldap.egg-info/PKG-INFO
index 55ee385..40e4107 100644
--- a/src/mockldap.egg-info/PKG-INFO
+++ b/mockldap.egg-info/PKG-INFO
@@ -1,29 +1,33 @@
 Metadata-Version: 1.1
 Name: mockldap
-Version: 0.2.8
+Version: 0.3.0
 Summary: A simple mock implementation of python-ldap.
 Home-page: http://bitbucket.org/psagers/mockldap/
 Author: Peter Sagerson
-Author-email: psagers.pypi at ignorare.net
+Author-email: psagers at ignorare.net
 License: BSD
+Description-Content-Type: UNKNOWN
 Description: This project provides a mock replacement for python-ldap (pyldap on Python
         3). It's useful for any project that would like to write unit tests against
         LDAP code without relying on a running LDAP server.
         
+        * Repository: https://bitbucket.org/psagers/mockldap
+        * Documentation: https://mockldap.readthedocs.io/
+        * Mailing list: https://groups.google.com/group/django-auth-ldap
+        
 Keywords: mock,ldap
 Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: System Administrators
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
 Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python
 Classifier: Topic :: Internet :: WWW/HTTP
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/mockldap.egg-info/SOURCES.txt b/mockldap.egg-info/SOURCES.txt
new file mode 100644
index 0000000..73fe170
--- /dev/null
+++ b/mockldap.egg-info/SOURCES.txt
@@ -0,0 +1,21 @@
+CHANGES
+LICENSE
+MANIFEST.in
+README
+setup.py
+docs/Makefile
+docs/source/changes.rst
+docs/source/conf.py
+docs/source/directories.rst
+docs/source/index.rst
+docs/source/operations.rst
+docs/source/overview.rst
+mockldap/__init__.py
+mockldap/filter.py
+mockldap/ldapobject.py
+mockldap/recording.py
+mockldap.egg-info/PKG-INFO
+mockldap.egg-info/SOURCES.txt
+mockldap.egg-info/dependency_links.txt
+mockldap.egg-info/requires.txt
+mockldap.egg-info/top_level.txt
\ No newline at end of file
diff --git a/src/mockldap.egg-info/dependency_links.txt b/mockldap.egg-info/dependency_links.txt
similarity index 100%
rename from src/mockldap.egg-info/dependency_links.txt
rename to mockldap.egg-info/dependency_links.txt
diff --git a/mockldap.egg-info/requires.txt b/mockldap.egg-info/requires.txt
new file mode 100644
index 0000000..f7978de
--- /dev/null
+++ b/mockldap.egg-info/requires.txt
@@ -0,0 +1,8 @@
+funcparserlib==0.3.6
+
+[:python_version < "3.0"]
+python-ldap>=2.0
+mock
+
+[:python_version >= "3.0"]
+pyldap
diff --git a/src/mockldap.egg-info/top_level.txt b/mockldap.egg-info/top_level.txt
similarity index 100%
rename from src/mockldap.egg-info/top_level.txt
rename to mockldap.egg-info/top_level.txt
diff --git a/src/mockldap/__init__.py b/mockldap/__init__.py
similarity index 82%
rename from src/mockldap/__init__.py
rename to mockldap/__init__.py
index 86aaa6d..caab161 100644
--- a/src/mockldap/__init__.py
+++ b/mockldap/__init__.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import, division, print_function, unicode_literals, with_statement
+from __future__ import absolute_import, division, print_function, unicode_literals
 
 from collections import defaultdict
 
@@ -21,6 +21,12 @@ class MockLdap(object):
     an :class:`~mockldap.LDAPObject`. This is the same object that will be
     returned by ``ldap.initialize(uri)``, so you can use it to seed return
     values and discover which APIs were called.
+
+    MockLdap objects may be used as context managers in place of calling
+    :meth:`~mockldap.MockLdap.start` and :meth:`~mockldap.MockLdap.stop`
+    manually. The import path for ``ldap.initialize`` can not be overridden in
+    this case.
+
     """
     def __init__(self, directory=None):
         self.directories = {}
@@ -46,6 +52,7 @@ class MockLdap(object):
 
         If URI is not given, this will set the default content for all unknown
         URIs.
+
         """
         if self.ldap_objects is not None:
             raise Exception("You can't add a directory after calling start().")
@@ -54,9 +61,10 @@ class MockLdap(object):
 
     def start(self, path='ldap.initialize'):
         """
-        Patch :func:`ldap.initialize` to return mock LDAPObject instances. This
-        calls :func:`mock.patch`, so you must have the `mock
-        <https://pypi.python.org/pypi/mock/>`_ library installed.
+        Patch :func:`ldap.initialize` to return mock LDAPObject instances.
+
+        This calls :func:`mock.patch`, so under Python 2, you must have the
+        `mock <https://pypi.python.org/pypi/mock/>`_ library installed.
 
         :param path: The module path to ``ldap.initialize``.
         :type path: string
@@ -74,7 +82,8 @@ class MockLdap(object):
             initialize(uri)
 
         then you need to call ``start('path.to.your.mod.initialize')``. See
-        :ref:`where-to-patch` for more.
+        :ref:`python:where-to-patch` for more.
+
         """
         try:
             from unittest.mock import patch
@@ -108,6 +117,7 @@ class MockLdap(object):
         Calls to :meth:`~mockldap.MockLdap.start` and
         :meth:`~mockldap.MockLdap.stop` must be balanced. After the final call
         to stop, we'll reset all :class:`~mockldap.LDAPObject` instances.
+
         """
         if path not in self.patchers:
             raise ValueError("%r is not patched." % (path,))
@@ -124,6 +134,7 @@ class MockLdap(object):
 
         If you called :meth:`~mockldap.MockLdap.start` multiple times, this is
         the easiest way to reset everything.
+
         """
         for patcher in self.patchers.values():
             patcher.stop()
@@ -139,7 +150,20 @@ class MockLdap(object):
 
         return ldap_object
 
+    def __enter__(self):
+        self.start()
+
+        return self
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        self.stop()
+
+
+def map_keys(f, d):
+    """ Transform a dictionary by applying a function to each key. """
+    return {f(k): v for k, v in d.items()}
+
 
-# Map a dictionary by applying a function to each key/value.
-map_keys = lambda f, d: dict((f(k), v) for k, v in d.items())
-map_values = lambda f, d: dict((k, f(v)) for k, v in d.items())
+def map_values(f, d):
+    """ Transform a dictionary by applying a function to each value. """
+    return {k: f(v) for k, v in d.items()}
diff --git a/src/mockldap/filter.py b/mockldap/filter.py
similarity index 99%
rename from src/mockldap/filter.py
rename to mockldap/filter.py
index 2fec9f4..8a7e7aa 100644
--- a/src/mockldap/filter.py
+++ b/mockldap/filter.py
@@ -1,7 +1,7 @@
 """
 Simple filter expression parser based on funcparserlib.
 """
-from __future__ import absolute_import, division, print_function, unicode_literals, with_statement
+from __future__ import absolute_import, division, print_function, unicode_literals
 
 from functools import partial
 import ldap
diff --git a/src/mockldap/ldapobject.py b/mockldap/ldapobject.py
similarity index 99%
rename from src/mockldap/ldapobject.py
rename to mockldap/ldapobject.py
index 14c6613..1025f80 100644
--- a/src/mockldap/ldapobject.py
+++ b/mockldap/ldapobject.py
@@ -1,4 +1,4 @@
-from __future__ import absolute_import, division, print_function, unicode_literals, with_statement
+from __future__ import absolute_import, division, print_function, unicode_literals
 
 import base64
 from copy import deepcopy
@@ -119,7 +119,7 @@ class LDAPObject(RecordableMethods):
 
     @recorded
     def search_s(self, base, scope, filterstr='(objectClass=*)', attrlist=None, attrsonly=0):
-        """
+        r"""
         Supports many, but not all, filter strings.
 
         Tests of the form ``'(foo=bar)'`` and ``'(foo=\*)'`` are supported, as
@@ -269,7 +269,7 @@ class LDAPObject(RecordableMethods):
                    if filter_expr.matches(dn, self.directory[dn]))
 
         # Apply attribute filtering, if any
-        if (attrlist is not None) and ('*' not in attrlist):
+        if attrlist is not None:
             results = ((dn, dict((attr, values) for attr, values in attrs.items() if attr in attrlist))
                        for dn, attrs in results)
 
diff --git a/src/mockldap/recording.py b/mockldap/recording.py
similarity index 99%
rename from src/mockldap/recording.py
rename to mockldap/recording.py
index 344363e..666ab3d 100644
--- a/src/mockldap/recording.py
+++ b/mockldap/recording.py
@@ -1,7 +1,7 @@
 """
 Tools for recording method calls and seeding return values.
 """
-from __future__ import absolute_import, division, print_function, unicode_literals, with_statement
+from __future__ import absolute_import, division, print_function, unicode_literals
 
 from collections import defaultdict
 from copy import deepcopy
diff --git a/setup.py b/setup.py
index 167fae3..fd80003 100755
--- a/setup.py
+++ b/setup.py
@@ -1,51 +1,37 @@
 #!/usr/bin/env python
 
-import sys
+from __future__ import absolute_import, division, print_function, unicode_literals
 
 from setuptools import setup
 
 
-PY3 = (sys.version_info[0] == 3)
-
-try:
-    import unittest.mock    # noqa
-except ImportError:
-    requires_mock = ['mock']
-else:
-    requires_mock = []
-
-try:
-    import unittest2  # noqa
-except ImportError:
-    test_loader = 'unittest:TestLoader'
-else:
-    test_loader = 'unittest2:TestLoader'
+def readall(path):
+    with open(path) as fp:
+        return fp.read()
 
 
 setup(
     name='mockldap',
-    version='0.2.8',
-    description=u"A simple mock implementation of python-ldap.",
-    long_description=open('README').read(),
+    version='0.3.0',
+    description="A simple mock implementation of python-ldap.",
+    long_description=readall('README'),
     url='http://bitbucket.org/psagers/mockldap/',
     author='Peter Sagerson',
-    author_email='psagers.pypi at ignorare.net',
+    author_email='psagers at ignorare.net',
     license='BSD',
     packages=['mockldap'],
-    package_dir={'': 'src'},
     classifiers=[
-        'Development Status :: 4 - Beta',
+        'Development Status :: 5 - Production/Stable',
         'Environment :: Web Environment',
         'Intended Audience :: Developers',
         'Intended Audience :: System Administrators',
         'License :: OSI Approved :: BSD License',
         'Programming Language :: Python :: 2',
-        'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.3',
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
+        'Programming Language :: Python :: 3.6',
         'Programming Language :: Python',
         'Topic :: Internet :: WWW/HTTP',
         'Topic :: Software Development :: Libraries :: Python Modules',
@@ -53,14 +39,15 @@ setup(
     ],
     keywords=['mock', 'ldap'],
     install_requires=[
-        'pyldap' if PY3 else 'python-ldap',
-        'funcparserlib==0.3.6',
-    ] + requires_mock,
-    extras_require={
-    },
+        'funcparserlib == 0.3.6',
+
+        'pyldap; python_version >= "3.0"',
+        'python-ldap >= 2.0; python_version < "3.0"',
+
+        'mock; python_version < "3.0"',
+    ],
     setup_requires=[
-        'setuptools>=0.6c11',
+        'setuptools >= 0.6c11',
     ],
-    test_loader=test_loader,
-    test_suite='mockldap.tests',
+    test_suite='tests',
 )
diff --git a/src/mockldap.egg-info/SOURCES.txt b/src/mockldap.egg-info/SOURCES.txt
deleted file mode 100644
index c97c5e8..0000000
--- a/src/mockldap.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-CHANGES
-LICENSE
-MANIFEST.in
-README
-setup.py
-docs/Makefile
-docs/source/changes.rst
-docs/source/conf.py
-docs/source/directories.rst
-docs/source/index.rst
-docs/source/operations.rst
-docs/source/overview.rst
-src/mockldap/__init__.py
-src/mockldap/filter.py
-src/mockldap/ldapobject.py
-src/mockldap/recording.py
-src/mockldap/tests.py
-src/mockldap.egg-info/PKG-INFO
-src/mockldap.egg-info/SOURCES.txt
-src/mockldap.egg-info/dependency_links.txt
-src/mockldap.egg-info/requires.txt
-src/mockldap.egg-info/top_level.txt
\ No newline at end of file
diff --git a/src/mockldap.egg-info/requires.txt b/src/mockldap.egg-info/requires.txt
deleted file mode 100644
index bcaabc5..0000000
--- a/src/mockldap.egg-info/requires.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-python-ldap
-funcparserlib==0.3.6
-mock
diff --git a/src/mockldap/tests.py b/src/mockldap/tests.py
deleted file mode 100644
index df2cc05..0000000
--- a/src/mockldap/tests.py
+++ /dev/null
@@ -1,699 +0,0 @@
-from __future__ import absolute_import, division, print_function, unicode_literals, with_statement
-
-from copy import copy
-from doctest import DocTestSuite
-try:
-    import unittest2 as unittest
-except ImportError:
-    import unittest
-
-import ldap
-import ldap.modlist
-import ldap.filter
-
-from . import MockLdap
-from .recording import SeedRequired
-
-
-test = ("o=test", {"objectClass": ["top"]})
-example = ("ou=example,o=test", {"objectClass": ["top"]})
-other = ("ou=other,o=test", {"objectClass": ["top"]})
-
-manager = ("cn=manager,ou=example,o=test", {
-    "userPassword": ["ldaptest"],
-    "objectClass": ["top", "posixAccount", "inetOrgPerson"]})
-alice = ("cn=alice,ou=example,o=test", {
-    "cn": ["alice"], "uid": ["alice"], "userPassword": ["alicepw"],
-    "objectClass": ["top", "posixAccount"]})
-# Passwords generated with slappasswd
-theo = ("cn=theo,ou=example,o=test", {"userPassword": [
-    "{CRYPT}Q7BT9BT8qXW/k",
-    "{SSHA}ecL6T4anvrFI2ixn2XnrE0roM5TeoLLE",
-    "{SSHA}/WoozYVlR2BXTCDCWpZG8+IqnF1GWhJbbCSVXQ=="],
-    "objectClass": ["top", "posixAccount"]})
-john = ("cn=john,ou=example,o=test", {"objectClass": ["top"]})
-
-bob = ("cn=bob,ou=other,o=test", {
-    "userPassword": ["bobpw", "bobpw2"], "objectClass": ["top"]})
-
-directory = dict([test, example, other, manager, alice, theo, john, bob])
-
-
-def load_tests(loader, tests, pattern):
-    suite = unittest.TestSuite()
-
-    suite.addTests(tests)
-    suite.addTest(DocTestSuite('mockldap.recording'))
-
-    return suite
-
-
-class TestLDAPObject(unittest.TestCase):
-    @classmethod
-    def setUpClass(cls):
-        cls.mockldap = MockLdap(directory)
-
-    @classmethod
-    def tearDownClass(cls):
-        del cls.mockldap
-
-    def setUp(self):
-        self.mockldap.start()
-        self.ldapobj = self.mockldap['ldap://localhost']
-
-    def tearDown(self):
-        self.mockldap.stop()
-
-    def test_manual_ldapobject(self):
-        from .ldapobject import LDAPObject
-
-        ldapobj = LDAPObject(directory)
-
-        self.assertIsInstance(ldapobj.directory, ldap.cidict.cidict)
-
-    def test_set_option(self):
-        self.ldapobj.set_option(ldap.OPT_X_TLS_DEMAND, True)
-        self.assertEqual(self.ldapobj.get_option(ldap.OPT_X_TLS_DEMAND), True)
-
-    def test_simple_bind_s_success(self):
-        result = self.ldapobj.simple_bind_s("cn=alice,ou=example,o=test", "alicepw")
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_success_case_insensitive(self):
-        result = self.ldapobj.simple_bind_s("cn=manager,ou=Example,o=test", "ldaptest")
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_anon_user(self):
-        result = self.ldapobj.simple_bind_s()
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_fail_login_with_invalid_username(self):
-        with self.assertRaises(ldap.INVALID_CREDENTIALS):
-            self.ldapobj.simple_bind_s("cn=blah,o=test", "password")
-
-    def test_simple_bind_s_fail_login(self):
-        with self.assertRaises(ldap.INVALID_CREDENTIALS):
-            self.ldapobj.simple_bind_s("cn=alice,ou=example,o=test", "wrong")
-
-    def test_simple_bind_s_secondary_password(self):
-        result = self.ldapobj.simple_bind_s("cn=bob,ou=other,o=test", "bobpw2")
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_success_crypt_password(self):
-        result = self.ldapobj.simple_bind_s("cn=theo,ou=example,o=test", "theopw")
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_success_crypt_secondary_password(self):
-        result = self.ldapobj.simple_bind_s("cn=theo,ou=example,o=test", "theopw2")
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_success_crypt_tertiary_password(self):
-        result = self.ldapobj.simple_bind_s("cn=theo,ou=example,o=test", "12345")
-
-        self.assertEqual(result, (97, []))
-
-    def test_simple_bind_s_fail_crypt_password(self):
-        with self.assertRaises(ldap.INVALID_CREDENTIALS):
-            self.ldapobj.simple_bind_s("cn=theo,ou=example,o=test", "theopw3")
-
-    def test_simple_bind_s_invalid_dn(self):
-        with self.assertRaises(ldap.INVALID_DN_SYNTAX):
-            self.ldapobj.simple_bind_s('invalid', 'invalid')
-
-    def test_search_s_get_directory_items_with_scope_onelevel(self):
-        results = self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL)
-
-        self.assertEqual(sorted(results), sorted([manager, alice, theo, john]))
-
-    def test_search_s_get_all_directory_items_with_scope_subtree(self):
-        results = self.ldapobj.search_s("o=test", ldap.SCOPE_SUBTREE)
-
-        self.assertEqual(sorted(results), sorted(directory.items()))
-
-    def test_search_s_get_specific_item_with_scope_base(self):
-        results = self.ldapobj.search_s("cn=alice,ou=example,o=test", ldap.SCOPE_BASE)
-
-        self.assertEqual(results, [alice])
-
-    def test_search_s_base_case_insensitive(self):
-        results = self.ldapobj.search_s('cn=ALICE,ou=Example,o=TEST', ldap.SCOPE_BASE)
-
-        self.assertEqual(results, [alice])
-
-    def test_search_s_get_specific_attr(self):
-        results = self.ldapobj.search_s("cn=alice,ou=example,o=test", ldap.SCOPE_BASE,
-                                        attrlist=["userPassword"])
-
-        self.assertEqual(results, [(alice[0], {'userPassword': alice[1]['userPassword']})])
-
-    def test_search_s_get_all_attrs(self):
-        results = self.ldapobj.search_s("cn=alice,ou=example,o=test", ldap.SCOPE_BASE,
-                                        attrlist=["*"])
-
-        self.assertTrue(len(results[0][1]) > 1)
-
-    def test_search_s_use_attrsonly(self):
-        results = self.ldapobj.search_s("cn=alice,ou=example,o=test", ldap.SCOPE_BASE,
-                                        attrlist=["userPassword"], attrsonly=1)
-
-        self.assertEqual(results, [(alice[0], {'userPassword': []})])
-
-    def test_search_s_specific_attr_in_filterstr(self):
-        results = self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                        '(userPassword=alicepw)')
-
-        self.assertEqual(results, [alice])
-
-    def test_search_s_escaped(self):
-        escaped = ldap.filter.escape_filter_chars('alicepw', 2)
-        results = self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                        '(userPassword=%s)' % (escaped,))
-
-        self.assertEqual(results, [alice])
-
-    def test_search_s_unparsable_filterstr(self):
-        with self.assertRaises(ldap.FILTER_ERROR):
-            self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                  'invalid=*')
-
-    def test_search_s_unparsable_filterstr_test(self):
-        with self.assertRaises(ldap.FILTER_ERROR):
-            self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                  '(invalid=)')
-
-    def test_search_s_filterstr_wildcard(self):
-        with self.assertRaises(SeedRequired):
-            self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                  '(invalid=foo*bar)')
-
-    def test_search_s_invalid_filterstr(self):
-        results = self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                        '(invalid=*)')
-
-        self.assertEqual(results, [])
-
-    def test_search_s_invalid_filterstr_op(self):
-        with self.assertRaises(SeedRequired):
-            self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                  '(invalid~=bogus)')
-
-    def test_search_async(self):
-        msgid = self.ldapobj.search("cn=alice,ou=example,o=test", ldap.SCOPE_BASE)
-        results = self.ldapobj.result(msgid)
-
-        self.assertEqual(results, (ldap.RES_SEARCH_RESULT, [alice]))
-
-    def test_useful_seed_required_message(self):
-        filterstr = '(invalid~=bogus)'
-
-        with self.assertRaises(SeedRequired):
-            self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                  filterstr, attrlist=['ou'])
-
-    def test_search_s_mixed_case_dn(self):
-        dn = "cn=Edward,ou=example,o=test"
-        attrs = {
-            "objectClass": ["top"],
-            "cn": ["Edward"],
-        }
-        ldif = ldap.modlist.addModlist(attrs)
-        self.ldapobj.add_s(dn, ldif)
-
-        results = self.ldapobj.search_s(dn.lower(), ldap.SCOPE_BASE)
-
-        self.assertEqual(results, [(dn.lower(), attrs)])
-
-    def test_search_s_get_items_that_have_userpassword_set(self):
-        results = self.ldapobj.search_s(
-            "ou=example,o=test", ldap.SCOPE_ONELEVEL, '(userPassword=*)')
-
-        self.assertEqual(sorted(results), sorted([alice, manager, theo]))
-
-    def test_search_s_filterstr_with_not(self):
-        results = self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_SUBTREE,
-                                        "(!(userPassword=alicepw))")
-
-        self.assertEqual(sorted(results),
-                         sorted([example, manager, theo, john]))
-
-    def test_search_s_mutliple_filterstr_items_with_and(self):
-        results = self.ldapobj.search_s(
-            "ou=example,o=test", ldap.SCOPE_SUBTREE,
-            "(&(objectClass=top)(objectClass=posixAccount)(userPassword=*))"
-        )
-
-        self.assertEqual(sorted(results), sorted([alice, manager, theo]))
-
-    def test_search_s_mutliple_filterstr_items_one_invalid_with_and(self):
-        results = self.ldapobj.search_s(
-            "ou=example,o=test", ldap.SCOPE_SUBTREE,
-            "(&(objectClass=top)(invalid=yo)(objectClass=posixAccount))"
-        )
-
-        self.assertEqual(results, [])
-
-    def test_search_s_multiple_filterstr_items_with_or(self):
-        results = self.ldapobj.search_s(
-            "ou=example,o=test", ldap.SCOPE_SUBTREE,
-            "(|(objectClass=inetOrgPerson)(userPassword=alicepw))"
-        )
-
-        self.assertEqual(sorted(results), sorted([alice, manager]))
-
-    def test_search_s_multiple_filterstr_items_one_invalid_with_or(self):
-        results = self.ldapobj.search_s(
-            "ou=example,o=test", ldap.SCOPE_SUBTREE,
-            "(|(objectClass=inetOrgPerson)(invalid=yo)(userPassword=alicepw))"
-        )
-
-        self.assertEqual(sorted(results), sorted([alice, manager]))
-
-    def test_search_s_filterstr_with_token_chars(self):
-        """ Make sure we can parse special chars in a filter string. """
-        self.ldapobj.search_s(
-            "ou=example,o=test", ldap.SCOPE_SUBTREE,
-            "(objectClass=a & b | c ! d)"
-        )
-
-    def test_search_s_scope_base_no_such_object(self):
-        with self.assertRaises(ldap.NO_SUCH_OBJECT):
-            self.ldapobj.search_s("cn=blah,ou=example,o=test", ldap.SCOPE_BASE)
-
-    def test_search_s_no_results(self):
-        results = self.ldapobj.search_s("ou=example,o=test", ldap.SCOPE_ONELEVEL,
-                                        '(uid=blah)')
-
-        self.assertEqual(results, [])
-
-    def test_search_s_invalid_dn(self):
-        with self.assertRaises(ldap.INVALID_DN_SYNTAX):
-            self.ldapobj.search_s("invalid", ldap.SCOPE_SUBTREE)
-
-    def test_start_tls_s_disabled_by_default(self):
-        self.assertEqual(self.ldapobj.tls_enabled, False)
-
-    def test_start_tls_s_enabled(self):
-        self.ldapobj.start_tls_s()
-        self.assertEqual(self.ldapobj.tls_enabled, True)
-
-    def test_compare_s_no_such_object(self):
-        with self.assertRaises(ldap.NO_SUCH_OBJECT):
-            self.ldapobj.compare_s('cn=blah,ou=example,o=test', 'objectClass',
-                                   'top')
-
-    def test_compare_s_true(self):
-        result = self.ldapobj.compare_s('cn=Manager,ou=example,o=test',
-                                        'objectClass', 'top')
-
-        self.assertEqual(result, 1)
-
-    def test_compare_s_false(self):
-        result = self.ldapobj.compare_s('cn=Manager,ou=example,o=test',
-                                        'objectClass', 'invalid')
-
-        self.assertEqual(result, 0)
-
-    def test_compare_s_invalid_dn(self):
-        with self.assertRaises(ldap.INVALID_DN_SYNTAX):
-            self.ldapobj.compare_s('invalid', 'invalid', 'invalid')
-
-    def test_add_s_success_code(self):
-        dn = 'cn=mike,ou=example,o=test'
-        attrs = {
-            'objectClass': ['top', 'organizationalRole'],
-            'cn': ['mike'],
-            'userPassword': ['mikepw'],
-        }
-        ldif = ldap.modlist.addModlist(attrs)
-
-        result = self.ldapobj.add_s(dn, ldif)
-
-        self.assertEqual(result, (105, [], 1, []))
-
-    def test_add_s_successfully_add_object(self):
-        dn = 'cn=mike,ou=example,o=test'
-        attrs = {
-            'objectClass': ['top', 'organizationalRole'],
-            'cn': ['mike'],
-            'userPassword': ['mikepw'],
-        }
-        ldif = ldap.modlist.addModlist(attrs)
-
-        self.ldapobj.add_s(dn, ldif)
-
-        self.assertEqual(self.ldapobj.directory[dn], attrs)
-
-    def test_add_s_already_exists(self):
-        attrs = {'cn': ['mike']}
-        ldif = ldap.modlist.addModlist(attrs)
-
-        with self.assertRaises(ldap.ALREADY_EXISTS):
-            self.ldapobj.add_s(alice[0], ldif)
-        self.assertNotEqual(self.ldapobj.directory[alice[0]], attrs)
-
-    def test_add_s_invalid_dn(self):
-        dn = 'invalid'
-        attrs = {
-            'objectClass': ['top', 'organizationalRole'],
-            'cn': ['mike'],
-            'userPassword': ['mikepw'],
-        }
-        ldif = ldap.modlist.addModlist(attrs)
-
-        with self.assertRaises(ldap.INVALID_DN_SYNTAX):
-            self.ldapobj.add_s(dn, ldif)
-
-    def test_modify_s_no_such_object(self):
-        mod_list = [(ldap.MOD_REPLACE, 'userPassword', 'test')]
-
-        with self.assertRaises(ldap.NO_SUCH_OBJECT):
-            self.ldapobj.modify_s('ou=invalid,o=test', mod_list)
-
-    def test_modify_s_success_code(self):
-        new_pw = ['alice', 'alicepw2']
-        mod_list = [(ldap.MOD_REPLACE, 'userPassword', new_pw)]
-
-        result = self.ldapobj.modify_s(alice[0], mod_list)
-
-        self.assertEqual(result, (103, []))
-
-    def test_modify_s_replace_value_of_attribute_with_multiple_others(self):
-        new_pw = ['alice', 'alicepw2']
-        mod_list = [(ldap.MOD_REPLACE, 'userPassword', new_pw)]
-
-        self.ldapobj.modify_s(alice[0], mod_list)
-
-        self.assertEqual(self.ldapobj.directory[alice[0]]['userPassword'],
-                         new_pw)
-
-    def test_modify_s_replace_value_of_attribute_with_another_single(self):
-        new_pw = 'alice'
-        mod_list = [(ldap.MOD_REPLACE, 'userPassword', new_pw)]
-
-        self.ldapobj.modify_s(alice[0], mod_list)
-
-        self.assertEqual(self.ldapobj.directory[alice[0]]['userPassword'],
-                         [new_pw])
-
-    def test_modify_s_replace_with_none(self):
-        mod_list = [(ldap.MOD_REPLACE, 'objectClass', None)]
-
-        self.ldapobj.modify_s(manager[0], mod_list)
-
-        self.assertNotIn('objectClass',
-                         self.ldapobj.directory[manager[0]].keys())
-
-    def test_modify_s_add_single_value_to_attribute(self):
-        old_pw = copy(self.ldapobj.directory[alice[0]]['userPassword'])
-        new_pw = 'test'
-        mod_list = [(ldap.MOD_ADD, 'userPassword', new_pw)]
-
-        self.ldapobj.modify_s(alice[0], mod_list)
-
-        self.assertEqual(set(old_pw) | set([new_pw]),
-                         set(self.ldapobj.directory[alice[0]]['userPassword']))
-
-    def test_modify_s_add_multiple_values_to_attribute(self):
-        old_pw = copy(self.ldapobj.directory[alice[0]]['userPassword'])
-        new_pw = ['test1', 'test2']
-        mod_list = [(ldap.MOD_ADD, 'userPassword', new_pw)]
-
-        self.ldapobj.modify_s(alice[0], mod_list)
-
-        self.assertEqual(set(old_pw) | set(new_pw),
-                         set(self.ldapobj.directory[alice[0]]['userPassword']))
-
-    def test_modify_s_create_on_add(self):
-        """ Create an attribute by adding the first value. """
-        self.ldapobj.modify_s(alice[0], [(ldap.MOD_ADD, 'someAttr', 'value')])
-
-        self.assertEqual(self.ldapobj.directory[alice[0]]['someAttr'], ['value'])
-
-    def test_modify_s_add_none_value_raises_protocol_error(self):
-        mod_list = [(ldap.MOD_ADD, 'userPassword', None)]
-
-        with self.assertRaises(ldap.PROTOCOL_ERROR):
-            self.ldapobj.modify_s(bob[0], mod_list)
-
-    def test_modify_s_dont_add_already_existing_value(self):
-        old_pw = copy(self.ldapobj.directory[bob[0]]['userPassword'])
-        mod_list = [(ldap.MOD_ADD, 'userPassword', 'bobpw')]
-
-        self.ldapobj.modify_s(bob[0], mod_list)
... 251 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/mockldap.git



More information about the Python-modules-commits mailing list