1
0

test_handler_multi.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import pytest
  2. from redmail import EmailSender
  3. from redmail import MultiEmailHandler
  4. import logging
  5. def _create_dummy_send(messages:list):
  6. def _dummy_send(msg):
  7. messages.append(msg)
  8. return _dummy_send
  9. def test_default_body():
  10. hdlr = MultiEmailHandler(host="localhost", port=0, receivers=["me@example.com"], subject="Some logging")
  11. # By default, this should be body if text/html/html_template/text_template not specified
  12. assert hdlr.email.text == MultiEmailHandler.default_text
  13. def test_sender_with_login():
  14. hdlr = MultiEmailHandler(host="localhost", port=0, username="myuser", password="1234", receivers=["me@example.com"], subject="Some logging")
  15. # By default, this should be body if text/html/html_template/text_template not specified
  16. sender = hdlr.email
  17. assert sender.username == "myuser"
  18. assert sender.password == "1234"
  19. assert sender.receivers == ["me@example.com"]
  20. assert sender.subject == "Some logging"
  21. @pytest.mark.parametrize("kwargs,exp_headers,exp_payload",
  22. [
  23. pytest.param(
  24. {
  25. "email": EmailSender(host="localhost", port=0),
  26. "subject": "A log record",
  27. "sender": "me@example.com",
  28. "receivers": ["he@example.com", "she@example.com"],
  29. },
  30. {
  31. "from": "me@example.com",
  32. "to": "he@example.com, she@example.com",
  33. "subject": "A log record",
  34. 'Content-Transfer-Encoding': '7bit',
  35. 'Content-Type': 'text/plain; charset="utf-8"',
  36. 'MIME-Version': '1.0',
  37. },
  38. 'Log Recods:\na message\n',
  39. id="Minimal",
  40. ),
  41. pytest.param(
  42. {
  43. "email": EmailSender(host="localhost", port=0),
  44. "subject": "A log record",
  45. "sender": "me@example.com",
  46. "receivers": ["he@example.com", "she@example.com"],
  47. "text": "The records: \n{% for msg in msgs %}Log: {{ msg }}{% endfor %}",
  48. "fmt": '%(name)s - %(levelname)s - %(message)s'
  49. },
  50. {
  51. "from": "me@example.com",
  52. "to": "he@example.com, she@example.com",
  53. "subject": "A log record",
  54. 'Content-Transfer-Encoding': '7bit',
  55. 'Content-Type': 'text/plain; charset="utf-8"',
  56. 'MIME-Version': '1.0',
  57. },
  58. 'The records: \nLog: _test - INFO - a message\n',
  59. id="Custom message (msgs)",
  60. ),
  61. pytest.param(
  62. {
  63. "email": EmailSender(host="localhost", port=0),
  64. "subject": "A log record",
  65. "sender": "me@example.com",
  66. "receivers": ["he@example.com", "she@example.com"],
  67. "text": "The records: \n{% for rec in records %}Log: {{ rec.levelname }} - {{ rec.message }}{% endfor %}",
  68. "fmt": '%(name)s - %(levelname)s - %(message)s'
  69. },
  70. {
  71. "from": "me@example.com",
  72. "to": "he@example.com, she@example.com",
  73. "subject": "A log record",
  74. 'Content-Transfer-Encoding': '7bit',
  75. 'Content-Type': 'text/plain; charset="utf-8"',
  76. 'MIME-Version': '1.0',
  77. },
  78. 'The records: \nLog: INFO - a message\n',
  79. id="Custom message (records)",
  80. ),
  81. pytest.param(
  82. {
  83. "email": EmailSender(host="localhost", port=0),
  84. "subject": "Logs: {min_level_name} - {max_level_name}",
  85. "sender": "me@example.com",
  86. "receivers": ["he@example.com", "she@example.com"],
  87. },
  88. {
  89. "from": "me@example.com",
  90. "to": "he@example.com, she@example.com",
  91. "subject": "Logs: INFO - INFO",
  92. 'Content-Transfer-Encoding': '7bit',
  93. 'Content-Type': 'text/plain; charset="utf-8"',
  94. 'MIME-Version': '1.0',
  95. },
  96. 'Log Recods:\na message\n',
  97. id="Sender with fomatted subject",
  98. ),
  99. pytest.param(
  100. {
  101. "email": EmailSender(host="localhost", port=0),
  102. "subject": "A log record",
  103. "sender": "me@example.com",
  104. "receivers": ["he@example.com", "she@example.com"],
  105. "fmt": '%(name)s - %(levelname)s - %(message)s',
  106. "html": "<h1>The records:</h1><p>{% for msg in msgs %}Log: {{ msg }}{% endfor %}</p>"
  107. },
  108. {
  109. "from": "me@example.com",
  110. "to": "he@example.com, she@example.com",
  111. "subject": "A log record",
  112. 'Content-Type': 'multipart/alternative',
  113. },
  114. ["<h1>The records:</h1><p>Log: _test - INFO - a message</p>\n"],
  115. id="Custom message (HTML, msgs)",
  116. ),
  117. pytest.param(
  118. {
  119. "email": EmailSender(host="localhost", port=0),
  120. "subject": "A log record",
  121. "sender": "me@example.com",
  122. "receivers": ["he@example.com", "she@example.com"],
  123. "fmt": '%(name)s: %(levelname)s: %(message)s',
  124. "html": "<h1>The records:</h1><p>{% for rec in records %}Log: {{ rec.levelname }} - {{ rec.message }}{% endfor %}</p>"
  125. },
  126. {
  127. "from": "me@example.com",
  128. "to": "he@example.com, she@example.com",
  129. "subject": "A log record",
  130. 'Content-Type': 'multipart/alternative',
  131. },
  132. ["<h1>The records:</h1><p>Log: INFO - a message</p>\n"],
  133. id="Custom message (HTML, records)",
  134. ),
  135. ]
  136. )
  137. def test_emit(logger, kwargs, exp_headers, exp_payload):
  138. msgs = []
  139. fmt = kwargs.pop("fmt", None)
  140. hdlr = MultiEmailHandler(**kwargs)
  141. hdlr.formatter = logging.Formatter(fmt)
  142. hdlr.email.send_message = _create_dummy_send(msgs)
  143. logger.addHandler(hdlr)
  144. logger.setLevel(logging.INFO)
  145. logger.info("a message")
  146. hdlr.flush()
  147. assert len(msgs) == 1
  148. msg = msgs[0]
  149. headers = dict(msg.items())
  150. payload = msg.get_payload()
  151. assert headers == exp_headers
  152. if isinstance(payload, str):
  153. assert payload == exp_payload
  154. else:
  155. # HTML (and text) of payloads
  156. payloads = [pl.get_payload() for pl in payload]
  157. assert payloads == exp_payload
  158. def test_flush_multiple(logger):
  159. msgs = []
  160. hdlr = MultiEmailHandler(
  161. email=EmailSender(host="localhost", port=0),
  162. subject="Logs: {min_level_name} - {max_level_name}",
  163. receivers=["he@example.com", "she@example.com"],
  164. text="Records: \n{% for rec in records %}{{ rec.levelname }} - {{ rec.message }}\n{% endfor %}"
  165. )
  166. hdlr.email.send_message = _create_dummy_send(msgs)
  167. logger.addHandler(hdlr)
  168. logger.setLevel(logging.DEBUG)
  169. logger.info("an info")
  170. logger.debug("a debug")
  171. hdlr.flush()
  172. assert len(msgs) == 1
  173. msg = msgs[0]
  174. headers = dict(msg.items())
  175. payload = msg.get_payload()
  176. assert headers == {
  177. "from": "None",
  178. "to": "he@example.com, she@example.com",
  179. "subject": "Logs: DEBUG - INFO",
  180. 'Content-Transfer-Encoding': '7bit',
  181. 'Content-Type': 'text/plain; charset="utf-8"',
  182. 'MIME-Version': '1.0',
  183. }
  184. assert payload == "Records: \nINFO - an info\nDEBUG - a debug\n"
  185. def test_flush_none():
  186. msgs = []
  187. hdlr = MultiEmailHandler(
  188. email=EmailSender(host="localhost", port=0),
  189. subject="Logs: {min_level_name} - {max_level_name}",
  190. receivers=["he@example.com", "she@example.com"],
  191. text="Records: \n{% for rec in records %}{{ rec.levelname }} - {{ rec.message }}\n{% endfor %}"
  192. )
  193. hdlr.email.send_message = _create_dummy_send(msgs)
  194. logger = logging.getLogger("_test")
  195. logger.addHandler(hdlr)
  196. logger.setLevel(logging.DEBUG)
  197. hdlr.flush()
  198. assert len(msgs) == 1
  199. msg = msgs[0]
  200. headers = dict(msg.items())
  201. payload = msg.get_payload()
  202. assert headers == {
  203. "from": "None",
  204. "to": "he@example.com, she@example.com",
  205. "subject": "Logs: NOTSET - NOTSET",
  206. 'Content-Transfer-Encoding': '7bit',
  207. 'Content-Type': 'text/plain; charset="utf-8"',
  208. 'MIME-Version': '1.0',
  209. }
  210. assert payload == "Records: \n"