tests.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from IPy import IP
  2. from django.db import IntegrityError
  3. from django.test import TestCase
  4. from netfields.models import (CidrTestModel, InetTestModel, NullCidrTestModel,
  5. NullInetTestModel)
  6. class BaseTestCase(object):
  7. select = 'SELECT "table"."id", "table"."field" FROM "table" '
  8. def assertSqlEquals(self, qs, sql):
  9. sql = sql.replace('"table"', '"%s"' % self.table)
  10. self.assertEqual(qs.query.get_compiler(qs.db).as_sql()[0], sql)
  11. def assertSqlRaises(self, qs, error):
  12. self.assertRaises(error, qs.query.get_compiler(qs.db).as_sql)
  13. def test_init_with_blank(self):
  14. self.model()
  15. def test_init_with_text_fails(self):
  16. self.assertRaises(ValueError, self.model, field='abc')
  17. def test_save(self):
  18. self.model(field='10.0.0.1').save()
  19. def test_save_object(self):
  20. self.model(field=IP('10.0.0.1')).save()
  21. def test_equals_lookup(self):
  22. self.assertSqlEquals(self.qs.filter(field='10.0.0.1'),
  23. self.select + 'WHERE "table"."field" = %s ')
  24. def test_exact_lookup(self):
  25. self.assertSqlEquals(self.qs.filter(field__exact='10.0.0.1'),
  26. self.select + 'WHERE "table"."field" = %s ')
  27. def test_iexact_lookup(self):
  28. self.assertSqlEquals(self.qs.filter(field__iexact='10.0.0.1'),
  29. self.select + 'WHERE "table"."field" = %s ')
  30. def test_net_contains_lookup(self):
  31. self.assertSqlEquals(self.qs.filter(field__net_contains='10.0.0.1'),
  32. self.select + 'WHERE "table"."field" >> %s ')
  33. def test_in_lookup(self):
  34. self.assertSqlEquals(self.qs.filter(field__in=['10.0.0.1', '10.0.0.2']),
  35. self.select + 'WHERE "table"."field" IN (%s, %s)')
  36. def test_gt_lookup(self):
  37. self.assertSqlEquals(self.qs.filter(field__gt='10.0.0.1'),
  38. self.select + 'WHERE "table"."field" > %s ')
  39. def test_gte_lookup(self):
  40. self.assertSqlEquals(self.qs.filter(field__gte='10.0.0.1'),
  41. self.select + 'WHERE "table"."field" >= %s ')
  42. def test_lt_lookup(self):
  43. self.assertSqlEquals(self.qs.filter(field__lt='10.0.0.1'),
  44. self.select + 'WHERE "table"."field" < %s ')
  45. def test_lte_lookup(self):
  46. self.assertSqlEquals(self.qs.filter(field__lte='10.0.0.1'),
  47. self.select + 'WHERE "table"."field" <= %s ')
  48. def test_range_lookup(self):
  49. self.assertSqlEquals(self.qs.filter(field__range=('10.0.0.1', '10.0.0.10')),
  50. self.select + 'WHERE "table"."field" BETWEEN %s and %s')
  51. def test_year_lookup_fails(self):
  52. self.assertSqlRaises(self.qs.filter(field__year=1), ValueError)
  53. def test_month_lookup_fails(self):
  54. self.assertSqlRaises(self.qs.filter(field__month=1), ValueError)
  55. def test_day_lookup_fails(self):
  56. self.assertSqlRaises(self.qs.filter(field__day=1), ValueError)
  57. def test_isnull_true_lookup(self):
  58. self.assertSqlEquals(self.qs.filter(field__isnull=True),
  59. self.select + 'WHERE "table"."field" IS NULL')
  60. def test_isnull_false_lookup(self):
  61. self.assertSqlEquals(self.qs.filter(field__isnull=False),
  62. self.select + 'WHERE "table"."field" IS NOT NULL')
  63. def test_search_lookup_fails(self):
  64. self.assertSqlRaises(self.qs.filter(field__search='10'), ValueError)
  65. def test_net_contains_or_equals(self):
  66. self.assertSqlEquals(self.qs.filter(field__net_contains_or_equals='10.0.0.1'),
  67. self.select + 'WHERE "table"."field" >>= %s ')
  68. def test_net_contained(self):
  69. self.assertSqlEquals(self.qs.filter(field__net_contained='10.0.0.1'),
  70. self.select + 'WHERE "table"."field" << %s ')
  71. def test_net_contained_or_equals(self):
  72. self.assertSqlEquals(self.qs.filter(field__net_contained_or_equal='10.0.0.1'),
  73. self.select + 'WHERE "table"."field" <<= %s ')
  74. class BaseInetFieldTestCase(BaseTestCase):
  75. def test_startswith_lookup(self):
  76. self.assertSqlEquals(self.qs.filter(field__startswith='10.'),
  77. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  78. def test_istartswith_lookup(self):
  79. self.assertSqlEquals(self.qs.filter(field__istartswith='10.'),
  80. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  81. def test_endswith_lookup(self):
  82. self.assertSqlEquals(self.qs.filter(field__endswith='.1'),
  83. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  84. def test_iendswith_lookup(self):
  85. self.assertSqlEquals(self.qs.filter(field__iendswith='.1'),
  86. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  87. def test_regex_lookup(self):
  88. self.assertSqlEquals(self.qs.filter(field__regex='10'),
  89. self.select + 'WHERE HOST("table"."field") ~* %s ')
  90. def test_iregex_lookup(self):
  91. self.assertSqlEquals(self.qs.filter(field__iregex='10'),
  92. self.select + 'WHERE HOST("table"."field") ~* %s ')
  93. class BaseCidrFieldTestCase(BaseTestCase):
  94. def test_startswith_lookup(self):
  95. self.assertSqlEquals(self.qs.filter(field__startswith='10.'),
  96. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  97. def test_istartswith_lookup(self):
  98. self.assertSqlEquals(self.qs.filter(field__istartswith='10.'),
  99. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  100. def test_endswith_lookup(self):
  101. self.assertSqlEquals(self.qs.filter(field__endswith='.1'),
  102. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  103. def test_iendswith_lookup(self):
  104. self.assertSqlEquals(self.qs.filter(field__iendswith='.1'),
  105. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  106. def test_regex_lookup(self):
  107. self.assertSqlEquals(self.qs.filter(field__regex='10'),
  108. self.select + 'WHERE TEXT("table"."field") ~* %s ')
  109. def test_iregex_lookup(self):
  110. self.assertSqlEquals(self.qs.filter(field__iregex='10'),
  111. self.select + 'WHERE TEXT("table"."field") ~* %s ')
  112. class TestInetField(BaseInetFieldTestCase, TestCase):
  113. def setUp(self):
  114. self.model = InetTestModel
  115. self.qs = self.model.objects.all()
  116. self.table = 'inet'
  117. def test_save_blank_fails(self):
  118. self.assertRaises(IntegrityError, self.model(field='').save)
  119. def test_save_none_fails(self):
  120. self.assertRaises(IntegrityError, self.model(field=None).save)
  121. def test_save_nothing_fails(self):
  122. self.assertRaises(IntegrityError, self.model().save)
  123. class TestInetFieldNullable(BaseInetFieldTestCase, TestCase):
  124. def setUp(self):
  125. self.model = NullInetTestModel
  126. self.qs = self.model.objects.all()
  127. self.table = 'nullinet'
  128. def test_save_blank(self):
  129. self.model().save()
  130. def test_save_none(self):
  131. self.model(field=None).save()
  132. def test_save_nothing_fails(self):
  133. self.model().save()
  134. class TestCidrField(BaseCidrFieldTestCase, TestCase):
  135. def setUp(self):
  136. self.model = CidrTestModel
  137. self.qs = self.model.objects.all()
  138. self.table = 'cidr'
  139. def test_save_blank_fails(self):
  140. self.assertRaises(IntegrityError, self.model(field='').save)
  141. def test_save_none_fails(self):
  142. self.assertRaises(IntegrityError, self.model(field=None).save)
  143. def test_save_nothing_fails(self):
  144. self.assertRaises(IntegrityError, self.model().save)
  145. class TestCidrFieldNullable(BaseCidrFieldTestCase, TestCase):
  146. def setUp(self):
  147. self.model = NullCidrTestModel
  148. self.qs = self.model.objects.all()
  149. self.table = 'nullcidr'
  150. def test_save_blank(self):
  151. self.model().save()
  152. def test_save_none(self):
  153. self.model(field=None).save()
  154. def test_save_nothing_fails(self):
  155. self.model().save()