From 15d5bab5124ff6baf8b2045a50dc2ba27c6714cd Mon Sep 17 00:00:00 2001
From: Antoine Lambert <antoine.lambert@inria.fr>
Date: Tue, 13 Apr 2021 12:43:48 +0200
Subject: [PATCH] identifiers: Fix some invalid ValidationError template string
 formats

Some ValidationError exceptions could not be serialized to string due
to these format errors.

Related to T3234
---
 swh/model/identifiers.py            |  6 +++---
 swh/model/tests/test_identifiers.py | 10 +++++++++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py
index c9f20dcb..537f1e3f 100644
--- a/swh/model/identifiers.py
+++ b/swh/model/identifiers.py
@@ -925,7 +925,7 @@ class _BaseSWHID(Generic[_TObjectType]):
             return cls(**parts)
         except ValueError as e:
             raise ValidationError(
-                "ValueError: %(args)", params={"args": e.args}
+                "ValueError: %(args)s", params={"args": e.args}
             ) from None
 
 
@@ -996,7 +996,7 @@ def _parse_lines_qualifier(
             return (int(lines), None)
     except ValueError:
         raise ValidationError(
-            "Invalid format for the lines qualifier: %(lines)", params={"lines": lines}
+            "Invalid format for the lines qualifier: %(lines)s", params={"lines": lines}
         )
 
 
@@ -1152,7 +1152,7 @@ class QualifiedSWHID(_BaseSWHID[ObjectType]):
         invalid_qualifiers = set(qualifiers) - SWHID_QUALIFIERS
         if invalid_qualifiers:
             raise ValidationError(
-                "Invalid qualifier(s): %(qualifiers)",
+                "Invalid qualifier(s): %(qualifiers)s",
                 params={"qualifiers": ", ".join(invalid_qualifiers)},
             )
         try:
diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py
index 3ba57086..99a23f5a 100644
--- a/swh/model/tests/test_identifiers.py
+++ b/swh/model/tests/test_identifiers.py
@@ -1241,6 +1241,12 @@ VALID_SWHIDS = [
         ),
         None,  # Neither does ExtendedSWHID
     ),
+    (
+        f"swh:1:cnt:{HASH};origin=https://github.com/python/cpython;lines=1-18/",
+        None,  # likewise
+        None,
+        None,  # likewise
+    ),
     (
         f"swh:1:cnt:{HASH};origin=https://github.com/python/cpython;lines=18",
         None,  # likewise
@@ -1298,8 +1304,10 @@ def test_parse_unparse_swhids(string, core, qualified, extended):
     for (cls, parsed_swhid) in zip(classes, [core, qualified, extended]):
         if parsed_swhid is None:
             # This class should not accept this SWHID
-            with pytest.raises(ValidationError):
+            with pytest.raises(ValidationError) as excinfo:
                 cls.from_string(string)
+            # Check string serialization for exception
+            assert str(excinfo.value) is not None
         else:
             # This class should
             assert cls.from_string(string) == parsed_swhid
-- 
GitLab