From 2a5a7d155e33d5afedef61deeb90dd7e2f2a8a03 Mon Sep 17 00:00:00 2001
From: Nicolas Dandrimont <nicolas@dandrimont.eu>
Date: Tue, 24 Nov 2015 16:49:14 +0100
Subject: [PATCH] fields: make sure exceptions are printable

---
 swh/model/fields/compound.py            | 10 +++++-----
 swh/model/fields/simple.py              |  2 +-
 swh/model/tests/fields/test_compound.py |  9 +++++++++
 swh/model/tests/fields/test_hashes.py   |  8 ++++++++
 swh/model/tests/fields/test_simple.py   |  8 ++++++++
 5 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/swh/model/fields/compound.py b/swh/model/fields/compound.py
index 412ebdb1..00eb2525 100644
--- a/swh/model/fields/compound.py
+++ b/swh/model/fields/compound.py
@@ -104,7 +104,7 @@ def validate_all_keys(value, keys):
     if missing_keys:
         missing_fields = ', '.join(sorted(missing_keys))
         raise ValidationError(
-            'Missing mandatory fields %(missing_fields)',
+            'Missing mandatory fields %(missing_fields)s',
             params={'missing_fields': missing_fields},
             code='missing-mandatory-field'
         )
@@ -118,9 +118,9 @@ def validate_any_key(value, keys):
     if not present_keys:
         missing_fields = ', '.join(sorted(keys))
         raise ValidationError(
-                'Must contain one of the alternative fields %(missing_fields)',
-                params={'missing_fields': missing_fields},
-                code='missing-alternative-field',
-            )
+            'Must contain one of the alternative fields %(missing_fields)s',
+            params={'missing_fields': missing_fields},
+            code='missing-alternative-field',
+        )
 
     return True
diff --git a/swh/model/fields/simple.py b/swh/model/fields/simple.py
index 0f8b3057..30209978 100644
--- a/swh/model/fields/simple.py
+++ b/swh/model/fields/simple.py
@@ -69,7 +69,7 @@ def validate_enum(value, expected_values):
     """Validate that value is contained in expected_values"""
     if value not in expected_values:
         raise ValidationError(
-            'Unexpected value %(value)s, expected one of %(expected_values)',
+            'Unexpected value %(value)s, expected one of %(expected_values)s',
             params={
                 'value': value,
                 'expected_values': ', '.join(sorted(expected_values)),
diff --git a/swh/model/tests/fields/test_compound.py b/swh/model/tests/fields/test_compound.py
index db840a91..b6e13b6c 100644
--- a/swh/model/tests/fields/test_compound.py
+++ b/swh/model/tests/fields/test_compound.py
@@ -78,6 +78,7 @@ class ValidateCompound(unittest.TestCase):
             compound.validate_any_key(self.test_value, self.missing_keys)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'missing-alternative-field')
         self.assertEqual(exc.params['missing_fields'],
                          ', '.join(sorted(self.missing_keys)))
@@ -93,6 +94,7 @@ class ValidateCompound(unittest.TestCase):
             compound.validate_all_keys(self.test_value, self.missing_keys)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'missing-mandatory-field')
         self.assertEqual(exc.params['missing_fields'],
                          ', '.join(sorted(self.missing_keys)))
@@ -102,6 +104,7 @@ class ValidateCompound(unittest.TestCase):
                                        self.present_keys | self.missing_keys)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'missing-mandatory-field')
         self.assertEqual(exc.params['missing_fields'],
                          ', '.join(sorted(self.missing_keys)))
@@ -119,6 +122,7 @@ class ValidateCompound(unittest.TestCase):
                                              self.test_value_wrong_type)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'model-unexpected-type')
         self.assertEqual(exc.params['model'], self.test_model)
         self.assertEqual(exc.params['type'],
@@ -136,6 +140,7 @@ class ValidateCompound(unittest.TestCase):
         #     'mandatory_key2': [ValidationError('model-field-mandatory')],
         # })
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         for key in self.test_value_missing_keys:
             nested_key = exc.error_dict[key]
             self.assertIsInstance(nested_key, list)
@@ -155,6 +160,7 @@ class ValidateCompound(unittest.TestCase):
             )
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertNotIn(NON_FIELD_ERRORS, exc.error_dict)
 
     @istest
@@ -172,6 +178,7 @@ class ValidateCompound(unittest.TestCase):
         # })
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEquals(set(exc.error_dict.keys()), {NON_FIELD_ERRORS})
 
         non_field_errors = exc.error_dict[NON_FIELD_ERRORS]
@@ -196,6 +203,7 @@ class ValidateCompound(unittest.TestCase):
         # })
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEquals(set(exc.error_dict.keys()), {'str'})
 
         str_errors = exc.error_dict['str']
@@ -219,6 +227,7 @@ class ValidateCompound(unittest.TestCase):
         # })
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEquals(set(exc.error_dict.keys()), {'int'})
 
         int_errors = exc.error_dict['int']
