|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +import email.message |
| 4 | +import inspect |
1 | 5 | import pathlib |
| 6 | +import textwrap |
2 | 7 |
|
3 | 8 | import pytest |
4 | 9 |
|
@@ -916,3 +921,166 @@ def test_modern_license(self): |
916 | 921 | ] |
917 | 922 |
|
918 | 923 | assert core_metadata.get_payload() is None |
| 924 | + |
| 925 | + @pytest.mark.parametrize( |
| 926 | + ("items", "data"), |
| 927 | + [ |
| 928 | + pytest.param( |
| 929 | + [], |
| 930 | + "", |
| 931 | + id="empty", |
| 932 | + ), |
| 933 | + pytest.param( |
| 934 | + [ |
| 935 | + ("Foo", "Bar"), |
| 936 | + ], |
| 937 | + "Foo: Bar\n", |
| 938 | + id="simple", |
| 939 | + ), |
| 940 | + pytest.param( |
| 941 | + [ |
| 942 | + ("Foo", "Bar"), |
| 943 | + ("Foo2", "Bar2"), |
| 944 | + ], |
| 945 | + """\ |
| 946 | + Foo: Bar |
| 947 | + Foo2: Bar2 |
| 948 | + """, |
| 949 | + id="multiple", |
| 950 | + ), |
| 951 | + pytest.param( |
| 952 | + [ |
| 953 | + ("Foo", "Unicøde"), |
| 954 | + ], |
| 955 | + "Foo: Unicøde\n", |
| 956 | + id="unicode", |
| 957 | + ), |
| 958 | + pytest.param( |
| 959 | + [ |
| 960 | + ("Foo", "🕵️"), |
| 961 | + ], |
| 962 | + "Foo: 🕵️\n", |
| 963 | + id="emoji", |
| 964 | + ), |
| 965 | + pytest.param( |
| 966 | + [ |
| 967 | + ("Item", None), |
| 968 | + ], |
| 969 | + "", |
| 970 | + id="none", |
| 971 | + ), |
| 972 | + pytest.param( |
| 973 | + [ |
| 974 | + ("ItemA", "ValueA"), |
| 975 | + ("ItemB", "ValueB"), |
| 976 | + ("ItemC", "ValueC"), |
| 977 | + ], |
| 978 | + """\ |
| 979 | + ItemA: ValueA |
| 980 | + ItemB: ValueB |
| 981 | + ItemC: ValueC |
| 982 | + """, |
| 983 | + id="order 1", |
| 984 | + ), |
| 985 | + pytest.param( |
| 986 | + [ |
| 987 | + ("ItemB", "ValueB"), |
| 988 | + ("ItemC", "ValueC"), |
| 989 | + ("ItemA", "ValueA"), |
| 990 | + ], |
| 991 | + """\ |
| 992 | + ItemB: ValueB |
| 993 | + ItemC: ValueC |
| 994 | + ItemA: ValueA |
| 995 | + """, |
| 996 | + id="order 2", |
| 997 | + ), |
| 998 | + pytest.param( |
| 999 | + [ |
| 1000 | + ("ItemA", "ValueA1"), |
| 1001 | + ("ItemB", "ValueB"), |
| 1002 | + ("ItemC", "ValueC"), |
| 1003 | + ("ItemA", "ValueA2"), |
| 1004 | + ], |
| 1005 | + """\ |
| 1006 | + ItemA: ValueA1 |
| 1007 | + ItemB: ValueB |
| 1008 | + ItemC: ValueC |
| 1009 | + ItemA: ValueA2 |
| 1010 | + """, |
| 1011 | + id="multiple keys", |
| 1012 | + ), |
| 1013 | + pytest.param( |
| 1014 | + [ |
| 1015 | + ("ItemA", "ValueA"), |
| 1016 | + ("ItemB", "ValueB1\nValueB2\nValueB3"), |
| 1017 | + ("ItemC", "ValueC"), |
| 1018 | + ], |
| 1019 | + """\ |
| 1020 | + ItemA: ValueA |
| 1021 | + ItemB: ValueB1 |
| 1022 | + ValueB2 |
| 1023 | + ValueB3 |
| 1024 | + ItemC: ValueC |
| 1025 | + """, |
| 1026 | + id="multiline", |
| 1027 | + ), |
| 1028 | + ], |
| 1029 | + ) |
| 1030 | + def test_headers(self, items: list[tuple[str, None | str]], data: str) -> None: |
| 1031 | + message = metadata.RFC822Message() |
| 1032 | + |
| 1033 | + for name, value in items: |
| 1034 | + if value: |
| 1035 | + message[name] = value |
| 1036 | + |
| 1037 | + data = textwrap.dedent(data) + "\n" |
| 1038 | + assert str(message) == data |
| 1039 | + assert bytes(message) == data.encode() |
| 1040 | + |
| 1041 | + assert email.message_from_string(str(message)).items() == [ |
| 1042 | + (a, "\n ".join(b.splitlines())) for a, b in items if b is not None |
| 1043 | + ] |
| 1044 | + |
| 1045 | + def test_body(self) -> None: |
| 1046 | + message = metadata.RFC822Message() |
| 1047 | + |
| 1048 | + message["ItemA"] = "ValueA" |
| 1049 | + message["ItemB"] = "ValueB" |
| 1050 | + message["ItemC"] = "ValueC" |
| 1051 | + body = inspect.cleandoc( |
| 1052 | + """ |
| 1053 | + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris |
| 1054 | + congue semper fermentum. Nunc vitae tempor ante. Aenean aliquet |
| 1055 | + posuere lacus non faucibus. In porttitor congue luctus. Vivamus eu |
| 1056 | + dignissim orci. Donec egestas mi ac ipsum volutpat, vel elementum |
| 1057 | + sapien consectetur. Praesent dictum finibus fringilla. Sed vel |
| 1058 | + feugiat leo. Nulla a pharetra augue, at tristique metus. |
| 1059 | +
|
| 1060 | + Aliquam fermentum elit at risus sagittis, vel pretium augue congue. |
| 1061 | + Donec leo risus, faucibus vel posuere efficitur, feugiat ut leo. |
| 1062 | + Aliquam vestibulum vel dolor id elementum. Ut bibendum nunc interdum |
| 1063 | + neque interdum, vel tincidunt lacus blandit. Ut volutpat |
| 1064 | + sollicitudin dapibus. Integer vitae lacinia ex, eget finibus nulla. |
| 1065 | + Donec sit amet ante in neque pulvinar faucibus sed nec justo. Fusce |
| 1066 | + hendrerit massa libero, sit amet pulvinar magna tempor quis. ø |
| 1067 | + """ |
| 1068 | + ) |
| 1069 | + headers = inspect.cleandoc( |
| 1070 | + """ |
| 1071 | + ItemA: ValueA |
| 1072 | + ItemB: ValueB |
| 1073 | + ItemC: ValueC |
| 1074 | + """ |
| 1075 | + ) |
| 1076 | + full = f"{headers}\n\n{body}" |
| 1077 | + |
| 1078 | + message.set_payload(textwrap.dedent(body)) |
| 1079 | + |
| 1080 | + assert str(message) == full |
| 1081 | + |
| 1082 | + new_message = email.message_from_string(str(message)) |
| 1083 | + assert new_message.items() == message.items() |
| 1084 | + assert new_message.get_payload() == message.get_payload() |
| 1085 | + |
| 1086 | + assert bytes(message) == full.encode("utf-8") |
0 commit comments