tests.py 7.5 KB

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