test_body.py 8.2 KB

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