diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/rest/helpers.py | 6 | ||||
| -rw-r--r-- | src/mailman/rest/tests/test_helpers.py | 33 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/mailman/rest/helpers.py b/src/mailman/rest/helpers.py index 9ab1f434e..a4b072408 100644 --- a/src/mailman/rest/helpers.py +++ b/src/mailman/rest/helpers.py @@ -23,6 +23,8 @@ import hashlib from contextlib import suppress from datetime import datetime, timedelta +from email.header import Header +from email.message import Message from enum import Enum from lazr.config import as_boolean from mailman import public @@ -49,6 +51,10 @@ class ExtendedEncoder(json.JSONEncoder): return obj.name elif isinstance(obj, bytes): return bytes_to_str(obj) + elif isinstance(obj, Message): + return obj.as_string() + elif isinstance(obj, Header): + return str(obj) return super().default(obj) diff --git a/src/mailman/rest/tests/test_helpers.py b/src/mailman/rest/tests/test_helpers.py index 982b97ef3..31ed8c88b 100644 --- a/src/mailman/rest/tests/test_helpers.py +++ b/src/mailman/rest/tests/test_helpers.py @@ -17,11 +17,14 @@ """Additional tests for helpers.""" +import json import unittest +from email.message import Message +from email.header import Header from datetime import timedelta from mailman.rest import helpers -from mailman.testing.layers import ConfigLayer +from mailman.testing.layers import ConfigLayer, RESTLayer class FakeResponse: @@ -74,3 +77,31 @@ class TestHelpers(unittest.TestCase): def test_json_encoding_default(self): resource = dict(interval=Unserializable()) self.assertRaises(TypeError, helpers.etag, resource) + + + +class TestJSONEncoder(unittest.TestCase): + """Test the JSON ExtendedEncoder.""" + + layer = RESTLayer + + def test_encode_message(self): + msg = Message() + msg['From'] = 'test@example.com' + msg.set_payload('Test content.') + try: + result = json.dumps(msg, cls=helpers.ExtendedEncoder) + except TypeError as e: + self.fail(e) + self.assertEqual(result, + json.dumps('From: test@example.com\n\nTest content.')) + + def test_encode_header(self): + value = 'Contains non-ascii \u00e9 \u00e7 \u00e0' + header = Header(value, charset='utf-8') + try: + result = json.dumps(Header(value, charset='utf-8'), + cls=helpers.ExtendedEncoder) + except TypeError as e: + self.fail(e) + self.assertEqual(result, json.dumps(value)) |
