Parcourir la source

Get rid of docstring tests, fixes #5

Thomas Adamcik il y a 14 ans
Parent
commit
4706d988d4
2 fichiers modifiés avec 225 ajouts et 210 suppressions
  1. 9 210
      tests/models.py
  2. 216 0
      tests/tests.py

+ 9 - 210
tests/models.py

@@ -5,233 +5,32 @@ from django.db import models, connection, DEFAULT_DB_ALIAS
 from netfields import *
 
 class InetTestModel(models.Model):
-    '''
-    >>> cursor = connection.cursor()
-
-    >>> InetTestModel(inet='10.0.0.1').save()
-
-    >>> InetTestModel(inet=IP('10.0.0.1')).save()
-
-    >>> InetTestModel(inet='').save()
-    Traceback (most recent call last):
-        ...
-    IntegrityError: inet.inet may not be NULL
-
-    >>> InetTestModel(inet='az').save()
-    Traceback (most recent call last):
-        ...
-    ValueError: invalid literal for int() with base 10: 'az'
-
-    >>> InetTestModel(inet=None).save()
-    Traceback (most recent call last):
-        ...
-    IntegrityError: inet.inet may not be NULL
-
-    >>> InetTestModel().save()
-    Traceback (most recent call last):
-        ...
-    IntegrityError: inet.inet may not be NULL
-
-    >>> InetTestModel.objects.filter(inet='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" = %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__exact='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" = %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__iexact='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" = %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__net_contains='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" >> %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__in=['10.0.0.1', '10.0.0.2']).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" IN (%s, %s)', (u'10.0.0.1', u'10.0.0.2'))
-
-    >>> InetTestModel.objects.filter(inet__gt='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" > %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__gte='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" >= %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__lt='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" < %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__lte='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" <= %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__startswith='10.').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE HOST("inet"."inet") ILIKE %s ', (u'10.%',))
-
-    >>> InetTestModel.objects.filter(inet__istartswith='10.').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE HOST("inet"."inet") ILIKE %s ', (u'10.%',))
-
-    >>> InetTestModel.objects.filter(inet__endswith='.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE HOST("inet"."inet") ILIKE %s ', (u'%.1',))
-
-    >>> InetTestModel.objects.filter(inet__iendswith='.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE HOST("inet"."inet") ILIKE %s ', (u'%.1',))
-
-    >>> InetTestModel.objects.filter(inet__range=('10.0.0.1', '10.0.0.10')).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" BETWEEN %s and %s', (u'10.0.0.1', u'10.0.0.10'))
-
-    >>> InetTestModel.objects.filter(inet__year=1).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "year"
-
-    >>> InetTestModel.objects.filter(inet__month=1).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "month"
-
-    >>> InetTestModel.objects.filter(inet__day=1).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "day"
-
-    >>> InetTestModel.objects.filter(inet__isnull=True).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" IS NULL', ())
-
-    >>> InetTestModel.objects.filter(inet__isnull=False).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" IS NOT NULL', ())
-
-    >>> InetTestModel.objects.filter(inet__search='10').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "search"
-
-    >>> InetTestModel.objects.filter(inet__regex=u'10').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE HOST("inet"."inet") ~* %s ', (u'10',))
-
-    >>> InetTestModel.objects.filter(inet__iregex=u'10').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE HOST("inet"."inet") ~* %s ', (u'10',))
-
-    >>> InetTestModel.objects.filter(inet__net_contains_or_equals='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" >>= %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__net_contained='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" << %s ', (u'10.0.0.1',))
-
-    >>> InetTestModel.objects.filter(inet__net_contained_or_equal='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "inet"."id", "inet"."inet" FROM "inet" WHERE "inet"."inet" <<= %s ', (u'10.0.0.1',))
-    '''
-
-    inet = InetAddressField()
+    field = InetAddressField()
     objects = NetManager()
 
     class Meta:
         db_table = 'inet'
 
 class NullInetTestModel(models.Model):
-    '''
-    >>> NullInetTestModel(inet='10.0.0.1').save()
-
-    >>> NullInetTestModel(inet=IP('10.0.0.1')).save()
-
-    >>> NullInetTestModel(inet='').save()
-
-    >>> NullInetTestModel(inet=None).save()
-
-    >>> NullInetTestModel().save()
-    '''
-
-    inet = InetAddressField(null=True)
+    field = InetAddressField(null=True)
     objects = NetManager()
 
     class Meta:
         db_table = 'nullinet'
 
 class CidrTestModel(models.Model):
