test_body.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. from redmail import EmailSender
  2. import pytest
  3. from convert import remove_extra_lines, payloads_to_dict
  4. from getpass import getpass, getuser
  5. from platform import node
  6. from convert import remove_email_extra
  7. def test_text_message():
  8. sender = EmailSender(host=None, port=1234)
  9. msg = sender.get_message(
  10. sender="me@gmail.com",
  11. receivers="you@gmail.com",
  12. subject="Some news",
  13. text="Hi, nice to meet you.",
  14. )
  15. # Validate structure
  16. assert payloads_to_dict(msg) == {
  17. 'multipart/mixed': {
  18. 'text/plain': 'Hi, nice to meet you.\n',
  19. }
  20. }
  21. assert msg.get_content_type() == "multipart/mixed"
  22. text = msg.get_payload()[0]
  23. expected_headers = {
  24. 'from': 'me@gmail.com',
  25. 'subject': 'Some news',
  26. 'to': 'you@gmail.com',
  27. 'MIME-Version': '1.0',
  28. 'Content-Type': 'multipart/mixed',
  29. #'Content-Transfer-Encoding': '7bit',
  30. }
  31. assert "text/plain" == text.get_content_type()
  32. assert "Hi, nice to meet you.\n" == text.get_payload()
  33. # Test receivers etc.
  34. headers = dict(msg.items())
  35. assert expected_headers == headers
  36. def test_html_message():
  37. sender = EmailSender(host=None, port=1234)
  38. msg = sender.get_message(
  39. sender="me@gmail.com",
  40. receivers="you@gmail.com",
  41. subject="Some news",
  42. html="<h3>Hi,</h3><p>Nice to meet you</p>",
  43. )
  44. # Validate structure
  45. assert payloads_to_dict(msg) == {
  46. 'multipart/mixed': {
  47. 'multipart/alternative': {
  48. 'text/html': '<h3>Hi,</h3><p>Nice to meet you</p>\n',
  49. }
  50. }
  51. }
  52. assert msg.get_content_type() == "multipart/mixed"
  53. alternative = msg.get_payload()[0]
  54. html = alternative.get_payload()[0]
  55. expected_headers = {
  56. 'from': 'me@gmail.com',
  57. 'subject': 'Some news',
  58. 'to': 'you@gmail.com',
  59. #'MIME-Version': '1.0',
  60. 'Content-Type': 'multipart/mixed'
  61. }
  62. assert "<h3>Hi,</h3><p>Nice to meet you</p>\n" == html.get_content()
  63. # Test receivers etc.
  64. headers = dict(msg.items())
  65. assert expected_headers == headers
  66. def test_text_and_html_message():
  67. sender = EmailSender(host=None, port=1234)
  68. msg = sender.get_message(
  69. sender="me@gmail.com",
  70. receivers="you@gmail.com",
  71. subject="Some news",
  72. html="<h3>Hi,</h3><p>nice to meet you.</p>",
  73. text="Hi, nice to meet you.",
  74. )
  75. # Validate structure
  76. assert payloads_to_dict(msg) == {
  77. 'multipart/mixed': {
  78. 'multipart/alternative': {
  79. 'text/plain': 'Hi, nice to meet you.\n',
  80. 'text/html': '<h3>Hi,</h3><p>nice to meet you.</p>\n',
  81. }
  82. }
  83. }
  84. alternative = msg.get_payload()[0]
  85. text, html = alternative.get_payload()
  86. expected_headers = {
  87. 'from': 'me@gmail.com',
  88. 'subject': 'Some news',
  89. 'to': 'you@gmail.com',
  90. 'MIME-Version': '1.0',
  91. 'Content-Type': 'multipart/mixed'
  92. }
  93. assert "multipart/mixed" == msg.get_content_type()
  94. assert "text/plain" == text.get_content_type()
  95. assert "Hi, nice to meet you.\n" == text.get_content()
  96. assert "text/html" == html.get_content_type()
  97. assert "<h3>Hi,</h3><p>nice to meet you.</p>\n" == html.get_content()
  98. # Test receivers etc.
  99. headers = dict(msg.items())
  100. assert expected_headers == headers
  101. @pytest.mark.parametrize(
  102. "html,expected_html,text,expected_text,extra", [
  103. pytest.param(
  104. "<h3>Hi,</h3> <p>This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.</p>",
  105. f"<h3>Hi,</h3> <p>This is {getuser()} from {node()}. I'm really Me.</p>\n",
  106. "Hi, \nThis is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.",
  107. f"Hi, \nThis is {getuser()} from {node()}. I'm really Me.\n",
  108. None,
  109. id="With default extras"
  110. ),
  111. pytest.param(
  112. "<h3>Hi {{ receiver }},</h3> <p>This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.</p>",
  113. f"<h3>Hi you,</h3> <p>This is overridden from {node()}. I'm really Me.</p>\n",
  114. "Hi {{ receiver }}, This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.",
  115. f"Hi you, This is overridden from {node()}. I'm really Me.\n",
  116. {"user": "overridden", "receiver": "you"},
  117. id="Custom extra"
  118. ),
  119. ]
  120. )
  121. def test_with_jinja_params(html, text, extra, expected_html, expected_text):
  122. sender = EmailSender(host=None, port=1234)
  123. msg = sender.get_message(
  124. sender="me@gmail.com",
  125. receivers="you@gmail.com",
  126. subject="Some news",
  127. text=text,
  128. html=html,
  129. body_params=extra
  130. )
  131. # Validate structure
  132. structure = payloads_to_dict(msg)
  133. assert structure == {
  134. 'multipart/mixed': {
  135. 'multipart/alternative': {
  136. 'text/plain': structure["multipart/mixed"]["multipart/alternative"]["text/plain"],
  137. 'text/html': structure["multipart/mixed"]["multipart/alternative"]["text/html"],
  138. }
  139. }
  140. }
  141. assert "multipart/mixed" == msg.get_content_type()
  142. alternative = msg.get_payload()[0]
  143. text_part, html_part = alternative.get_payload()
  144. text = remove_email_extra(text_part.get_payload())
  145. html = remove_email_extra(html_part.get_payload())
  146. assert expected_html == html
  147. assert expected_text == text
  148. def test_with_error():
  149. sender = EmailSender(host=None, port=1234)
  150. try:
  151. raise RuntimeError("Deliberate failure")
  152. except:
  153. msg = sender.get_message(
  154. sender="me@gmail.com",
  155. receivers="you@gmail.com",
  156. subject="Some news",
  157. text="Error occurred \n{{ error }}",
  158. html="<h1>Error occurred: </h1>{{ error }}",
  159. )
  160. alternative = msg.get_payload()[0]
  161. text_part, html_part = alternative.get_payload()
  162. text = remove_email_extra(text_part.get_payload())
  163. html = remove_email_extra(html_part.get_payload())
  164. assert text.startswith('Error occurred\nTraceback (most recent call last):\n File "')
  165. assert text.endswith(', in test_with_error\n raise RuntimeError("Deliberate failure")\nRuntimeError: Deliberate failure\n')
  166. assert html.startswith('<h1>Error occurred: </h1>\n <div>\n <h4>Traceback (most recent call last):</h4>\n <pre><code> File &quot;')
  167. assert html.endswith(', in test_with_error\nraise RuntimeError(&quot;Deliberate failure&quot;)</code></pre>\n <span style=3D"color: red; font-weight: bold">Deliberate failure</span>: <span>RuntimeError</span>\n </div>\n')
  168. def test_set_defaults():
  169. email = EmailSender(host=None, port=1234)
  170. email.sender = 'me@gmail.com'
  171. email.receivers = ['you@gmail.com', 'they@gmail.com']
  172. email.subject = "Some email"
  173. msg = email.get_message(text="Hi, an email")
  174. assert {
  175. 'from': 'me@gmail.com',
  176. 'to': 'you@gmail.com, they@gmail.com',
  177. 'subject': 'Some email',
  178. 'Content-Type': 'multipart/mixed',
  179. #'Content-Transfer-Encoding': '7bit',
  180. 'MIME-Version': '1.0'
  181. } == dict(msg.items())
  182. def test_cc_bcc():
  183. email = EmailSender(host=None, port=1234)
  184. msg = email.get_message(sender="me@example.com", subject="Something", cc=['you@example.com'], bcc=['he@example.com', 'she@example.com'])
  185. assert dict(msg.items()) == {'from': 'me@example.com', 'subject': 'Something', 'cc': 'you@example.com', 'bcc': 'he@example.com, she@example.com', 'Content-Type': 'multipart/mixed'}
  186. def test_missing_subject():
  187. email = EmailSender(host=None, port=1234)
  188. with pytest.raises(ValueError):
  189. email.get_message(sender="me@example.com", receivers=['you@example.com'])
  190. def test_no_table_templates():
  191. email = EmailSender(host="localhost", port=0)
  192. assert email.default_html_theme == "modest.html"
  193. assert email.default_text_theme == "pandas.txt"
  194. email.default_html_theme = None
  195. email.default_text_theme = None
  196. msg = email.get_message(
  197. sender="me@gmail.com",
  198. receivers="you@gmail.com",
  199. subject="Some news",
  200. text="An example",
  201. html="<h1>An example</h1>"
  202. )
  203. assert dict(msg.items()) == {
  204. 'from': 'me@gmail.com',
  205. 'subject': 'Some news',
  206. 'to': 'you@gmail.com',
  207. 'MIME-Version': '1.0',
  208. 'Content-Type': 'multipart/mixed',
  209. }