tests.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. # -*- coding: utf-8 -*-
  2. #
  3. # django-ldapdb
  4. # Copyright (c) 2009-2011, Bolloré telecom
  5. # Copyright (c) 2013, Jeremy Lainé
  6. # All rights reserved.
  7. #
  8. # See AUTHORS file for a full list of contributors.
  9. #
  10. # Redistribution and use in source and binary forms, with or without
  11. # modification, are permitted provided that the following conditions are met:
  12. #
  13. # 1. Redistributions of source code must retain the above copyright notice,
  14. # this list of conditions and the following disclaimer.
  15. #
  16. # 2. Redistributions in binary form must reproduce the above copyright
  17. # notice, this list of conditions and the following disclaimer in the
  18. # documentation and/or other materials provided with the distribution.
  19. #
  20. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21. # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  24. # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25. # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26. # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27. # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28. # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30. # POSSIBILITY OF SUCH DAMAGE.
  31. #
  32. from django.test import TestCase
  33. from django.db.models.sql.where import Constraint, AND, OR, WhereNode
  34. from ldapdb import escape_ldap_filter
  35. from ldapdb.backends.ldap.compiler import where_as_ldap
  36. from ldapdb.models.fields import (CharField, IntegerField, FloatField,
  37. ListField, DateField)
  38. class WhereTestCase(TestCase):
  39. def test_escape(self):
  40. self.assertEquals(escape_ldap_filter(u'fôöbàr'), u'fôöbàr')
  41. self.assertEquals(escape_ldap_filter('foo*bar'), 'foo\\2abar')
  42. self.assertEquals(escape_ldap_filter('foo(bar'), 'foo\\28bar')
  43. self.assertEquals(escape_ldap_filter('foo)bar'), 'foo\\29bar')
  44. self.assertEquals(escape_ldap_filter('foo\\bar'), 'foo\\5cbar')
  45. self.assertEquals(escape_ldap_filter('foo\\bar*wiz'),
  46. 'foo\\5cbar\\2awiz')
  47. def test_char_field_exact(self):
  48. where = WhereNode()
  49. where.add((Constraint("cn", "cn", CharField()), 'exact', "test"), AND)
  50. self.assertEquals(where_as_ldap(where), ("(cn=test)", []))
  51. where = WhereNode()
  52. where.add((Constraint("cn", "cn", CharField()), 'exact', "(test)"),
  53. AND)
  54. self.assertEquals(where_as_ldap(where), ("(cn=\\28test\\29)", []))
  55. def test_char_field_in(self):
  56. where = WhereNode()
  57. where.add((Constraint("cn", "cn", CharField()), 'in', ["foo", "bar"]),
  58. AND)
  59. self.assertEquals(where_as_ldap(where), ("(|(cn=foo)(cn=bar))", []))
  60. where = WhereNode()
  61. where.add((Constraint("cn", "cn", CharField()), 'in',
  62. ["(foo)", "(bar)"]), AND)
  63. self.assertEquals(where_as_ldap(where),
  64. ("(|(cn=\\28foo\\29)(cn=\\28bar\\29))", []))
  65. def test_char_field_startswith(self):
  66. where = WhereNode()
  67. where.add((Constraint("cn", "cn", CharField()), 'startswith', "test"),
  68. AND)
  69. self.assertEquals(where_as_ldap(where), ("(cn=test*)", []))
  70. where = WhereNode()
  71. where.add((Constraint("cn", "cn", CharField()), 'startswith', "te*st"),
  72. AND)
  73. self.assertEquals(where_as_ldap(where), ("(cn=te\\2ast*)", []))
  74. def test_char_field_endswith(self):
  75. where = WhereNode()
  76. where.add((Constraint("cn", "cn", CharField()), 'endswith', "test"),
  77. AND)
  78. self.assertEquals(where_as_ldap(where), ("(cn=*test)", []))
  79. where = WhereNode()
  80. where.add((Constraint("cn", "cn", CharField()), 'endswith', "te*st"),
  81. AND)
  82. self.assertEquals(where_as_ldap(where), ("(cn=*te\\2ast)", []))
  83. def test_char_field_contains(self):
  84. where = WhereNode()
  85. where.add((Constraint("cn", "cn", CharField()), 'contains', "test"),
  86. AND)
  87. self.assertEquals(where_as_ldap(where), ("(cn=*test*)", []))
  88. where = WhereNode()
  89. where.add((Constraint("cn", "cn", CharField()), 'contains', "te*st"),
  90. AND)
  91. self.assertEquals(where_as_ldap(where), ("(cn=*te\\2ast*)", []))
  92. def test_integer_field(self):
  93. where = WhereNode()
  94. where.add((Constraint("uid", "uid", IntegerField()), 'exact', 1), AND)
  95. self.assertEquals(where_as_ldap(where), ("(uid=1)", []))
  96. where = WhereNode()
  97. where.add((Constraint("uid", "uid", IntegerField()), 'gte', 1), AND)
  98. self.assertEquals(where_as_ldap(where), ("(uid>=1)", []))
  99. where = WhereNode()
  100. where.add((Constraint("uid", "uid", IntegerField()), 'lte', 1), AND)
  101. self.assertEquals(where_as_ldap(where), ("(uid<=1)", []))
  102. def test_float_field(self):
  103. where = WhereNode()
  104. where.add((Constraint("uid", "uid", FloatField()), 'exact', 1.2), AND)
  105. self.assertEquals(where_as_ldap(where), ("(uid=1.2)", []))
  106. where = WhereNode()
  107. where.add((Constraint("uid", "uid", FloatField()), 'gte', 1.2), AND)
  108. self.assertEquals(where_as_ldap(where), ("(uid>=1.2)", []))
  109. where = WhereNode()
  110. where.add((Constraint("uid", "uid", FloatField()), 'lte', 1.2), AND)
  111. self.assertEquals(where_as_ldap(where), ("(uid<=1.2)", []))
  112. def test_list_field_contains(self):
  113. where = WhereNode()
  114. where.add((Constraint("memberUid", "memberUid", ListField()),
  115. 'contains', 'foouser'), AND)
  116. self.assertEquals(where_as_ldap(where), ("(memberUid=foouser)", []))
  117. where = WhereNode()
  118. where.add((Constraint("memberUid", "memberUid", ListField()),
  119. 'contains', '(foouser)'), AND)
  120. self.assertEquals(where_as_ldap(where), ("(memberUid=\\28foouser\\29)",
  121. []))
  122. def test_date_field(self):
  123. where = WhereNode()
  124. where.add((Constraint("birthday", "birthday", DateField()), 'exact',
  125. '2013-09-03'), AND)
  126. self.assertEquals(where_as_ldap(where), ("(birthday=2013-09-03)", []))
  127. def test_and(self):
  128. where = WhereNode()
  129. where.add((Constraint("cn", "cn", CharField()), 'exact', "foo"), AND)
  130. where.add((Constraint("givenName", "givenName", CharField()), 'exact',
  131. "bar"), AND)
  132. self.assertEquals(where_as_ldap(where), ("(&(cn=foo)(givenName=bar))",
  133. []))
  134. def test_or(self):
  135. where = WhereNode()
  136. where.add((Constraint("cn", "cn", CharField()), 'exact', "foo"), AND)
  137. where.add((Constraint("givenName", "givenName", CharField()), 'exact',
  138. "bar"), OR)
  139. self.assertEquals(where_as_ldap(where), ("(|(cn=foo)(givenName=bar))",
  140. []))