@@ -412,29 +412,48 @@ class Meta:
412412class 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