[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