diff --git a/swh/model/tests/fields/test_hashes.py b/swh/model/tests/fields/test_hashes.py
index b79678e5..0ef303f0 100644
--- a/swh/model/tests/fields/test_hashes.py
+++ b/swh/model/tests/fields/test_hashes.py
@@ -49,6 +49,7 @@ class ValidateHashes(unittest.TestCase):
             hashes.validate_hash(self.valid_str_hashes['sha1'], hash_type)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-hash-type')
         self.assertEqual(exc.params['hash_type'], hash_type)
 
@@ -63,6 +64,7 @@ class ValidateHashes(unittest.TestCase):
                 hashes.validate_hash(value, hash_type)
 
             exc = cm.exception
+            self.assertIsInstance(str(exc), str)
             self.assertEqual(exc.code, 'unexpected-hash-length')
             self.assertEqual(exc.params['hash_type'], hash_type)
             self.assertEqual(exc.params['length'], len(value))
@@ -78,6 +80,7 @@ class ValidateHashes(unittest.TestCase):
                 hashes.validate_hash(value, hash_type)
 
             exc = cm.exception
+            self.assertIsInstance(str(exc), str)
             self.assertEqual(exc.code, 'unexpected-hash-length')
             self.assertEqual(exc.params['hash_type'], hash_type)
             self.assertEqual(exc.params['length'], len(value))
@@ -93,6 +96,7 @@ class ValidateHashes(unittest.TestCase):
                 hashes.validate_hash(value, hash_type)
 
             exc = cm.exception
+            self.assertIsInstance(str(exc), str)
             self.assertEqual(exc.code, 'unexpected-hash-contents')
             self.assertEqual(exc.params['hash_type'], hash_type)
             self.assertEqual(exc.params['unexpected_chars'], '\xa2, \xc3')
@@ -107,6 +111,7 @@ class ValidateHashes(unittest.TestCase):
             hashes.validate_hash(self.bad_hash, 'sha1')
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-hash-value-type')
         self.assertEqual(exc.params['type'], self.bad_hash.__class__.__name__)
 
@@ -122,6 +127,7 @@ class ValidateHashes(unittest.TestCase):
             hashes.validate_sha1(self.bad_hash)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-hash-value-type')
         self.assertEqual(exc.params['type'], self.bad_hash.__class__.__name__)
 
@@ -136,6 +142,7 @@ class ValidateHashes(unittest.TestCase):
             hashes.validate_sha1_git(self.bad_hash)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-hash-value-type')
         self.assertEqual(exc.params['type'], self.bad_hash.__class__.__name__)
 
@@ -150,5 +157,6 @@ class ValidateHashes(unittest.TestCase):
             hashes.validate_sha256(self.bad_hash)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-hash-value-type')
         self.assertEqual(exc.params['type'], self.bad_hash.__class__.__name__)
diff --git a/swh/model/tests/fields/test_simple.py b/swh/model/tests/fields/test_simple.py
index 9af424f4..6fa2918d 100644
--- a/swh/model/tests/fields/test_simple.py
+++ b/swh/model/tests/fields/test_simple.py
@@ -39,6 +39,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_int(self.valid_str)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-type')
         self.assertEqual(exc.params['expected_type'], 'Integral')
         self.assertEqual(exc.params['type'], 'str')
@@ -53,6 +54,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_str(self.valid_int)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-type')
         self.assertEqual(exc.params['expected_type'], 'str')
         self.assertEqual(exc.params['type'], 'int')
@@ -61,6 +63,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_str(self.valid_bytes)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-type')
         self.assertEqual(exc.params['expected_type'], 'str')
         self.assertEqual(exc.params['type'], 'bytes')
@@ -75,6 +78,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_bytes(self.valid_int)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-type')
         self.assertEqual(exc.params['expected_type'], 'bytes')
         self.assertEqual(exc.params['type'], 'int')
@@ -83,6 +87,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_bytes(self.valid_str)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-type')
         self.assertEqual(exc.params['expected_type'], 'bytes')
         self.assertEqual(exc.params['type'], 'str')
@@ -99,6 +104,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_datetime(self.valid_str)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-type')
         self.assertEqual(exc.params['expected_type'], 'one of datetime, Real')
         self.assertEqual(exc.params['type'], 'str')
@@ -109,6 +115,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_datetime(self.invalid_datetime_notz)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'datetime-without-tzinfo')
 
     @istest
@@ -122,6 +129,7 @@ class ValidateSimple(unittest.TestCase):
             simple.validate_enum(self.invalid_enum_value, self.enum_values)
 
         exc = cm.exception
+        self.assertIsInstance(str(exc), str)
         self.assertEqual(exc.code, 'unexpected-value')
         self.assertEqual(exc.params['value'], self.invalid_enum_value)
         self.assertEqual(exc.params['expected_values'],
-- 
GitLab