Skip to content

Commit 6128db6

Browse files
Refactored Test Cases with additional models and Serializers
1 parent ec927c9 commit 6128db6

File tree

1 file changed

+60
-21
lines changed

1 file changed

+60
-21
lines changed

tests/test_model_serializer.py

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -412,29 +412,48 @@ class Meta:
412412
class TestGenericIPAddressFieldValidation(TestCase):
413413

414414
def setUp(self):
415-
class IPAddressFieldModel(models.Model):
416-
address = models.GenericIPAddressField()
415+
class IPv4Model(models.Model):
416+
address = models.GenericIPAddressField(protocol="IPv4")
417417

418-
class TestSerializer(serializers.ModelSerializer):
418+
class IPv4TestSerializer(serializers.ModelSerializer):
419+
class Meta:
420+
model = IPv4Model
421+
fields = '__all__'
422+
423+
class IPv6Model(models.Model):
424+
address = models.GenericIPAddressField(protocol="IPv6")
425+
426+
class IPv6TestSerializer(serializers.ModelSerializer):
427+
class Meta:
428+
model = IPv6Model
429+
fields = '__all__'
430+
431+
class BothProtocolsModel(models.Model):
432+
address = models.GenericIPAddressField(protocol="both")
433+
434+
class BothProtocolsTestSerializer(serializers.ModelSerializer):
419435
class Meta:
420-
model = IPAddressFieldModel
436+
model = BothProtocolsModel
421437
fields = '__all__'
422438

423-
self.serializer_class = TestSerializer
424-
self.model = IPAddressFieldModel
439+
self.ipv4_serializer = IPv4TestSerializer
440+
self.ipv4_model = IPv4Model
441+
self.ipv6_serializer = IPv6TestSerializer
442+
self.ipv6_model = IPv6Model
443+
self.both_protocols_serializer = BothProtocolsTestSerializer
444+
self.both_protocols_model = BothProtocolsModel
425445

426446
def test_ip_address_validation(self):
427-
s = self.serializer_class(data={'address': 'not an ip address'})
447+
s = self.both_protocols_serializer(data={'address': 'not an ip address'})
428448
self.assertFalse(s.is_valid())
429449
self.assertEqual(1, len(s.errors['address']),
430450
'Unexpected number of validation errors: '
431451
'{}'.format(s.errors))
432452

433453
def test_invalid_ipv4_for_ipv4_field(self):
434454
"""Test that an invalid IPv4 raises only an IPv4-related error."""
435-
self.model._meta.get_field("address").protocol = "IPv4" # Set field to IPv4 only
436455
invalid_data = {"address": "invalid-ip"}
437-
serializer = self.serializer_class(data=invalid_data)
456+
serializer = self.ipv4_serializer(data=invalid_data)
438457

439458
with self.assertRaises(ValidationError) as context:
440459
serializer.is_valid(raise_exception=True)
@@ -446,9 +465,34 @@ def test_invalid_ipv4_for_ipv4_field(self):
446465

447466
def test_invalid_ipv6_for_ipv6_field(self):
448467
"""Test that an invalid IPv6 raises only an IPv6-related error."""
449-
self.model._meta.get_field("address").protocol = "IPv6" # Set field to IPv6 only
450468
invalid_data = {"address": "invalid-ip"}
451-
serializer = self.serializer_class(data=invalid_data)
469+
serializer = self.ipv6_serializer(data=invalid_data)
470+
471+
with self.assertRaises(ValidationError) as context:
472+
serializer.is_valid(raise_exception=True)
473+
474+
self.assertEqual(
475+
str(context.exception.detail["address"][0]),
476+
"Enter a valid IPv6 address."
477+
)
478+
479+
def test_invalid_ipv6_message_v1(self):
480+
"""Test that an invalid IPv6 raises error message when data contains ':' in it."""
481+
invalid_data = {"address": "invalid : data"}
482+
serializer = self.ipv6_serializer(data=invalid_data)
483+
484+
with self.assertRaises(ValidationError) as context:
485+
serializer.is_valid(raise_exception=True)
486+
487+
self.assertEqual(
488+
str(context.exception.detail["address"][0]),
489+
"Enter a valid IPv4 or IPv6 address."
490+
)
491+
492+
def test_invalid_ipv6_message_v2(self):
493+
"""Test that an invalid IPv6 raises error message when data doesn't contains ':' in it."""
494+
invalid_data = {"address": "invalid-ip"}
495+
serializer = self.ipv6_serializer(data=invalid_data)
452496

453497
with self.assertRaises(ValidationError) as context:
454498
serializer.is_valid(raise_exception=True)
@@ -460,9 +504,8 @@ def test_invalid_ipv6_for_ipv6_field(self):
460504

461505
def test_invalid_both_protocol(self):
462506
"""Test that an invalid IP raises a combined error message when protocol is both."""
463-
self.model._meta.get_field("address").protocol = "both" # Allow both IPv4 & IPv6
464507
invalid_data = {"address": "invalid-ip"}
465-
serializer = self.serializer_class(data=invalid_data)
508+
serializer = self.both_protocols_serializer(data=invalid_data)
466509

467510
with self.assertRaises(ValidationError) as context:
468511
serializer.is_valid(raise_exception=True)
@@ -474,30 +517,26 @@ def test_invalid_both_protocol(self):
474517

475518
def test_valid_ipv4(self):
476519
"""Test that a valid IPv4 passes validation."""
477-
self.model._meta.get_field("address").protocol = "IPv4"
478520
valid_data = {"address": "192.168.1.1"}
479-
serializer = self.serializer_class(data=valid_data)
521+
serializer = self.ipv4_serializer(data=valid_data)
480522
self.assertTrue(serializer.is_valid())
481523

482524
def test_valid_ipv6(self):
483525
"""Test that a valid IPv6 passes validation."""
484-
self.model._meta.get_field("address").protocol = "IPv6"
485526
valid_data = {"address": "2001:db8::ff00:42:8329"}
486-
serializer = self.serializer_class(data=valid_data)
527+
serializer = self.ipv6_serializer(data=valid_data)
487528
self.assertTrue(serializer.is_valid())
488529

489530
def test_valid_ipv4_for_both_protocol(self):
490531
"""Test that a valid IPv4 is accepted when protocol is 'both'."""
491-
self.model._meta.get_field("address").protocol = "both"
492532
valid_data = {"address": "192.168.1.1"}
493-
serializer = self.serializer_class(data=valid_data)
533+
serializer = self.both_protocols_serializer(data=valid_data)
494534
self.assertTrue(serializer.is_valid())
495535

496536
def test_valid_ipv6_for_both_protocol(self):
497537
"""Test that a valid IPv6 is accepted when protocol is 'both'."""
498-
self.model._meta.get_field("address").protocol = "both"
499538
valid_data = {"address": "2001:db8::ff00:42:8329"}
500-
serializer = self.serializer_class(data=valid_data)
539+
serializer = self.both_protocols_serializer(data=valid_data)
501540
self.assertTrue(serializer.is_valid())
502541

503542

0 commit comments

Comments
 (0)