import unittest from unittest import mock from django.core.exceptions import ValidationError class TestValidationError(unittest.TestCase): def test_messages_concatenates_error_dict_values(self): message_dict = {} exception = ValidationError(message_dict) self.assertEqual(sorted(exception.messages), []) message_dict["field1"] = ["E1", "E2"] exception = ValidationError(message_dict) self.assertEqual(sorted(exception.messages), ["E1", "E2"]) message_dict["field2"] = ["E3", "E4"] exception = ValidationError(message_dict) self.assertEqual(sorted(exception.messages), ["E1", "E2", "E3", "E4"]) def test_eq(self): error1 = ValidationError("message") error2 = ValidationError("message", code="my_code1") error3 = ValidationError("message", code="my_code2") error4 = ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm1": "val1", "parm2": "val2"}, ) error5 = ValidationError({"field1": "message", "field2": "other"}) error6 = ValidationError({"field1": "message"}) error7 = ValidationError( [ ValidationError({"field1": "field error", "field2": "other"}), "message", ] ) self.assertEqual(error1, ValidationError("message")) self.assertNotEqual(error1, ValidationError("message2")) self.assertNotEqual(error1, error2) self.assertNotEqual(error1, error4) self.assertNotEqual(error1, error5) self.assertNotEqual(error1, error6) self.assertNotEqual(error1, error7) self.assertEqual(error1, mock.ANY) self.assertEqual(error2, ValidationError("message", code="my_code1")) self.assertNotEqual(error2, ValidationError("other", code="my_code1")) self.assertNotEqual(error2, error3) self.assertNotEqual(error2, error4) self.assertNotEqual(error2, error5) self.assertNotEqual(error2, error6) self.assertNotEqual(error2, error7) self.assertEqual( error4, ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm1": "val1", "parm2": "val2"}, ), ) self.assertNotEqual( error4, ValidationError( "error %(parm1)s %(parm2)s", code="my_code2", params={"parm1": "val1", "parm2": "val2"}, ), ) self.assertNotEqual( error4, ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm2": "val2"}, ), ) self.assertNotEqual( error4, ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm2": "val1", "parm1": "val2"}, ), ) self.assertNotEqual( error4, ValidationError( "error val1 val2", code="my_code1", ), ) # params ordering is ignored. self.assertEqual( error4, ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm2": "val2", "parm1": "val1"}, ), ) self.assertEqual( error5, ValidationError({"field1": "message", "field2": "other"}), ) self.assertNotEqual( error5, ValidationError({"field1": "message", "field2": "other2"}), ) self.assertNotEqual( error5, ValidationError({"field1": "message", "field3": "other"}), ) self.assertNotEqual(error5, error6) # fields ordering is ignored. self.assertEqual( error5, ValidationError({"field2": "other", "field1": "message"}), ) self.assertNotEqual(error7, ValidationError(error7.error_list[1:])) self.assertNotEqual( ValidationError(["message"]), ValidationError([ValidationError("message", code="my_code")]), ) # messages ordering is ignored. self.assertEqual( error7, ValidationError(list(reversed(error7.error_list))), ) self.assertNotEqual(error4, ValidationError([error4])) self.assertNotEqual(ValidationError([error4]), error4) self.assertNotEqual(error4, ValidationError({"field1": error4})) self.assertNotEqual(ValidationError({"field1": error4}), error4) def test_eq_nested(self): error_dict = { "field1": ValidationError( "error %(parm1)s %(parm2)s", code="my_code", params={"parm1": "val1", "parm2": "val2"}, ), "field2": "other", } error = ValidationError(error_dict) self.assertEqual(error, ValidationError(dict(error_dict))) self.assertEqual( error, ValidationError( { "field1": ValidationError( "error %(parm1)s %(parm2)s", code="my_code", params={"parm2": "val2", "parm1": "val1"}, ), "field2": "other", } ), ) self.assertNotEqual( error, ValidationError( {**error_dict, "field2": "message"}, ), ) self.assertNotEqual( error, ValidationError( { "field1": ValidationError( "error %(parm1)s val2", code="my_code", params={"parm1": "val1"}, ), "field2": "other", } ), ) def test_hash(self): error1 = ValidationError("message") error2 = ValidationError("message", code="my_code1") error3 = ValidationError("message", code="my_code2") error4 = ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm1": "val1", "parm2": "val2"}, ) error5 = ValidationError({"field1": "message", "field2": "other"}) error6 = ValidationError({"field1": "message"}) error7 = ValidationError( [ ValidationError({"field1": "field error", "field2": "other"}), "message", ] ) self.assertEqual(hash(error1), hash(ValidationError("message"))) self.assertNotEqual(hash(error1), hash(ValidationError("message2"))) self.assertNotEqual(hash(error1), hash(error2)) self.assertNotEqual(hash(error1), hash(error4)) self.assertNotEqual(hash(error1), hash(error5)) self.assertNotEqual(hash(error1), hash(error6)) self.assertNotEqual(hash(error1), hash(error7)) self.assertEqual( hash(error2), hash(ValidationError("message", code="my_code1")), ) self.assertNotEqual( hash(error2), hash(ValidationError("other", code="my_code1")), ) self.assertNotEqual(hash(error2), hash(error3)) self.assertNotEqual(hash(error2), hash(error4)) self.assertNotEqual(hash(error2), hash(error5)) self.assertNotEqual(hash(error2), hash(error6)) self.assertNotEqual(hash(error2), hash(error7)) self.assertEqual( hash(error4), hash( ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm1": "val1", "parm2": "val2"}, ) ), ) self.assertNotEqual( hash(error4), hash( ValidationError( "error %(parm1)s %(parm2)s", code="my_code2", params={"parm1": "val1", "parm2": "val2"}, ) ), ) self.assertNotEqual( hash(error4), hash( ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm2": "val2"}, ) ), ) self.assertNotEqual( hash(error4), hash( ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm2": "val1", "parm1": "val2"}, ) ), ) self.assertNotEqual( hash(error4), hash( ValidationError( "error val1 val2", code="my_code1", ) ), ) # params ordering is ignored. self.assertEqual( hash(error4), hash( ValidationError( "error %(parm1)s %(parm2)s", code="my_code1", params={"parm2": "val2", "parm1": "val1"}, ) ), ) self.assertEqual( hash(error5), hash(ValidationError({"field1": "message", "field2": "other"})), ) self.assertNotEqual( hash(error5), hash(ValidationError({"field1": "message", "field2": "other2"})), ) self.assertNotEqual( hash(error5), hash(ValidationError({"field1": "message", "field3": "other"})), ) self.assertNotEqual(error5, error6) # fields ordering is ignored. self.assertEqual( hash(error5), hash(ValidationError({"field2": "other", "field1": "message"})), ) self.assertNotEqual( hash(error7), hash(ValidationError(error7.error_list[1:])), ) self.assertNotEqual( hash(ValidationError(["message"])), hash(ValidationError([ValidationError("message", code="my_code")])), ) # messages ordering is ignored. self.assertEqual( hash(error7), hash(ValidationError(list(reversed(error7.error_list)))), ) self.assertNotEqual(hash(error4), hash(ValidationError([error4]))) self.assertNotEqual(hash(ValidationError([error4])), hash(error4)) self.assertNotEqual( hash(error4), hash(ValidationError({"field1": error4})), ) def test_hash_nested(self): error_dict = { "field1": ValidationError( "error %(parm1)s %(parm2)s", code="my_code", params={"parm2": "val2", "parm1": "val1"}, ), "field2": "other", } error = ValidationError(error_dict) self.assertEqual(hash(error), hash(ValidationError(dict(error_dict)))) self.assertEqual( hash(error), hash( ValidationError( { "field1": ValidationError( "error %(parm1)s %(parm2)s", code="my_code", params={"parm1": "val1", "parm2": "val2"}, ), "field2": "other", } ) ), ) self.assertNotEqual( hash(error), hash( ValidationError( {**error_dict, "field2": "message"}, ) ), ) self.assertNotEqual( hash(error), hash( ValidationError( { "field1": ValidationError( "error %(parm1)s val2", code="my_code", params={"parm1": "val1"}, ), "field2": "other", } ) ), )