Skip to content

Commit

Permalink
use in memory db for tests, needs some fixes, as result order may differ
Browse files Browse the repository at this point in the history
  • Loading branch information
jensens committed Oct 27, 2017
1 parent 70e2b19 commit bd1e75b
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 119 deletions.
92 changes: 46 additions & 46 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -457,14 +457,14 @@ bool operators '&' and '|':
>>> from node.ext.ldap import LDAPFilter
>>> filter = LDAPFilter('(objectClass=person)')
>>> filter |= LDAPFilter('(objectClass=groupOfNames)')
>>> root.search(queryFilter=filter)
[u'cn=person1,ou=demo,dc=my-domain,dc=com',
u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
u'cn=person5,ou=demo,dc=my-domain,dc=com',
u'cn=group1,ou=demo,dc=my-domain,dc=com',
u'cn=group2,ou=demo,dc=my-domain,dc=com']
>>> sorted(root.search(queryFilter=filter))
[u'cn=group1,ou=demo,dc=my-domain,dc=com',
u'cn=group2,ou=demo,dc=my-domain,dc=com',
u'cn=person1,ou=demo,dc=my-domain,dc=com',
u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
u'cn=person5,ou=demo,dc=my-domain,dc=com']
Define multiple criteria LDAP filter:

Expand All @@ -483,9 +483,9 @@ Define a relation LDAP filter. In this case we build a relation between group
>>> from node.ext.ldap import LDAPRelationFilter
>>> filter = LDAPRelationFilter(root['cn=group1'], 'cn:businessCategory')
>>> root.search(queryFilter=filter)
[u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
[u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
u'cn=person5,ou=demo,dc=my-domain,dc=com']
Different LDAP filter types can be combined:
Expand Down Expand Up @@ -569,7 +569,7 @@ LDAPRelationFilter or string:
>>> root.search_filter = LDAPFilter('objectClass=groupOfNames')
>>> root.search()
[u'cn=group1,ou=demo,dc=my-domain,dc=com',
[u'cn=group1,ou=demo,dc=my-domain,dc=com',
u'cn=group2,ou=demo,dc=my-domain,dc=com']
>>> root.search_filter = None
Expand All @@ -580,10 +580,10 @@ Define default search criteria as dict:
>>> root.search_criteria = {'objectClass': 'person'}
>>> root.search()
[u'cn=person1,ou=demo,dc=my-domain,dc=com',
u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
[u'cn=person1,ou=demo,dc=my-domain,dc=com',
u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
u'cn=person5,ou=demo,dc=my-domain,dc=com']
Define default search relation:
Expand All @@ -593,9 +593,9 @@ Define default search relation:
>>> root.search_relation = \
... LDAPRelationFilter(root['cn=group1'], 'cn:businessCategory')
>>> root.search()
[u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
[u'cn=person2,ou=demo,dc=my-domain,dc=com',
u'cn=person3,ou=demo,dc=my-domain,dc=com',
u'cn=person4,ou=demo,dc=my-domain,dc=com',
u'cn=person5,ou=demo,dc=my-domain,dc=com']
Again, like with the keyword arguments, multiple defined defaults are '&'
Expand Down Expand Up @@ -638,12 +638,12 @@ Deserialize JSON dump:
>>> from node.serializer import deserialize
>>> deserialize(json_dump, root=root)
[<cn=person1,ou=demo,dc=my-domain,dc=com:cn=person1 - True>,
<cn=person2,ou=demo,dc=my-domain,dc=com:cn=person2 - True>,
<cn=person3,ou=demo,dc=my-domain,dc=com:cn=person3 - True>,
<cn=person4,ou=demo,dc=my-domain,dc=com:cn=person4 - True>,
<cn=person5,ou=demo,dc=my-domain,dc=com:cn=person5 - True>,
<cn=group1,ou=demo,dc=my-domain,dc=com:cn=group1 - True>,
[<cn=person1,ou=demo,dc=my-domain,dc=com:cn=person1 - True>,
<cn=person2,ou=demo,dc=my-domain,dc=com:cn=person2 - True>,
<cn=person3,ou=demo,dc=my-domain,dc=com:cn=person3 - True>,
<cn=person4,ou=demo,dc=my-domain,dc=com:cn=person4 - True>,
<cn=person5,ou=demo,dc=my-domain,dc=com:cn=person5 - True>,
<cn=group1,ou=demo,dc=my-domain,dc=com:cn=group1 - True>,
<cn=group2,ou=demo,dc=my-domain,dc=com:cn=group2 - True>]
Since root has been given, created nodes were added:
Expand Down Expand Up @@ -683,34 +683,34 @@ can be deserialized later:
.. code-block:: pycon
>>> serialize(container)
'{"__node__":
{"attrs": {"objectClass": ["organizationalUnit"],
"ou": "container"},
"children":
[{"__node__":
{"attrs":
{"objectClass": ["person", "inetOrgPerson"],
"userPassword": "secret",
"sn": "Mustermann", "cn": "person1"},
"class": "node.ext.ldap._node.LDAPNode",
"name": "cn=person1"}}],
"class": "node.ext.ldap._node.LDAPNode",
'{"__node__":
{"attrs": {"objectClass": ["organizationalUnit"],
"ou": "container"},
"children":
[{"__node__":
{"attrs":
{"objectClass": ["person", "inetOrgPerson"],
"userPassword": "secret",
"sn": "Mustermann", "cn": "person1"},
"class": "node.ext.ldap._node.LDAPNode",
"name": "cn=person1"}}],
"class": "node.ext.ldap._node.LDAPNode",
"name": "ou=container"}}'
Serialize in simple mode is better readable, but not deserialzable any more:

.. code-block:: pycon
>>> serialize(container, simple_mode=True)
'{"attrs":
{"objectClass": ["organizationalUnit"],
"ou": "container"},
"name": "ou=container",
"children":
[{"name": "cn=person1",
"attrs": {"objectClass": ["person", "inetOrgPerson"],
"userPassword": "secret",
"sn": "Mustermann",
'{"attrs":
{"objectClass": ["organizationalUnit"],
"ou": "container"},
"name": "ou=container",
"children":
[{"name": "cn=person1",
"attrs": {"objectClass": ["person", "inetOrgPerson"],
"userPassword": "secret",
"sn": "Mustermann",
"cn": "person1"}}]}'
Expand Down
145 changes: 73 additions & 72 deletions src/node/ext/ldap/_node.rst
Original file line number Diff line number Diff line change
Expand Up @@ -275,10 +275,10 @@ Check added node internal DN::
Data has changed in memory, but not persisted yet to LDAP::

>>> customers.keys()
[u'ou=customer1',
u'ou=customer2',
u'ou=n\xe4sty\\, customer',
u'uid=binary',
[u'ou=customer1',
u'ou=customer2',
u'ou=n\xe4sty\\, customer',
u'uid=binary',
u'ou=customer3']

Now tree nodes from customer up to root are flagged changed after adding the
Expand Down Expand Up @@ -961,51 +961,52 @@ No other default search criteria set::

Search with no arguments given return childs keys::

>>> node.search()
>>> sorted(node.search())
[u'ou=customers,dc=my-domain,dc=com', u'ou=demo,dc=my-domain,dc=com']

Set default search scope to SUBTREE::

>>> node.search_scope = SUBTREE
>>> node.search()
[u'dc=my-domain,dc=com',
u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com',
u'ou=demo,dc=my-domain,dc=com',
u'uid=binary,ou=customers,dc=my-domain,dc=com',
u'ou=customer3,ou=customers,dc=my-domain,dc=com',
u'cn=customer99,ou=customers,dc=my-domain,dc=com']
>>> sorted(node.search())
[u'cn=customer99,ou=customers,dc=my-domain,dc=com',
u'dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=customer3,ou=customers,dc=my-domain,dc=com',
u'ou=customers,dc=my-domain,dc=com',
u'ou=demo,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com',
u'uid=binary,ou=customers,dc=my-domain,dc=com']

We can fetch node instances instead of DN's in search result::

>>> node.search(get_nodes=True)
[<dc=my-domain,dc=com - False>,
<ou=customers,dc=my-domain,dc=com:ou=customers - False>,
<ou=customer1,ou=customers,dc=my-domain,dc=com:ou=customer1 - False>,
<ou=customer2,ou=customers,dc=my-domain,dc=com:ou=customer2 - False>,
<ou=n?sty\, customer,ou=customers,dc=my-domain,dc=com:ou=n?sty\, customer - False>,
<ou=demo,dc=my-domain,dc=com:ou=demo - False>,
<uid=binary,ou=customers,dc=my-domain,dc=com:uid=binary - False>,
<ou=customer3,ou=customers,dc=my-domain,dc=com:ou=customer3 - False>,
<cn=customer99,ou=customers,dc=my-domain,dc=com:cn=customer99 - False>]
>>> pprint(node.search(get_nodes=True))
[<dc=my-domain,dc=com - False>,
<ou=demo,dc=my-domain,dc=com:ou=demo - False>,
<ou=customers,dc=my-domain,dc=com:ou=customers - False>,
<uid=binary,ou=customers,dc=my-domain,dc=com:uid=binary - False>,
<ou=customer1,ou=customers,dc=my-domain,dc=com:ou=customer1 - False>,
<ou=customer2,ou=customers,dc=my-domain,dc=com:ou=customer2 - False>,
<ou=customer3,ou=customers,dc=my-domain,dc=com:ou=customer3 - False>,
<cn=customer99,ou=customers,dc=my-domain,dc=com:cn=customer99 - False>,
<ou=n?sty\, customer,ou=customers,dc=my-domain,dc=com:ou=n?sty\, customer - False>]


Search with pagination::

>>> res, cookie = node.search(page_size=5)
>>> res
[u'dc=my-domain,dc=com',
u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
[u'dc=my-domain,dc=com',
u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com']

>>> res, cookie = node.search(page_size=5, cookie=cookie)
>>> res
[u'ou=demo,dc=my-domain,dc=com',
u'uid=binary,ou=customers,dc=my-domain,dc=com',
u'ou=customer3,ou=customers,dc=my-domain,dc=com',
[u'ou=demo,dc=my-domain,dc=com',
u'uid=binary,ou=customers,dc=my-domain,dc=com',
u'ou=customer3,ou=customers,dc=my-domain,dc=com',
u'cn=customer99,ou=customers,dc=my-domain,dc=com']

>>> assert cookie == ''
Expand All @@ -1015,22 +1016,22 @@ Lets add a default search filter.::
>>> filter = LDAPFilter('(objectClass=organizationalUnit)')
>>> node.search_filter = filter
>>> node.search()
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com',
u'ou=demo,dc=my-domain,dc=com',
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com',
u'ou=demo,dc=my-domain,dc=com',
u'ou=customer3,ou=customers,dc=my-domain,dc=com']

The default search filter could also be a string::

>>> node.search_filter = '(objectClass=organizationalUnit)'
>>> node.search()
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com',
u'ou=demo,dc=my-domain,dc=com',
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com',
u'ou=demo,dc=my-domain,dc=com',
u'ou=customer3,ou=customers,dc=my-domain,dc=com']

Its also possible to define default search criteria as dict::
Expand All @@ -1039,8 +1040,8 @@ Its also possible to define default search criteria as dict::
... 'businessCategory': 'customers',
... }
>>> node.search()
[u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
[u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com']

>>> node.search_criteria = {
Expand All @@ -1052,29 +1053,29 @@ Its also possible to define default search criteria as dict::
To get more information by search result, pass an attrlist to search function::

>>> node.search(attrlist=['rdn', 'description'])
[(u'ou=customers,dc=my-domain,dc=com',
{u'rdn': u'ou=customers',
[(u'ou=customers,dc=my-domain,dc=com',
{u'rdn': u'ou=customers',
u'description': [u'customers']})]

>>> node.search(attrlist=['rdn', 'description', 'businessCategory'])
[(u'ou=customers,dc=my-domain,dc=com',
{u'rdn': u'ou=customers',
u'description': [u'customers'],
[(u'ou=customers,dc=my-domain,dc=com',
{u'rdn': u'ou=customers',
u'description': [u'customers'],
u'businessCategory': [u'customers_container']})]

We can also fetch nodes instead of DN here::

>>> node.search(attrlist=['dn', 'description'],
... get_nodes=True)
[(<ou=customers,dc=my-domain,dc=com:ou=customers - False>,
{u'dn': u'ou=customers,dc=my-domain,dc=com',
[(<ou=customers,dc=my-domain,dc=com:ou=customers - False>,
{u'dn': u'ou=customers,dc=my-domain,dc=com',
u'description': [u'customers']})]

>>> node.search(attrlist=['dn', 'description', 'businessCategory'],
... get_nodes=True)
[(<ou=customers,dc=my-domain,dc=com:ou=customers - False>,
{u'dn': u'ou=customers,dc=my-domain,dc=com',
u'description': [u'customers'],
[(<ou=customers,dc=my-domain,dc=com:ou=customers - False>,
{u'dn': u'ou=customers,dc=my-domain,dc=com',
u'description': [u'customers'],
u'businessCategory': [u'customers_container']})]

Test without defaults, defining search with keyword arguments::
Expand Down Expand Up @@ -1121,8 +1122,8 @@ Test relation filter::
>>> node.search_relation = 'description:businessCategory'
>>> rel_node = node['ou=customers']['cn=customer99']
>>> node.search(relation_node=rel_node)
[u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
[u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com']

>>> node.search(relation='description:description', relation_node=rel_node)
Expand All @@ -1146,32 +1147,32 @@ Test relation filter::
'(|(description=customers)(businessCategory=customers))'

>>> node.search(relation=relation)
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com']

>>> node.search_relation = relation
>>> node.search()
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
[u'ou=customers,dc=my-domain,dc=com',
u'ou=customer1,ou=customers,dc=my-domain,dc=com',
u'ou=customer2,ou=customers,dc=my-domain,dc=com',
u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com']

Search with binary in attrlist::

>>> node = LDAPNode('dc=my-domain,dc=com', props)
>>> node.search_scope = SUBTREE
>>> node.search(attrlist=['jpegPhoto'])
[(u'dc=my-domain,dc=com', {}),
(u'ou=customers,dc=my-domain,dc=com', {}),
(u'ou=customer1,ou=customers,dc=my-domain,dc=com', {}),
(u'ou=customer2,ou=customers,dc=my-domain,dc=com', {}),
(u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com', {}),
(u'ou=demo,dc=my-domain,dc=com', {}),
(u'uid=binary,ou=customers,dc=my-domain,dc=com', {u'jpegPhoto': ['...']}),
(u'ou=customer3,ou=customers,dc=my-domain,dc=com', {}),
(u'cn=customer99,ou=customers,dc=my-domain,dc=com', {})]
>>> sorted(node.search(attrlist=['jpegPhoto']))
[(u'cn=customer99,ou=customers,dc=my-domain,dc=com', {}),
(u'dc=my-domain,dc=com', {}),
(u'ou=customer1,ou=customers,dc=my-domain,dc=com', {}),
(u'ou=customer2,ou=customers,dc=my-domain,dc=com', {}),
(u'ou=customer3,ou=customers,dc=my-domain,dc=com', {}),
(u'ou=customers,dc=my-domain,dc=com', {}),
(u'ou=demo,dc=my-domain,dc=com', {}),
(u'ou=n\xe4sty\\2C customer,ou=customers,dc=my-domain,dc=com', {}),
(u'uid=binary,ou=customers,dc=my-domain,dc=com', {u'jpegPhoto': ['...']})]

Add and delete node without persisting in between::

Expand Down

0 comments on commit bd1e75b

Please sign in to comment.