tests.py 8.1 KB

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