An implementation of a LDAPObject to fake a ldap server in unittests.
Project description
The goal of this module is to provide a simple way to mock ldap backend servers for your unittests. It makes it possible to define upfront a set of directory entries that can be queried or set fixed return values to ldap queries. It acts as a drop in replacement for the LDAPObject class of the python-ldap module. It implements a subset of the allowed methods of this class.
This module implements the MockLDAP class that functions both as the LDAPObject as well as the ldap module. Most of the code and design has been taken from Peter Sagerson’s excellent django-auth-ldap module.
Installation
Get and install the code:
$ git clone git://github.com/30loops/fakeldap.git $ cd fakeldap $ python setup.py install
If you want, you can run the tests:
$ python setup.py nosetests
Usage
The MockLDAP class replaces the LDAPObject of the python-ldap module. The easiest way to use it, is to overwrite ldap.initialize to return MockLDAP instead of LDAPObject. The example below uses Michael Foord’s Mock library to achieve that:
import unittest from mock import patch from fakeldap import MockLDAP _mock_ldap = MockLDAP() class YourTestCase(unittest.TestCase): def setUp(self): # Patch where the ldap library is used: self.ldap_patcher = patch('app.module.ldap.initialize') self.mock_ldap = self.ldap_patcher.start() self.mock_ldap.return_value = _mock_ldap def tearDown(self): _mock_ldap.reset() self.mock_ldap.stop()
The mock ldap object implements the following ldap operations:
simple_bind_s
search_s
compare_s
modify_s
delete_s
add_s
rename_s
This is an example how to use MockLDAP with fixed return values:
def test_some_ldap_group_stuff(self): # Define the expected return value for the ldap operation return_value = ("cn=testgroup,ou=group,dc=30loops,dc=net", { 'objectClass': ['posixGroup'], 'cn': 'testgroup', 'gidNumber': '2030', }) # Register a return value with the MockLDAP object _mock_ldap.set_return_value('add_s', ("cn=testgroup,ou=groups,dc=30loops,dc=net", ( ('objectClass', ('posixGroup')), ('cn', 'testgroup'), ('gidNumber', '2030'))), (105,[], 10, [])) # Run your actual code, this is just an example group_manager = GroupManager() result = group_manager.add("testgroup") # assert that the return value of your method and of the MockLDAP # are as expected, here using python-nose's eq() test tool: eq_(return_value, result) # Each actual ldap call your software makes gets recorded. You could # prepare a list of calls that you expect to be issued and compare it: called_records = [] called_records.append(('simple_bind_s', {'who': 'cn=admin,dc=30loops,dc=net', 'cred': 'ldaptest'})) called_records.append(('add_s', { 'dn': 'cn=testgroup,ou=groups,dc=30loops,dc=net", 'record': [ ('objectClass', ['posixGroup']), ('gidNumber', '2030'), ('cn', 'testgroup'), ]})) # And again test the expected behaviour eq_(called_records, _mock_ldap.ldap_methods_called_with_arguments())
Besides of fixing return values for specific calls, you can also imitate a full ldap server with a directory of entries:
# Create an instance of MockLDAP with a preset directory tree = { "cn=admin,dc=30loops,dc=net": { "userPassword": "ldaptest" } } mock_ldap = MockLDAP(tree) record = [ ('uid', 'crito'), ('userPassword', 'secret'), ] # The return value I expect when I add another record to the directory eq_( (105,[],1,[]), mock_ldap.add_s("uid=crito,ou=people,dc=30loops,dc=net", record) ) # The expected directory directory = { "cn=admin,dc=30loops,dc=net": {"userPassword": "ldaptest"}, "uid=crito,ou=people,dc=30loops,dc=net": { "uid": "crito", "userPassword": "secret"} } # Compare the expected directory with the MockLDAP directory eq_(directory, mock_ldap.directory)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file fakeldap-0.6.2.tar.gz
.
File metadata
- Download URL: fakeldap-0.6.2.tar.gz
- Upload date:
- Size: 7.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b8def9b4b0cbb4944297060d3da38f57665bb454e650bee1543bfda81954dc22 |
|
MD5 | c8bc5506f592f6d7e186063779016c74 |
|
BLAKE2b-256 | 2a71f19996ed41fd340b82303b46d85f2b6be7bc779e322b0374403a4c1c0744 |
File details
Details for the file fakeldap-0.6.2-py2.py3-none-any.whl
.
File metadata
- Download URL: fakeldap-0.6.2-py2.py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.3.1 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.7.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cb7f44f1ef1b7dbabadc329e641e9853da2f414d28fa4fa70fdeed9a3e85e6cf |
|
MD5 | b223429668dff5ca3ae7fe7cc201cf3d |
|
BLAKE2b-256 | 4276a2c43fbee86dc1b22d6c889aa68f52c5f9f3408fb6635bf082388884c085 |