test_headers.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import datetime
  2. import socket
  3. from textwrap import dedent
  4. import sys
  5. import re
  6. import pytest
  7. from redmail import EmailSender
  8. from convert import remove_email_content_id, prune_generated_headers
  9. import platform
  10. PYTHON_VERSION = sys.version_info
  11. IS_PY37 = sys.version_info < (3, 8)
  12. def test_date():
  13. format = "%a, %d %b %Y %H:%M:%S -0000"
  14. email = EmailSender(host=None, port=1234)
  15. before = datetime.datetime.now(datetime.timezone.utc)
  16. msg = email.get_message(sender="me@example.com", subject="Some email")
  17. after = datetime.datetime.now(datetime.timezone.utc)
  18. date_strings = re.findall(r'(?<=Date: ).+', str(msg))
  19. assert len(date_strings) == 1
  20. for dt_string in date_strings:
  21. # Validate the Date fits to the format
  22. datetime.datetime.strptime(dt_string, format)
  23. # It should not take longer than second to generate the email
  24. assert dt_string in (before.strftime(format), after.strftime(format))
  25. def test_message_id():
  26. domain = socket.getfqdn()
  27. email = EmailSender(host=None, port=1234)
  28. if IS_PY37:
  29. # Python <=3.7 has problems with domain names with UTF-8
  30. # This is mostly problem with CI.
  31. # We simulate realistic domain name
  32. domain = "REDMAIL-1234.mail.com"
  33. email.domain = domain
  34. msg = email.get_message(sender="me@example.com", subject="Some email")
  35. msg2 = email.get_message(sender="me@example.com", subject="Some email")
  36. message_ids = re.findall(r'(?<=Message-ID: ).+', str(msg))
  37. assert len(message_ids) == 1
  38. message_id = message_ids[0]
  39. # [0-9]{{12}}[.][0-9]{{5}}[.][0-9]{{20}}
  40. assert bool(re.search(fr'<[0-9.]+@{domain}>', message_id))
  41. # Check another email has not the same Message-ID
  42. message_id_2 = re.findall(r'(?<=Message-ID: ).+', str(msg2))[0]
  43. assert message_id != message_id_2
  44. def test_cc_bcc():
  45. email = EmailSender(host=None, port=1234)
  46. if IS_PY37:
  47. # CI has FQDN that has UTF-8 chars and goes to new line
  48. # for Python <=3.7. We set a realistic looking domain
  49. # name for easier testing
  50. email.domain = "REDMAIL-1234.mail.com"
  51. msg = email.get_message(sender="me@example.com", subject="Some email", cc=['you@example.com'], bcc=['he@example.com', 'she@example.com'])
  52. msg = prune_generated_headers(str(msg))
  53. assert remove_email_content_id(msg) == dedent("""
  54. From: me@example.com
  55. Subject: Some email
  56. Cc: you@example.com
  57. Bcc: he@example.com, she@example.com
  58. Message-ID: <<message_id>>
  59. Date: <date>
  60. """)[1:]
  61. @pytest.mark.parametrize("how", ["instance", "email"])
  62. def test_custom_headers(how):
  63. email = EmailSender(host=None, port=1234)
  64. headers = {"Importance": "high"}
  65. if how == "email":
  66. msg = email.get_message(
  67. sender="me@example.com",
  68. subject="Some email",
  69. headers=headers
  70. )
  71. elif how == "instance":
  72. email.headers = headers
  73. msg = email.get_message(
  74. sender="me@example.com",
  75. subject="Some email",
  76. )
  77. msg = prune_generated_headers(str(msg))
  78. assert remove_email_content_id(msg) == dedent("""
  79. From: me@example.com
  80. Subject: Some email
  81. Message-ID: <<message_id>>
  82. Date: <date>
  83. Importance: high
  84. """)[1:]
  85. @pytest.mark.parametrize("how", ["instance", "email"])
  86. def test_custom_headers_override(how):
  87. email = EmailSender(host=None, port=1234)
  88. headers = {
  89. "Date": "Sun, 31 Jan 2021 06:56:46 -0000",
  90. "Message-ID": "<167294165062.31860.1664530310632362057@LAPTOP-1234GML0>"
  91. }
  92. if how == "email":
  93. msg = email.get_message(
  94. sender="me@example.com",
  95. subject="Some email",
  96. headers=headers
  97. )
  98. elif how == "instance":
  99. email.headers = headers
  100. msg = email.get_message(
  101. sender="me@example.com",
  102. subject="Some email",
  103. )
  104. assert str(msg) == dedent("""
  105. From: me@example.com
  106. Subject: Some email
  107. Message-ID: <167294165062.31860.1664530310632362057@LAPTOP-1234GML0>
  108. Date: Sun, 31 Jan 2021 06:56:46 -0000
  109. """)[1:]