test_body.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from redmail import EmailSender
  2. import pytest
  3. import pandas as pd
  4. from convert import remove_extra_lines
  5. from getpass import getpass, getuser
  6. from platform import node
  7. from convert import remove_email_extra
  8. def test_text_message():
  9. text = "Hi, nice to meet you."
  10. sender = EmailSender(host=None, port=1234)
  11. msg = sender.get_message(
  12. sender="me@gmail.com",
  13. receivers="you@gmail.com",
  14. subject="Some news",
  15. text=text,
  16. )
  17. payload = msg.get_payload()
  18. expected_headers = {
  19. 'from': 'me@gmail.com',
  20. 'subject': 'Some news',
  21. 'to': 'you@gmail.com',
  22. 'MIME-Version': '1.0',
  23. 'Content-Type': 'text/plain; charset="utf-8"',
  24. 'Content-Transfer-Encoding': '7bit',
  25. }
  26. assert "text/plain" == msg.get_content_type()
  27. assert text + "\n" == payload
  28. # Test receivers etc.
  29. headers = dict(msg.items())
  30. assert expected_headers == headers
  31. def test_html_message():
  32. html = "<h3>Hi,</h3><p>Nice to meet you</p>"
  33. sender = EmailSender(host=None, port=1234)
  34. msg = sender.get_message(
  35. sender="me@gmail.com",
  36. receivers="you@gmail.com",
  37. subject="Some news",
  38. html=html,
  39. )
  40. payload = msg.get_payload()
  41. expected_headers = {
  42. 'from': 'me@gmail.com',
  43. 'subject': 'Some news',
  44. 'to': 'you@gmail.com',
  45. #'MIME-Version': '1.0',
  46. 'Content-Type': 'multipart/alternative'
  47. }
  48. assert "multipart/alternative" == msg.get_content_type()
  49. assert html + "\n" == payload[0].get_content()
  50. # Test receivers etc.
  51. headers = dict(msg.items())
  52. assert expected_headers == headers
  53. def test_text_and_html_message():
  54. html = "<h3>Hi,</h3><p>nice to meet you.</p>"
  55. text = "Hi, nice to meet you."
  56. sender = EmailSender(host=None, port=1234)
  57. msg = sender.get_message(
  58. sender="me@gmail.com",
  59. receivers="you@gmail.com",
  60. subject="Some news",
  61. html=html,
  62. text=text,
  63. )
  64. payload = msg.get_payload()
  65. expected_headers = {
  66. 'from': 'me@gmail.com',
  67. 'subject': 'Some news',
  68. 'to': 'you@gmail.com',
  69. 'MIME-Version': '1.0',
  70. 'Content-Type': 'multipart/alternative'
  71. }
  72. assert "multipart/alternative" == msg.get_content_type()
  73. assert "text/plain" == payload[0].get_content_type()
  74. assert text + "\n" == payload[0].get_content()
  75. assert "text/html" == payload[1].get_content_type()
  76. assert html + "\n" == payload[1].get_content()
  77. # Test receivers etc.
  78. headers = dict(msg.items())
  79. assert expected_headers == headers
  80. @pytest.mark.parametrize(
  81. "html,expected_html,text,expected_text,extra", [
  82. pytest.param(
  83. "<h3>Hi,</h3> <p>This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.</p>",
  84. f"<h3>Hi,</h3> <p>This is {getuser()} from {node()}. I'm really Me.</p>\n",
  85. "Hi, \nThis is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.",
  86. f"Hi, \nThis is {getuser()} from {node()}. I'm really Me.\n",
  87. None,
  88. id="With default extras"
  89. ),
  90. pytest.param(
  91. "<h3>Hi {{ receiver }},</h3> <p>This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.</p>",
  92. f"<h3>Hi you,</h3> <p>This is overridden from {node()}. I'm really Me.</p>\n",
  93. "Hi {{ receiver }}, This is {{ user }} from {{ node }}. I'm really {{ sender.full_name }}.",
  94. f"Hi you, This is overridden from {node()}. I'm really Me.\n",
  95. {"user": "overridden", "receiver": "you"},
  96. id="Custom extra"
  97. ),
  98. ]
  99. )
  100. def test_with_jinja_params(html, text, extra, expected_html, expected_text):
  101. sender = EmailSender(host=None, port=1234)
  102. msg = sender.get_message(
  103. sender="me@gmail.com",
  104. receivers="you@gmail.com",
  105. subject="Some news",
  106. text=text,
  107. html=html,
  108. body_params=extra
  109. )
  110. assert "multipart/alternative" == msg.get_content_type()
  111. text = remove_email_extra(msg.get_payload()[0].get_payload())
  112. html = remove_email_extra(msg.get_payload()[1].get_payload())
  113. assert expected_html == html
  114. assert expected_text == text
  115. def test_with_error():
  116. sender = EmailSender(host=None, port=1234)
  117. try:
  118. raise RuntimeError("Deliberate failure")
  119. except:
  120. msg = sender.get_message(
  121. sender="me@gmail.com",
  122. receivers="you@gmail.com",
  123. subject="Some news",
  124. text="Error occurred \n{{ error }}",
  125. html="<h1>Error occurred: </h1>{{ error }}",
  126. )
  127. text = remove_email_extra(msg.get_payload()[0].get_payload())
  128. html = remove_email_extra(msg.get_payload()[1].get_payload())
  129. assert text.startswith('Error occurred\nTraceback (most recent call last):\n File "')
  130. assert text.endswith(', in test_with_error\n raise RuntimeError("Deliberate failure")\nRuntimeError: Deliberate failure\n')
  131. assert html.startswith('<h1>Error occurred: </h1>\n <div>\n <h4>Traceback (most recent call last):</h4>\n <pre><code> File &quot;')
  132. 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')
  133. def test_set_defaults():
  134. email = EmailSender(host=None, port=1234)
  135. email.sender = 'me@gmail.com'
  136. email.receivers = ['you@gmail.com', 'they@gmail.com']
  137. email.subject = "Some email"
  138. msg = email.get_message(text="Hi, an email")
  139. assert {
  140. 'from': 'me@gmail.com',
  141. 'to': 'you@gmail.com, they@gmail.com',
  142. 'subject': 'Some email',
  143. 'Content-Type': 'text/plain; charset="utf-8"',
  144. 'Content-Transfer-Encoding': '7bit',
  145. 'MIME-Version': '1.0'
  146. } == dict(msg.items())