45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
# © 2026 TechnoLibre (http://www.technolibre.ca)
|
|||
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|||
|
|
|
|||
|
|
import unittest
|
|||
|
|
|
|||
|
|
from script.todo.mail.charset import decode_bytes
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestDecodeBytes(unittest.TestCase):
|
|||
|
|
def test_known_charset(self):
|
|||
|
|
self.assertEqual(decode_bytes("café".encode("utf-8"), "utf-8"), "café")
|
|||
|
|
|
|||
|
|
def test_missing_charset_falls_back_to_utf8(self):
|
|||
|
|
self.assertEqual(decode_bytes("café".encode("utf-8"), None), "café")
|
|||
|
|
|
|||
|
|
def test_empty_charset_falls_back_to_utf8(self):
|
|||
|
|
self.assertEqual(decode_bytes("café".encode("utf-8"), ""), "café")
|
|||
|
|
|
|||
|
|
def test_unknown_8bit_falls_back_to_utf8(self):
|
|||
|
|
"""La valeur réelle qui a fait tomber la synchro d'un dossier entier
|
|||
|
|
(voir `imap_transport.decode_header_value` et le rapport de tâche)."""
|
|||
|
|
self.assertEqual(
|
|||
|
|
decode_bytes("café".encode("utf-8"), "unknown-8bit"), "café"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
def test_charset_with_a_stray_quote_falls_back(self):
|
|||
|
|
self.assertEqual(
|
|||
|
|
decode_bytes("café".encode("utf-8"), 'unknown-8bit"'), "café"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
def test_bogus_charset_name_falls_back(self):
|
|||
|
|
self.assertEqual(
|
|||
|
|
decode_bytes("café".encode("utf-8"), "bogus-charset-xyz"), "café"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
def test_wrong_but_known_charset_replaces_undecodable_bytes(self):
|
|||
|
|
# ascii connu, mais incapable de décoder un octet accentué : c'est
|
|||
|
|
# `errors="replace"`, pas le repli `LookupError`, qui doit agir ici.
|
|||
|
|
self.assertIn("<EFBFBD>", decode_bytes(b"caf\xe9", "ascii"))
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
unittest.main()
|