test_handler_multi.py 7.9 KB

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