test_handler.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import pytest
  2. from redmail import EmailSender
  3. from redmail import EmailHandler
  4. import logging
  5. from convert import payloads_to_dict
  6. def _create_dummy_send(messages:list):
  7. def _dummy_send(msg):
  8. messages.append(msg)
  9. return _dummy_send
  10. def test_default_body():
  11. hdlr = EmailHandler(host="localhost", port=0, receivers=["me@example.com"], subject="Some logging")
  12. # By default, this should be body if text/html/html_template/text_template not specified
  13. assert hdlr.email.text == "{{ msg }}"
  14. @pytest.mark.parametrize("kwargs,exp_headers,exp_payload",
  15. [
  16. pytest.param(
  17. {
  18. "email": EmailSender(host="localhost", port=0),
  19. "subject": "A log record",
  20. "sender": "me@example.com",
  21. "receivers": ["he@example.com", "she@example.com"],
  22. },
  23. {
  24. "from": "me@example.com",
  25. "to": "he@example.com, she@example.com",
  26. "subject": "A log record",
  27. #'Content-Transfer-Encoding': '7bit',
  28. 'Content-Type': 'multipart/mixed',
  29. 'MIME-Version': '1.0',
  30. },
  31. {
  32. 'multipart/mixed': {
  33. 'text/plain': 'a message\n'
  34. }
  35. },
  36. id="Minimal",
  37. ),
  38. pytest.param(
  39. {
  40. "email": EmailSender(host="localhost", port=0),
  41. "subject": "A log record",
  42. "sender": "me@example.com",
  43. "receivers": ["he@example.com", "she@example.com"],
  44. "text": "Log Record: \n{{ msg }}",
  45. "fmt": '%(name)s: %(levelname)s: %(message)s'
  46. },
  47. {
  48. "from": "me@example.com",
  49. "to": "he@example.com, she@example.com",
  50. "subject": "A log record",
  51. #'Content-Transfer-Encoding': '7bit',
  52. 'Content-Type': 'multipart/mixed',
  53. 'MIME-Version': '1.0',
  54. },
  55. {
  56. 'multipart/mixed': {
  57. 'text/plain': 'Log Record: \n_test: INFO: a message\n'
  58. }
  59. },
  60. id="Custom message (msg)",
  61. ),
  62. pytest.param(
  63. {
  64. "email": EmailSender(host="localhost", port=0),
  65. "subject": "A log record",
  66. "sender": "me@example.com",
  67. "receivers": ["he@example.com", "she@example.com"],
  68. "text": "Log Record: \n{{ record.message }}",
  69. "fmt": '%(name)s: %(levelname)s: %(message)s'
  70. },
  71. {
  72. "from": "me@example.com",
  73. "to": "he@example.com, she@example.com",
  74. "subject": "A log record",
  75. #'Content-Transfer-Encoding': '7bit',
  76. 'Content-Type': 'multipart/mixed',
  77. 'MIME-Version': '1.0',
  78. },
  79. {
  80. 'multipart/mixed': {
  81. 'text/plain': 'Log Record: \na message\n'
  82. }
  83. },
  84. id="Custom message (record)",
  85. ),
  86. pytest.param(
  87. {
  88. "email": EmailSender(host="localhost", port=0),
  89. "subject": "Log: {record.name} - {record.levelname}",
  90. "sender": "me@example.com",
  91. "receivers": ["he@example.com", "she@example.com"],
  92. },
  93. {
  94. "from": "me@example.com",
  95. "to": "he@example.com, she@example.com",
  96. "subject": "Log: _test - INFO",
  97. #'Content-Transfer-Encoding': '7bit',
  98. 'Content-Type': 'multipart/mixed',
  99. 'MIME-Version': '1.0',
  100. },
  101. {
  102. 'multipart/mixed': {
  103. 'text/plain': 'a message\n'
  104. }
  105. },
  106. id="Sender with fomatted subject",
  107. ),
  108. pytest.param(
  109. {
  110. "email": EmailSender(host="localhost", port=0),
  111. "subject": "A log record",
  112. "sender": "me@example.com",
  113. "receivers": ["he@example.com", "she@example.com"],
  114. "fmt": '%(name)s: %(levelname)s: %(message)s',
  115. "html": "<h1>{{ record.levelname }}</h1><p>{{ msg }}</p>"
  116. },
  117. {
  118. "from": "me@example.com",
  119. "to": "he@example.com, she@example.com",
  120. "subject": "A log record",
  121. 'Content-Type': 'multipart/mixed',
  122. },
  123. {
  124. 'multipart/mixed': {
  125. 'multipart/alternative': {
  126. 'text/html': "<h1>INFO</h1><p>_test: INFO: a message</p>\n"
  127. }
  128. }
  129. },
  130. id="Custom message (HTML, msg)",
  131. ),
  132. pytest.param(
  133. {
  134. "email": EmailSender(host="localhost", port=0),
  135. "subject": "A log record",
  136. "sender": "me@example.com",
  137. "receivers": ["he@example.com", "she@example.com"],
  138. "fmt": '%(name)s: %(levelname)s: %(message)s',
  139. "html": "<h1>{{ record.levelname }}</h1><p>{{ record.message }}</p>"
  140. },
  141. {
  142. "from": "me@example.com",
  143. "to": "he@example.com, she@example.com",
  144. "subject": "A log record",
  145. 'Content-Type': 'multipart/mixed',
  146. },
  147. {
  148. 'multipart/mixed': {
  149. 'multipart/alternative': {
  150. 'text/html': "<h1>INFO</h1><p>a message</p>\n"
  151. }
  152. }
  153. },
  154. id="Custom message (HTML, record)",
  155. ),
  156. ]
  157. )
  158. def test_emit(logger, kwargs, exp_headers, exp_payload):
  159. msgs = []
  160. fmt = kwargs.pop("fmt", None)
  161. hdlr = EmailHandler(**kwargs)
  162. hdlr.formatter = logging.Formatter(fmt)
  163. hdlr.email.send_message = _create_dummy_send(msgs)
  164. logger.addHandler(hdlr)
  165. logger.setLevel(logging.INFO)
  166. logger.info("a message")
  167. assert len(msgs) == 1
  168. msg = msgs[0]
  169. headers = dict(msg.items())
  170. payload = msg.get_payload()
  171. assert headers == exp_headers
  172. structure = payloads_to_dict(msg)
  173. assert structure == exp_payload