tests.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. from IPy import IP
  2. from netaddr import EUI
  3. from django.db import IntegrityError
  4. from django.forms import ModelForm
  5. from django.test import TestCase
  6. from netfields.models import (CidrTestModel, InetTestModel, NullCidrTestModel,
  7. NullInetTestModel, MACTestModel)
  8. from netfields.mac import mac_unix_common
  9. class BaseSqlTestCase(object):
  10. select = 'SELECT "table"."id", "table"."field" FROM "table" '
  11. def assertSqlEquals(self, qs, sql):
  12. sql = sql.replace('"table"', '"%s"' % self.table)
  13. self.assertEqual(qs.query.get_compiler(qs.db).as_sql()[0], sql)
  14. def assertSqlRaises(self, qs, error):
  15. self.assertRaises(error, qs.query.get_compiler(qs.db).as_sql)
  16. def test_init_with_blank(self):
  17. self.model()
  18. def test_isnull_true_lookup(self):
  19. self.assertSqlEquals(self.qs.filter(field__isnull=True),
  20. self.select + 'WHERE "table"."field" IS NULL')
  21. def test_isnull_false_lookup(self):
  22. self.assertSqlEquals(self.qs.filter(field__isnull=False),
  23. self.select + 'WHERE "table"."field" IS NOT NULL')
  24. def test_save(self):
  25. self.model(field=self.value1).save()
  26. def test_equals_lookup(self):
  27. self.assertSqlEquals(self.qs.filter(field=self.value1),
  28. self.select + 'WHERE "table"."field" = %s ')
  29. def test_exact_lookup(self):
  30. self.assertSqlEquals(self.qs.filter(field__exact=self.value1),
  31. self.select + 'WHERE "table"."field" = %s ')
  32. def test_in_lookup(self):
  33. self.assertSqlEquals(self.qs.filter(field__in=[self.value1, self.value2]),
  34. self.select + 'WHERE "table"."field" IN (%s, %s)')
  35. def test_gt_lookup(self):
  36. self.assertSqlEquals(self.qs.filter(field__gt=self.value1),
  37. self.select + 'WHERE "table"."field" > %s ')
  38. def test_gte_lookup(self):
  39. self.assertSqlEquals(self.qs.filter(field__gte=self.value1),
  40. self.select + 'WHERE "table"."field" >= %s ')
  41. def test_lt_lookup(self):
  42. self.assertSqlEquals(self.qs.filter(field__lt=self.value1),
  43. self.select + 'WHERE "table"."field" < %s ')
  44. def test_lte_lookup(self):
  45. self.assertSqlEquals(self.qs.filter(field__lte=self.value1),
  46. self.select + 'WHERE "table"."field" <= %s ')
  47. def test_range_lookup(self):
  48. self.assertSqlEquals(self.qs.filter(field__range=(self.value1, self.value3)),
  49. self.select + 'WHERE "table"."field" BETWEEN %s and %s')
  50. class BaseInetTestCase(BaseSqlTestCase):
  51. value1 = '10.0.0.1'
  52. value2 = '10.0.0.2'
  53. value3 = '10.0.0.10'
  54. def test_save_object(self):
  55. self.model(field=IP(self.value1)).save()
  56. def test_init_with_text_fails(self):
  57. self.assertRaises(ValueError, self.model, field='abc')
  58. def test_iexact_lookup(self):
  59. self.assertSqlEquals(self.qs.filter(field__iexact=self.value1),
  60. self.select + 'WHERE "table"."field" = %s ')
  61. def test_search_lookup_fails(self):
  62. self.assertSqlRaises(self.qs.filter(field__search='10'), ValueError)
  63. def test_year_lookup_fails(self):
  64. self.assertSqlRaises(self.qs.filter(field__year=1), ValueError)
  65. def test_month_lookup_fails(self):
  66. self.assertSqlRaises(self.qs.filter(field__month=1), ValueError)
  67. def test_day_lookup_fails(self):
  68. self.assertSqlRaises(self.qs.filter(field__day=1), ValueError)
  69. def test_net_contains_lookup(self):
  70. self.assertSqlEquals(self.qs.filter(field__net_contains='10.0.0.1'),
  71. self.select + 'WHERE "table"."field" >> %s ')
  72. def test_net_contains_or_equals(self):
  73. self.assertSqlEquals(self.qs.filter(field__net_contains_or_equals='10.0.0.1'),
  74. self.select + 'WHERE "table"."field" >>= %s ')
  75. def test_net_contained(self):
  76. self.assertSqlEquals(self.qs.filter(field__net_contained='10.0.0.1'),
  77. self.select + 'WHERE "table"."field" << %s ')
  78. def test_net_contained_or_equals(self):
  79. self.assertSqlEquals(self.qs.filter(field__net_contained_or_equal='10.0.0.1'),
  80. self.select + 'WHERE "table"."field" <<= %s ')
  81. class BaseInetFieldTestCase(BaseInetTestCase):
  82. def test_startswith_lookup(self):
  83. self.assertSqlEquals(self.qs.filter(field__startswith='10.'),
  84. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  85. def test_istartswith_lookup(self):
  86. self.assertSqlEquals(self.qs.filter(field__istartswith='10.'),
  87. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  88. def test_endswith_lookup(self):
  89. self.assertSqlEquals(self.qs.filter(field__endswith='.1'),
  90. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  91. def test_iendswith_lookup(self):
  92. self.assertSqlEquals(self.qs.filter(field__iendswith='.1'),
  93. self.select + 'WHERE HOST("table"."field") ILIKE %s ')
  94. def test_regex_lookup(self):
  95. self.assertSqlEquals(self.qs.filter(field__regex='10'),
  96. self.select + 'WHERE HOST("table"."field") ~* %s ')
  97. def test_iregex_lookup(self):
  98. self.assertSqlEquals(self.qs.filter(field__iregex='10'),
  99. self.select + 'WHERE HOST("table"."field") ~* %s ')
  100. class BaseCidrFieldTestCase(BaseInetTestCase):
  101. def test_startswith_lookup(self):
  102. self.assertSqlEquals(self.qs.filter(field__startswith='10.'),
  103. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  104. def test_istartswith_lookup(self):
  105. self.assertSqlEquals(self.qs.filter(field__istartswith='10.'),
  106. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  107. def test_endswith_lookup(self):
  108. self.assertSqlEquals(self.qs.filter(field__endswith='.1'),
  109. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  110. def test_iendswith_lookup(self):
  111. self.assertSqlEquals(self.qs.filter(field__iendswith='.1'),
  112. self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
  113. def test_regex_lookup(self):
  114. self.assertSqlEquals(self.qs.filter(field__regex='10'),
  115. self.select + 'WHERE TEXT("table"."field") ~* %s ')
  116. def test_iregex_lookup(self):
  117. self.assertSqlEquals(self.qs.filter(field__iregex='10'),
  118. self.select + 'WHERE TEXT("table"."field") ~* %s ')
  119. class TestInetField(BaseInetFieldTestCase, TestCase):
  120. def setUp(self):
  121. self.model = InetTestModel
  122. self.qs = self.model.objects.all()
  123. self.table = 'inet'
  124. def test_save_blank_fails(self):
  125. self.assertRaises(IntegrityError, self.model(field='').save)
  126. def test_save_none_fails(self):
  127. self.assertRaises(IntegrityError, self.model(field=None).save)
  128. def test_save_nothing_fails(self):
  129. self.assertRaises(IntegrityError, self.model().save)
  130. class TestInetFieldNullable(BaseInetFieldTestCase, TestCase):
  131. def setUp(self):
  132. self.model = NullInetTestModel
  133. self.qs = self.model.objects.all()
  134. self.table = 'nullinet'
  135. def test_save_blank(self):
  136. self.model().save()
  137. def test_save_none(self):
  138. self.model(field=None).save()
  139. def test_save_nothing_fails(self):
  140. self.model().save()
  141. class TestCidrField(BaseCidrFieldTestCase, TestCase):
  142. def setUp(self):
  143. self.model = CidrTestModel
  144. self.qs = self.model.objects.all()
  145. self.table = 'cidr'
  146. def test_save_blank_fails(self):
  147. self.assertRaises(IntegrityError, self.model(field='').save)
  148. def test_save_none_fails(self):
  149. self.assertRaises(IntegrityError, self.model(field=None).save)
  150. def test_save_nothing_fails(self):
  151. self.assertRaises(IntegrityError, self.model().save)
  152. class TestCidrFieldNullable(BaseCidrFieldTestCase, TestCase):
  153. def setUp(self):
  154. self.model = NullCidrTestModel
  155. self.qs = self.model.objects.all()
  156. self.table = 'nullcidr'
  157. def test_save_blank(self):
  158. self.model().save()
  159. def test_save_none(self):
  160. self.model(field=None).save()
  161. def test_save_nothing_fails(self):
  162. self.model().save()
  163. class InetTestModelForm(ModelForm):
  164. class Meta:
  165. model = InetTestModel
  166. class TestNetAddressFormField(TestCase):
  167. def test_form_ipv4_valid(self):
  168. form = InetTestModelForm({'field': '10.0.0.1'})
  169. self.assertTrue(form.is_valid())
  170. self.assertEqual(form.cleaned_data['field'], IP('10.0.0.1'))
  171. def test_form_ipv4_invalid(self):
  172. form = InetTestModelForm({'field': '10.0.0.1.2'})
  173. self.assertFalse(form.is_valid())
  174. def test_form_ipv6(self):
  175. form = InetTestModelForm({'field': '2001:0:1::2'})
  176. self.assertTrue(form.is_valid())
  177. self.assertEqual(form.cleaned_data['field'], IP('2001:0:1::2'))
  178. def test_form_ipv6_invalid(self):
  179. form = InetTestModelForm({'field': '2001:0::1::2'})
  180. self.assertFalse(form.is_valid())
  181. class BaseMacTestCase(BaseSqlTestCase):
  182. value1 = '00:aa:2b:c3:dd:44'
  183. value2 = '00:aa:2b:c3:dd:45'
  184. value3 = '00:aa:2b:c3:dd:ff'
  185. def test_save_object(self):
  186. self.model(field=EUI(self.value1)).save()
  187. def test_iexact_lookup(self):
  188. self.assertSqlEquals(self.qs.filter(field__iexact=self.value1),
  189. self.select + 'WHERE UPPER("table"."field"::text) = UPPER(%s) ')
  190. def test_startswith_lookup(self):
  191. self.assertSqlEquals(self.qs.filter(field__startswith='00:'),
  192. self.select + 'WHERE "table"."field"::text LIKE %s ')
  193. def test_istartswith_lookup(self):
  194. self.assertSqlEquals(self.qs.filter(field__istartswith='00:'),
  195. self.select + 'WHERE UPPER("table"."field"::text) LIKE UPPER(%s) ')
  196. def test_endswith_lookup(self):
  197. self.assertSqlEquals(self.qs.filter(field__endswith=':ff'),
  198. self.select + 'WHERE "table"."field"::text LIKE %s ')
  199. def test_iendswith_lookup(self):
  200. self.assertSqlEquals(self.qs.filter(field__iendswith=':ff'),
  201. self.select + 'WHERE UPPER("table"."field"::text) LIKE UPPER(%s) ')
  202. def test_regex_lookup(self):
  203. self.assertSqlEquals(self.qs.filter(field__regex='00'),
  204. self.select + 'WHERE "table"."field" ~ %s ')
  205. def test_iregex_lookup(self):
  206. self.assertSqlEquals(self.qs.filter(field__iregex='00'),
  207. self.select + 'WHERE "table"."field" ~* %s ')
  208. class TestMacAddressField(BaseMacTestCase, TestCase):
  209. def setUp(self):
  210. self.model = MACTestModel
  211. self.qs = self.model.objects.all()
  212. self.table = 'mac'
  213. def test_save_blank(self):
  214. self.model().save()
  215. def test_save_none(self):
  216. self.model(field=None).save()
  217. def test_save_nothing_fails(self):
  218. self.model().save()
  219. class MacAddressTestModelForm(ModelForm):
  220. class Meta:
  221. model = MACTestModel
  222. class TestMacAddressFormField(TestCase):
  223. def setUp(self):
  224. self.mac = EUI('00:aa:2b:c3:dd:44', dialect=mac_unix_common)
  225. def test_unix(self):
  226. form = MacAddressTestModelForm({'field': '0:AA:2b:c3:dd:44'})
  227. self.assertTrue(form.is_valid())
  228. self.assertEqual(form.cleaned_data['field'], self.mac)
  229. def test_unix_common(self):
  230. form = MacAddressTestModelForm({'field': '00:aa:2b:c3:dd:44'})
  231. self.assertTrue(form.is_valid())
  232. self.assertEqual(form.cleaned_data['field'], self.mac)
  233. def test_eui48(self):
  234. form = MacAddressTestModelForm({'field': '00-AA-2B-C3-DD-44'})
  235. self.assertTrue(form.is_valid())
  236. self.assertEqual(form.cleaned_data['field'], self.mac)
  237. def test_cisco(self):
  238. form = MacAddressTestModelForm({'field': '00aa.2bc3.dd44'})
  239. self.assertTrue(form.is_valid())
  240. self.assertEqual(form.cleaned_data['field'], self.mac)
  241. def test_24bit_colon(self):
  242. form = MacAddressTestModelForm({'field': '00aa2b:c3dd44'})
  243. self.assertTrue(form.is_valid())
  244. self.assertEqual(form.cleaned_data['field'], self.mac)
  245. def test_24bit_hyphen(self):
  246. form = MacAddressTestModelForm({'field': '00aa2b-c3dd44'})
  247. self.assertTrue(form.is_valid())
  248. self.assertEqual(form.cleaned_data['field'], self.mac)
  249. def test_bare(self):
  250. form = MacAddressTestModelForm({'field': '00aa2b:c3dd44'})
  251. self.assertTrue(form.is_valid())
  252. self.assertEqual(form.cleaned_data['field'], self.mac)
  253. def test_invalid(self):
  254. form = MacAddressTestModelForm({'field': 'notvalid'})
  255. self.assertFalse(form.is_valid())