/ecs/ecsmail/testcases.py

https://github.com/ethikkom/ecs · Python · 116 lines · 106 code · 7 blank · 3 comment · 0 complexity · a0406c0ecdb8f6807b6bab53550eeab8 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. import re
  3. import StringIO
  4. import django.core.mail
  5. from django.conf import settings
  6. from django.core.mail import make_msgid
  7. from email import message_from_file
  8. from email.iterators import typed_subpart_iterator
  9. from lamson import routing
  10. from lamson.mail import MailRequest
  11. from ecs.utils.testcases import EcsTestCase
  12. from ecs.ecsmail.mail import deliver as ecsmail_deliver
  13. from ecs.ecsmail.mail import create_mail
  14. class MailTestCase(EcsTestCase):
  15. '''
  16. TestCase Class, for testing Mail inside the ecs environment
  17. if you play with self.receive, you probably want to "from lamson.server import SMTPError" inside your tests,
  18. to check for smtperrorcodes
  19. '''
  20. @classmethod
  21. def setUpClass(self):
  22. super(MailTestCase, self).setUpClass()
  23. # import lamson ecsmail config, this makes the production frontend accessable from within the testcase
  24. import ecs.ecsmail.mailconf as lamson_settings
  25. @classmethod
  26. def teardownClass(self):
  27. super(MailTestCase, self).teardownClass()
  28. def setUp(self):
  29. routing.Router.clear_states()
  30. self.queue_clear()
  31. super(MailTestCase, self).setUp()
  32. def tearDown(self):
  33. super(MailTestCase, self).tearDown()
  34. @staticmethod
  35. def _entry_transform(entry):
  36. return unicode(entry.message())
  37. @staticmethod
  38. def convert_raw2message(data):
  39. ''' Convert a raw message to a python email.Message Object '''
  40. y=StringIO.StringIO(data)
  41. msg = message_from_file(y)
  42. return msg
  43. @staticmethod
  44. def convert_message2raw(message):
  45. ''' Convert a python email.Message Object to a raw message '''
  46. return message.as_string()
  47. @staticmethod
  48. def get_mimeparts(msg, maintype="*", subtype="*"):
  49. ''' Takes a email.Message Object and returns a list of matching maintype, subtype message parts as list [[mimetype, rawdata]*] '''
  50. l = []
  51. for part in typed_subpart_iterator(msg, maintype, subtype):
  52. l += [[part.get_content_type(), part.get_payload(decode=True)]]
  53. return l
  54. def queue_clear(self):
  55. django.core.mail.outbox = []
  56. def queue_count(self):
  57. return len(django.core.mail.outbox) if hasattr(django.core.mail, "outbox") else 0
  58. def queue_list(self):
  59. if hasattr(django.core.mail, "outbox"):
  60. return [self._entry_transform(x) for x in django.core.mail.outbox]
  61. else:
  62. return []
  63. def queue_get(self, key):
  64. if not hasattr(django.core.mail, "outbox"):
  65. raise KeyError("Empty Outbox")
  66. else:
  67. return self._entry_transform(django.core.mail.outbox [key])
  68. def deliver(self, subject="test subject", message="test body", from_email="alice@example.org", recipient_list="bob@example.org", message_html=None, attachments=None, callback=None):
  69. ''' just call our standard email deliver, prefilled values: subject, message, from_email, recipient_list '''
  70. return ecsmail_deliver(subject, message, from_email, recipient_list, message_html, attachments, callback)
  71. def receive(self, subject, message, from_email, recipient_list, message_html=None, attachments=None, connecting_host="localhost"):
  72. ''' Fakes an incoming message trough ecsmail server '''
  73. if isinstance(recipient_list, basestring):
  74. recipient_list = [recipient_list]
  75. sentids = []
  76. for recipient in recipient_list:
  77. msgid = make_msgid()
  78. msg = create_mail(subject, message, from_email, recipient, message_html, attachments, msgid)
  79. self.logger.debug("Receiving Mail from %s to %s, message= %s" % (from_email, recipient, str(msg.message())))
  80. routing.Router.deliver(MailRequest(connecting_host, from_email, recipient, str(msg.message())))
  81. sentids += [[msgid, msg.message()]]
  82. return sentids
  83. def is_delivered(self, pattern):
  84. ''' returns message that matches the regex (searched = rawmessage), or False if not found '''
  85. regp = re.compile(pattern)
  86. if self.queue_count() == 0:
  87. return False # empty outbox, so pattern does not match
  88. for msg in self.queue_list():
  89. if regp.search(str(msg)):
  90. return msg
  91. return False # didn't find anything