From 0240a09056ec58918691d7da97dec2e0d1294a26 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Tue, 1 May 2012 10:14:16 +0100 Subject: [PATCH] Cleaned up ValidationError Refs #459 --- AUTHORS | 3 ++- mongoengine/base.py | 11 +++++---- tests/document.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ tests/fields.py | 38 ------------------------------ 4 files changed, 65 insertions(+), 44 deletions(-) diff --git a/AUTHORS b/AUTHORS index 93631299..0dcc3ef9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -101,4 +101,5 @@ that much better: * Nils Hasenbanck * mostlystatic * Greg Banks - * swashbuckler \ No newline at end of file + * swashbuckler + * Adam Reeve \ No newline at end of file diff --git a/mongoengine/base.py b/mongoengine/base.py index 6007d3af..63d2a8f0 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -53,9 +53,9 @@ class ValidationError(AssertionError): message = super(ValidationError, self).__getattribute__(name) if name == 'message': if self.field_name: - message += ' ("%s")' % self.field_name + message = '%s ("%s")' % (message, self.field_name) if self.errors: - message += ':\n' + self._format_errors() + message = '%s:\n%s' % (message, self._format_errors()) return message def _get_message(self): @@ -94,12 +94,13 @@ class ValidationError(AssertionError): """Returns a string listing all errors within a document""" def format_error(field, value, prefix=''): + prefix = "%s.%s" % (prefix, field) if prefix else "%s" % field if isinstance(value, dict): - new_prefix = (prefix + '.' if prefix else '') + str(field) + return '\n'.join( - [format_error(k, value[k], new_prefix) for k in value]) + [format_error(k, value[k], prefix) for k in value]) else: - return (prefix + ": " if prefix else '') + str(value) + return "%s: %s" % (prefix, value) return '\n'.join( [format_error(k, v) for k, v in self.to_dict().items()]) diff --git a/tests/document.py b/tests/document.py index f27bb61d..54b0b97a 100644 --- a/tests/document.py +++ b/tests/document.py @@ -2861,5 +2861,62 @@ class DocumentTest(unittest.TestCase): } ) ]), "1,2") + +class ValidatorErrorTest(unittest.TestCase): + + def test_to_dict(self): + """Ensure a ValidationError handles error to_dict correctly. + """ + error = ValidationError('root') + self.assertEquals(error.to_dict(), {}) + + # 1st level error schema + error.errors = {'1st': ValidationError('bad 1st'), } + self.assertTrue('1st' in error.to_dict()) + self.assertEquals(error.to_dict()['1st'], 'bad 1st') + + # 2nd level error schema + error.errors = {'1st': ValidationError('bad 1st', errors={ + '2nd': ValidationError('bad 2nd'), + })} + self.assertTrue('1st' in error.to_dict()) + self.assertTrue(isinstance(error.to_dict()['1st'], dict)) + self.assertTrue('2nd' in error.to_dict()['1st']) + self.assertEquals(error.to_dict()['1st']['2nd'], 'bad 2nd') + + # moar levels + error.errors = {'1st': ValidationError('bad 1st', errors={ + '2nd': ValidationError('bad 2nd', errors={ + '3rd': ValidationError('bad 3rd', errors={ + '4th': ValidationError('Inception'), + }), + }), + })} + self.assertTrue('1st' in error.to_dict()) + self.assertTrue('2nd' in error.to_dict()['1st']) + self.assertTrue('3rd' in error.to_dict()['1st']['2nd']) + self.assertTrue('4th' in error.to_dict()['1st']['2nd']['3rd']) + self.assertEquals(error.to_dict()['1st']['2nd']['3rd']['4th'], + 'Inception') + + self.assertEquals(error.message, "root:\n1st.2nd.3rd.4th: Inception") + + def test_model_validation(self): + + class User(Document): + username = StringField(primary_key=True) + name = StringField(required=True) + + try: + User().validate() + except ValidationError, e: + expected_error_message = """Errors encountered validating document: +username: Field is required ("username") +name: Field is required ("name")""" + self.assertEquals(e.message, expected_error_message) + self.assertEquals(e.to_dict(), { + 'username': 'Field is required ("username")', + 'name': u'Field is required ("name")'}) + if __name__ == '__main__': unittest.main() diff --git a/tests/fields.py b/tests/fields.py index 85c1b385..81328f8e 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -1902,43 +1902,5 @@ class FieldTest(unittest.TestCase): post.validate() -class ValidatorErrorTest(unittest.TestCase): - - def test_to_dict(self): - """Ensure a ValidationError handles error to_dict correctly. - """ - error = ValidationError('root') - self.assertEquals(error.to_dict(), {}) - - # 1st level error schema - error.errors = {'1st': ValidationError('bad 1st'), } - self.assertTrue('1st' in error.to_dict()) - self.assertEquals(error.to_dict()['1st'], 'bad 1st') - - # 2nd level error schema - error.errors = {'1st': ValidationError('bad 1st', errors={ - '2nd': ValidationError('bad 2nd'), - })} - self.assertTrue('1st' in error.to_dict()) - self.assertTrue(isinstance(error.to_dict()['1st'], dict)) - self.assertTrue('2nd' in error.to_dict()['1st']) - self.assertEquals(error.to_dict()['1st']['2nd'], 'bad 2nd') - - # moar levels - error.errors = {'1st': ValidationError('bad 1st', errors={ - '2nd': ValidationError('bad 2nd', errors={ - '3rd': ValidationError('bad 3rd', errors={ - '4th': ValidationError('Inception'), - }), - }), - })} - self.assertTrue('1st' in error.to_dict()) - self.assertTrue('2nd' in error.to_dict()['1st']) - self.assertTrue('3rd' in error.to_dict()['1st']['2nd']) - self.assertTrue('4th' in error.to_dict()['1st']['2nd']['3rd']) - self.assertEquals(error.to_dict()['1st']['2nd']['3rd']['4th'], - 'Inception') - - if __name__ == '__main__': unittest.main()