Skip to content

Commit b4a3cdc

Browse files
Switch from nose to py.test.
1 parent 7bb816b commit b4a3cdc

11 files changed

+140
-156
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ matrix:
3838
python: '3.4'
3939
install:
4040
- pip install -q Django$DJANGO
41+
- pip install -r test_requirements.txt
4142
- pip install -q -e .
4243
script:
4344
- python setup.py test

django_mailbox/models.py

Lines changed: 36 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
import six
2121
from six.moves.urllib.parse import parse_qs, unquote, urlparse
2222

23-
from django.conf import settings
23+
from django.conf import settings as django_settings
2424
from django.core.files.base import ContentFile
2525
from django.core.mail.message import make_msgid
2626
from django.db import models
2727
from django.utils.translation import ugettext_lazy as _
2828

29-
from .utils import convert_header_to_unicode, get_body_from_message
29+
from django_mailbox import utils
3030
from django_mailbox.signals import message_received
3131
from django_mailbox.transports import Pop3Transport, ImapTransport, \
3232
MaildirTransport, MboxTransport, BabylTransport, MHTransport, \
@@ -35,55 +35,6 @@
3535
logger = logging.getLogger(__name__)
3636

3737

38-
STRIP_UNALLOWED_MIMETYPES = getattr(
39-
settings,
40-
'DJANGO_MAILBOX_STRIP_UNALLOWED_MIMETYPES',
41-
False
42-
)
43-
44-
ALLOWED_MIMETYPES = getattr(
45-
settings,
46-
'DJANGO_MAILBOX_ALLOWED_MIMETYPES',
47-
[
48-
'text/plain',
49-
'text/html'
50-
]
51-
)
52-
53-
TEXT_STORED_MIMETYPES = getattr(
54-
settings,
55-
'DJANGO_MAILBOX_TEXT_STORED_MIMETYPES',
56-
[
57-
'text/plain',
58-
'text/html'
59-
]
60-
)
61-
62-
ALTERED_MESSAGE_HEADER = getattr(
63-
settings,
64-
'DJANGO_MAILBOX_ALTERED_MESSAGE_HEADER',
65-
'X-Django-Mailbox-Altered-Message'
66-
)
67-
68-
ATTACHMENT_INTERPOLATION_HEADER = getattr(
69-
settings,
70-
'DJANGO_MAILBOX_ATTACHMENT_INTERPOLATION_HEADER',
71-
'X-Django-Mailbox-Interpolate-Attachment'
72-
)
73-
74-
ATTACHMENT_UPLOAD_TO = getattr(
75-
settings,
76-
'DJANGO_MAILBOX_ATTACHMENT_UPLOAD_TO',
77-
'mailbox_attachments/%Y/%m/%d/'
78-
)
79-
80-
STORE_ORIGINAL_MESSAGE = getattr(
81-
settings,
82-
'DJANGO_MAILBOX_STORE_ORIGINAL_MESSAGE',
83-
False
84-
)
85-
86-
8738
class ActiveMailboxManager(models.Manager):
8839
def get_queryset(self):
8940
return super(ActiveMailboxManager, self).get_queryset().filter(
@@ -272,6 +223,8 @@ def record_outgoing_message(self, message):
272223
return msg
273224

274225
def _get_dehydrated_message(self, msg, record):
226+
settings = utils.get_settings()
227+
275228
new = EmailMessage()
276229
if msg.is_multipart():
277230
for header, value in msg.items():
@@ -281,25 +234,27 @@ def _get_dehydrated_message(self, msg, record):
281234
self._get_dehydrated_message(part, record)
282235
)
283236
elif (
284-
STRIP_UNALLOWED_MIMETYPES
285-
and not msg.get_content_type() in ALLOWED_MIMETYPES
237+
settings['strip_unallowed_mimetypes']
238+
and not msg.get_content_type() in settings['allowed_mimetypes']
286239
):
287240
for header, value in msg.items():
288241
new[header] = value
289242
# Delete header, otherwise when attempting to deserialize the
290243
# payload, it will be expecting a body for this.
291244
del new['Content-Transfer-Encoding']
292-
new[ALTERED_MESSAGE_HEADER] = (
245+
new[settings['altered_message_header']] = (
293246
'Stripped; Content type %s not allowed' % (
294247
msg.get_content_type()
295248
)
296249
)
297250
new.set_payload('')
298251
elif (
299-
(msg.get_content_type() not in TEXT_STORED_MIMETYPES) or
252+
(
253+
msg.get_content_type() not in settings['text_stored_mimetypes']
254+
) or
300255
('attachment' in msg.get('Content-Disposition', ''))
301256
):
302-
filename = msg.get_filename()
257+
filename = utils.convert_header_to_unicode(msg.get_filename())
303258
if not filename:
304259
extension = mimetypes.guess_extension(msg.get_content_type())
305260
else:
@@ -323,7 +278,9 @@ def _get_dehydrated_message(self, msg, record):
323278
attachment.save()
324279

325280
placeholder = EmailMessage()
326-
placeholder[ATTACHMENT_INTERPOLATION_HEADER] = str(attachment.pk)
281+
placeholder[
282+
settings['attachment_interpolation_header']
283+
] = str(attachment.pk)
327284
new = placeholder
328285
else:
329286
content_charset = msg.get_content_charset()
@@ -361,19 +318,25 @@ def _get_dehydrated_message(self, msg, record):
361318

362319
def _process_message(self, message):
363320
msg = Message()
364-
if STORE_ORIGINAL_MESSAGE:
365-
msg.eml.save('%s.eml' % uuid.uuid4(), ContentFile(message), save=False)
321+
settings = utils.get_settings()
322+
323+
if settings['store_original_message']:
324+
msg.eml.save(
325+
'%s.eml' % uuid.uuid4(), ContentFile(message), save=False
326+
)
366327
msg.mailbox = self
367328
if 'subject' in message:
368-
msg.subject = convert_header_to_unicode(message['subject'])[0:255]
329+
msg.subject = (
330+
utils.convert_header_to_unicode(message['subject'])[0:255]
331+
)
369332
if 'message-id' in message:
370333
msg.message_id = message['message-id'][0:255].strip()
371334
if 'from' in message:
372-
msg.from_header = convert_header_to_unicode(message['from'])
335+
msg.from_header = utils.convert_header_to_unicode(message['from'])
373336
if 'to' in message:
374-
msg.to_header = convert_header_to_unicode(message['to'])
337+
msg.to_header = utils.convert_header_to_unicode(message['to'])
375338
elif 'Delivered-To' in message:
376-
msg.to_header = convert_header_to_unicode(message['Delivered-To'])
339+
msg.to_header = utils.convert_header_to_unicode(message['Delivered-To'])
377340
msg.save()
378341
message = self._get_dehydrated_message(message, msg)
379342
msg.set_body(message.as_string())
@@ -557,7 +520,7 @@ def reply(self, message):
557520
if self.mailbox.from_email:
558521
message.from_email = self.mailbox.from_email
559522
else:
560-
message.from_email = settings.DEFAULT_FROM_EMAIL
523+
message.from_email = django_settings.DEFAULT_FROM_EMAIL
561524
message.extra_headers['Message-ID'] = make_msgid()
562525
message.extra_headers['Date'] = formatdate()
563526
message.extra_headers['In-Reply-To'] = self.message_id.strip()
@@ -573,7 +536,7 @@ def text(self):
573536
"""
574537
Returns the message body matching content type 'text/plain'.
575538
"""
576-
return get_body_from_message(
539+
return utils.get_body_from_message(
577540
self.get_email_object(), 'text', 'plain'
578541
).replace('=\n', '').strip()
579542

@@ -582,23 +545,25 @@ def html(self):
582545
"""
583546
Returns the message body matching content type 'text/html'.
584547
"""
585-
return get_body_from_message(
548+
return utils.get_body_from_message(
586549
self.get_email_object(), 'text', 'html'
587550
).replace('\n', '').strip()
588551

589552
def _rehydrate(self, msg):
590553
new = EmailMessage()
554+
settings = utils.get_settings()
555+
591556
if msg.is_multipart():
592557
for header, value in msg.items():
593558
new[header] = value
594559
for part in msg.get_payload():
595560
new.attach(
596561
self._rehydrate(part)
597562
)
598-
elif ATTACHMENT_INTERPOLATION_HEADER in msg.keys():
563+
elif settings['attachment_interpolation_header'] in msg.keys():
599564
try:
600565
attachment = MessageAttachment.objects.get(
601-
pk=msg[ATTACHMENT_INTERPOLATION_HEADER]
566+
pk=msg[settings['attachment_interpolation_header']]
602567
)
603568
for header, value in attachment.items():
604569
new[header] = value
@@ -627,9 +592,9 @@ def _rehydrate(self, msg):
627592
del new['Content-Transfer-Encoding']
628593
encode_base64(new)
629594
except MessageAttachment.DoesNotExist:
630-
new[ALTERED_MESSAGE_HEADER] = (
595+
new[settings['altered_message_header']] = (
631596
'Missing; Attachment %s not found' % (
632-
msg[ATTACHMENT_INTERPOLATION_HEADER]
597+
msg[settings['attachment_interpolation_header']]
633598
)
634599
)
635600
new.set_payload('')
@@ -723,7 +688,7 @@ class MessageAttachment(models.Model):
723688

724689
document = models.FileField(
725690
_(u'Document'),
726-
upload_to=ATTACHMENT_UPLOAD_TO,
691+
upload_to=utils.get_attachment_save_path,
727692
)
728693

729694
def delete(self, *args, **kwargs):

django_mailbox/runtests.py

Lines changed: 0 additions & 53 deletions
This file was deleted.

django_mailbox/tests/__init__.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +0,0 @@
1-
from .test_mailbox import *
2-
from .test_message_flattening import *
3-
from .test_process_email import *
4-
from .test_transports import *
5-
from .test_integration_imap import *
6-
from .test_settings import *

django_mailbox/tests/base.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.conf import settings
88
from django.test import TestCase
99

10-
from django_mailbox import models
10+
from django_mailbox import models, utils
1111
from django_mailbox.models import Mailbox, Message
1212

1313

@@ -34,9 +34,13 @@ class EmailMessageTestCase(TestCase):
3434
]
3535

3636
def setUp(self):
37-
self._ALLOWED_MIMETYPES = models.ALLOWED_MIMETYPES
38-
self._STRIP_UNALLOWED_MIMETYPES = models.STRIP_UNALLOWED_MIMETYPES
39-
self._TEXT_STORED_MIMETYPES = models.TEXT_STORED_MIMETYPES
37+
dm_settings = utils.get_settings()
38+
39+
self._ALLOWED_MIMETYPES = dm_settings['allowed_mimetypes']
40+
self._STRIP_UNALLOWED_MIMETYPES = (
41+
dm_settings['strip_unallowed_mimetypes']
42+
)
43+
self._TEXT_STORED_MIMETYPES = dm_settings['text_stored_mimetypes']
4044

4145
self.mailbox = Mailbox.objects.create(from_email='[email protected]')
4246

django_mailbox/tests/settings.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
DATABASES = {
2+
'default': {
3+
'ENGINE': 'django.db.backends.sqlite3',
4+
},
5+
}
6+
INSTALLED_APPS = [
7+
'django.contrib.auth',
8+
'django.contrib.contenttypes',
9+
'django_mailbox',
10+
]
11+
SECRET_KEY = 'beepboop'

django_mailbox/tests/test_message_flattening.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
from django_mailbox import models
1+
import copy
2+
3+
import mock
4+
5+
from django_mailbox import models, utils
26
from django_mailbox.models import Message
37
from django_mailbox.tests.base import EmailMessageTestCase
48

@@ -74,10 +78,16 @@ def test_message_content_type_stripping(self):
7478
expected_email_object = self._get_email_object(
7579
'message_with_many_multiparts_stripped_html.eml',
7680
)
77-
models.STRIP_UNALLOWED_MIMETYPES = True
78-
models.ALLOWED_MIMETYPES = ['text/plain']
81+
default_settings = utils.get_settings()
7982

80-
msg = self.mailbox.process_incoming_message(incoming_email_object)
83+
with mock.patch('django_mailbox.utils.get_settings') as get_settings:
84+
altered = copy.deepcopy(default_settings)
85+
altered['strip_unallowed_mimetypes'] = True
86+
altered['allowed_mimetypes'] = ['text/plain']
87+
88+
get_settings.return_value = altered
89+
90+
msg = self.mailbox.process_incoming_message(incoming_email_object)
8191

8292
actual_email_object = msg.get_email_object()
8393

django_mailbox/tests/test_settings.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)