-    '''
-    >>> CidrTestModel.objects.filter(cidr='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" = %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__exact='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" = %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__iexact='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" = %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__net_contains='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" >> %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__in=['10.0.0.1', '10.0.0.2']).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" IN (%s, %s)', (u'10.0.0.1', u'10.0.0.2'))
-
-    >>> CidrTestModel.objects.filter(cidr__gt='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" > %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__gte='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" >= %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__lt='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" < %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__lte='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" <= %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__startswith='10.').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE TEXT("cidr"."cidr") ILIKE %s ', (u'10.%',))
-
-    >>> CidrTestModel.objects.filter(cidr__istartswith='10.').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE TEXT("cidr"."cidr") ILIKE %s ', (u'10.%',))
-
-    >>> CidrTestModel.objects.filter(cidr__endswith='.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE TEXT("cidr"."cidr") ILIKE %s ', (u'%.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__iendswith='.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE TEXT("cidr"."cidr") ILIKE %s ', (u'%.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__range=('10.0.0.1', '10.0.0.10')).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" BETWEEN %s and %s', (u'10.0.0.1', u'10.0.0.10'))
-
-    >>> CidrTestModel.objects.filter(cidr__year=1).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "year"
-
-    >>> CidrTestModel.objects.filter(cidr__month=1).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "month"
-
-    >>> CidrTestModel.objects.filter(cidr__day=1).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "day"
-
-    >>> CidrTestModel.objects.filter(cidr__isnull=True).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" IS NULL', ())
-
-    >>> CidrTestModel.objects.filter(cidr__isnull=False).query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" IS NOT NULL', ())
-
-    >>> CidrTestModel.objects.filter(cidr__search='10').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    Traceback (most recent call last):
-        ...
-    ValueError: Invalid lookup type "search"
-
-    >>> CidrTestModel.objects.filter(cidr__regex=u'10').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE TEXT("cidr"."cidr") ~* %s ', (u'10',))
-
-    >>> CidrTestModel.objects.filter(cidr__iregex=u'10').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE TEXT("cidr"."cidr") ~* %s ', (u'10',))
-
-    >>> CidrTestModel.objects.filter(cidr__net_contains_or_equals='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" >>= %s ', (u'10.0.0.1',))
-
-    >>> CidrTestModel.objects.filter(cidr__net_contained='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" << %s ', (u'10.0.0.1',))
+    field = CidrAddressField()
+    objects = NetManager()
 
-    >>> CidrTestModel.objects.filter(cidr__net_contained_or_equal='10.0.0.1').query.get_compiler(DEFAULT_DB_ALIAS).as_sql()
-    ('SELECT "cidr"."id", "cidr"."cidr" FROM "cidr" WHERE "cidr"."cidr" <<= %s ', (u'10.0.0.1',))
-    '''
+    class Meta:
+        db_table = 'cidr'
 
-    cidr = CidrAddressField()
+class NullCidrTestModel(models.Model):
+    field = CidrAddressField(null=True)
     objects = NetManager()
 
     class Meta:
-        db_table = 'cidr'
+        db_table = 'nullcidr'
 
 class MACTestModel(models.Model):
     mac = MACAddressField(null=True)

+ 216 - 0
tests/tests.py

@@ -0,0 +1,216 @@
+import unittest
+from IPy import IP
+
+from django.db import IntegrityError
+
+from models import *
+
+class BaseTestCase(object):
+    select = 'SELECT "table"."id", "table"."field" FROM "table" '
+
+    def assertSqlEquals(self, qs, sql):
+        sql = sql.replace('"table"', '"%s"' % self.table)
+        self.assertEqual(qs.query.get_compiler(qs.db).as_sql()[0], sql)
+
+    def assertSqlRaises(self, qs, error):
+        self.assertRaises(error, qs.query.get_compiler(qs.db).as_sql)
+
+    def test_init_with_blank(self):
+        self.model()
+
+    def test_init_with_text_fails(self):
+        self.assertRaises(ValueError, self.model, field='abc')
+
+    def test_save(self):
+        self.model(field='10.0.0.1').save()
+
+    def test_save_object(self):
+        self.model(field=IP('10.0.0.1')).save()
+
+    def test_equals_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field='10.0.0.1'),
+            self.select + 'WHERE "table"."field" = %s ')
+
+    def test_exact_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__exact='10.0.0.1'),
+            self.select + 'WHERE "table"."field" = %s ')
+
+    def test_iexact_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__iexact='10.0.0.1'),
+            self.select + 'WHERE "table"."field" = %s ')
+
+    def test_net_contains_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__net_contains='10.0.0.1'),
+            self.select + 'WHERE "table"."field" >> %s ')
+
+    def test_in_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__in=['10.0.0.1', '10.0.0.2']),
+            self.select + 'WHERE "table"."field" IN (%s, %s)')
+
+    def test_gt_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__gt='10.0.0.1'),
+            self.select + 'WHERE "table"."field" > %s ')
+
+    def test_gte_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__gte='10.0.0.1'),
+            self.select + 'WHERE "table"."field" >= %s ')
+
+    def test_lt_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__lt='10.0.0.1'),
+            self.select + 'WHERE "table"."field" < %s ')
+
+    def test_lte_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__lte='10.0.0.1'),
+            self.select + 'WHERE "table"."field" <= %s ')
+
+    def test_range_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__range=('10.0.0.1', '10.0.0.10')),
+            self.select + 'WHERE "table"."field" BETWEEN %s and %s')
+
+    def test_year_lookup_fails(self):
+        self.assertSqlRaises(self.qs.filter(field__year=1), ValueError)
+
+    def test_month_lookup_fails(self):
+        self.assertSqlRaises(self.qs.filter(field__month=1), ValueError)
+
+    def test_day_lookup_fails(self):
+        self.assertSqlRaises(self.qs.filter(field__day=1), ValueError)
+
+    def test_isnull_true_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__isnull=True),
+            self.select + 'WHERE "table"."field" IS NULL')
+
+    def test_isnull_false_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__isnull=False),
+            self.select + 'WHERE "table"."field" IS NOT NULL')
+
+    def test_search_lookup_fails(self):
+        self.assertSqlRaises(self.qs.filter(field__search='10'), ValueError)
+
+    def test_net_contains_or_equals(self):
+        self.assertSqlEquals(self.qs.filter(field__net_contains_or_equals='10.0.0.1'),
+            self.select + 'WHERE "table"."field" >>= %s ')
+
+    def test_net_contained(self):
+        self.assertSqlEquals(self.qs.filter(field__net_contained='10.0.0.1'),
+            self.select + 'WHERE "table"."field" << %s ')
+
+    def test_net_contained_or_equals(self):
+        self.assertSqlEquals(self.qs.filter(field__net_contained_or_equal='10.0.0.1'),
+            self.select + 'WHERE "table"."field" <<= %s ')
+
+
+class BaseInetFieldTestCase(BaseTestCase):
+    def test_startswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__startswith='10.'),
+            self.select + 'WHERE HOST("table"."field") ILIKE %s ')
+
+    def test_istartswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__istartswith='10.'),
+            self.select + 'WHERE HOST("table"."field") ILIKE %s ')
+
+    def test_endswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__endswith='.1'),
+            self.select + 'WHERE HOST("table"."field") ILIKE %s ')
+
+    def test_iendswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__iendswith='.1'),
+            self.select + 'WHERE HOST("table"."field") ILIKE %s ')
+
+    def test_regex_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__regex='10'),
+            self.select + 'WHERE HOST("table"."field") ~* %s ')
+
+    def test_iregex_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__iregex='10'),
+            self.select + 'WHERE HOST("table"."field") ~* %s ')
+
+
+class BaseCidrFieldTestCase(BaseTestCase):
+    def test_startswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__startswith='10.'),
+            self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
+
+    def test_istartswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__istartswith='10.'),
+            self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
+
+    def test_endswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__endswith='.1'),
+            self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
+
+    def test_iendswith_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__iendswith='.1'),
+            self.select + 'WHERE TEXT("table"."field") ILIKE %s ')
+
+    def test_regex_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__regex='10'),
+            self.select + 'WHERE TEXT("table"."field") ~* %s ')
+
+    def test_iregex_lookup(self):
+        self.assertSqlEquals(self.qs.filter(field__iregex='10'),
+            self.select + 'WHERE TEXT("table"."field") ~* %s ')
+
+
+class TestInetField(BaseInetFieldTestCase, unittest.TestCase):
+    def setUp(self):
+        self.model = InetTestModel
+        self.qs = self.model.objects.all()
+        self.table = 'inet'
+
+    def test_save_blank_fails(self):
+        self.assertRaises(IntegrityError, self.model(field='').save)
+
+    def test_save_none_fails(self):
+        self.assertRaises(IntegrityError, self.model(field=None).save)
+
+    def test_save_nothing_fails(self):
+        self.assertRaises(IntegrityError, self.model().save)
+
+
+class TestInetFieldNullable(BaseInetFieldTestCase, unittest.TestCase):
+    def setUp(self):
+        self.model = NullInetTestModel
+        self.qs = self.model.objects.all()
+        self.table = 'nullinet'
+
+    def test_save_blank(self):
+        self.model().save()
+
+    def test_save_none(self):
+        self.model(field=None).save()
+
+    def test_save_nothing_fails(self):
+        self.model().save()
+
+
+class TestCidrField(BaseCidrFieldTestCase, unittest.TestCase):
+    def setUp(self):
+        self.model = CidrTestModel
+        self.qs = self.model.objects.all()
+        self.table = 'cidr'
+
+    def test_save_blank_fails(self):
+        self.assertRaises(IntegrityError, self.model(field='').save)
+
+    def test_save_none_fails(self):
+        self.assertRaises(IntegrityError, self.model(field=None).save)
+
+    def test_save_nothing_fails(self):
+        self.assertRaises(IntegrityError, self.model().save)
+
+
+class TestCidrFieldNullable(BaseCidrFieldTestCase, unittest.TestCase):
+    def setUp(self):
+        self.model = NullCidrTestModel
+        self.qs = self.model.objects.all()
+        self.table = 'nullcidr'
+
+    def test_save_blank(self):
+        self.model().save()
+
+    def test_save_none(self):
+        self.model(field=None).save()
+
+    def test_save_nothing_fails(self):
+        self.model().save()