Projet

Général

Profil

Télécharger (5,3 ko) Statistiques
| Branche: | Tag: | Révision:

root / tests / test_emailing.py @ bf5d84a3

1
import pytest
2
from uuid import uuid4
3
import os
4
import re
5
import urllib
6
import mock
7

    
8
from django.core.urlresolvers import reverse
9
from django.core import mail, signing
10
from django.utils import timezone
11
from django.core.files.storage import DefaultStorage
12
from django.utils.text import slugify
13

    
14
from corbo.models import Category, Announce, Subscription, Broadcast, transform_image_src
15

    
16
pytestmark = pytest.mark.django_db
17

    
18
CATEGORIES = (u'Alerts', u'News')
19

    
20

    
21
@pytest.fixture
22
def categories():
23
    categories = []
24
    for category in CATEGORIES:
25
        c, created = Category.objects.get_or_create(name=category, slug=slugify(category))
26
        categories.append(c)
27
    return categories
28

    
29

    
30
@pytest.fixture
31
def announces():
32
    announces = []
33
    for category in Category.objects.all():
34
        a = Announce.objects.create(category=category, title='Announce 1',
35
                                    publication_time=timezone.now(),
36
                                    text='<h2>Announce 1</h2>')
37
        Broadcast.objects.create(announce=a)
38
        announces.append(a)
39
        a = Announce.objects.create(category=category, title='Announce 2',
40
                                    publication_time=timezone.now(),
41
                                    text='<h2>Announce 2</h2>')
42
        Broadcast.objects.create(announce=a)
43
        announces.append(a)
44
    return announces
45

    
46

    
47
def test_emailing_with_no_subscriptions(app, categories, announces, mailoutbox):
48
    for announce in announces:
49
        broadcast = Broadcast.objects.get(announce=announce)
50
        broadcast.send()
51
        assert not broadcast.result
52
    assert not len(mailoutbox)
53

    
54

    
55
def test_send_email(app, categories, announces, mailoutbox):
56
    for category in categories:
57
        uuid = uuid4()
58
        Subscription.objects.create(category=category,
59
                                    identifier='%s@example.net' % uuid, uuid=uuid)
60
    for i, announce in enumerate(announces):
61
        broadcast = Broadcast.objects.get(announce=announce)
62
        broadcast.send()
63
        assert broadcast.result
64
        assert len(mailoutbox) == i+1
65

    
66

    
67
def test_check_inline_css(app, categories, announces, mailoutbox):
68
    total_sent = 0
69
    for i, announce in enumerate(announces):
70
        announce.text = '<style type="text/css">h2 {color: #F00}</style>' + announce.text
71
        announce.save()
72
        uuid = uuid4()
73
        Subscription.objects.create(category=announce.category,
74
                                    identifier='%s@example.net' % uuid, uuid=uuid)
75
        broadcast = Broadcast.objects.get(announce=announce)
76
        broadcast.send()
77
        assert broadcast.result
78
        assert len(mailoutbox) == total_sent + broadcast.result
79
        total_sent += broadcast.result
80
        assert 'h2 style="color:#F00"' in mailoutbox[i].html
81

    
82

    
83
@mock.patch('emails.utils.requests.get')
84
def test_check_inline_images(mocked_get, app, categories, announces, mailoutbox):
85
    storage = DefaultStorage()
86
    media_path = os.path.join(os.path.dirname(__file__), 'media')
87
    image_name = 'logo.png'
88
    image_name = storage.save(image_name, file(os.path.join(media_path, image_name)))
89
    total_sent = 0
90
    for i, announce in enumerate(announces):
91
        img_src = "/media/%s" % image_name
92
        announce.text = announce.text + '<img src="%s" />' % img_src
93
        announce.save()
94
        uuid = uuid4()
95
        Subscription.objects.create(category=announce.category,
96
                                    identifier='%s@example.net' % uuid, uuid=uuid)
97
        broadcast = Broadcast.objects.get(announce=announce)
98
        broadcast.send()
99
        assert broadcast.result
100

    
101
        assert len(mailoutbox) == total_sent + broadcast.result
102
        transformed_image_src = transform_image_src(img_src)
103
        assert transformed_image_src in mailoutbox[i].attachments.keys()
104
        assert 'cid:%s' % transformed_image_src in mailoutbox[i].html_body
105
        assert 'cid:%s' % transformed_image_src in mailoutbox[i].text_body
106
        total_sent += broadcast.result
107
    storage.delete(image_name)
108

    
109

    
110
def test_unsubscription_link(app, categories, announces, mailoutbox):
111
    unsubscription_link_sentinel = ''
112
    for category in categories:
113
        uuid = uuid4()
114
        scheme = 'mailto:'
115
        uri = scheme + '%s@example.net' % uuid
116
        Subscription.objects.create(category=category, identifier=uri, uuid=str(uuid))
117
        for i, announce in enumerate(announces):
118
            if announce.category != category:
119
                continue
120
            broadcast = Broadcast.objects.get(announce=announce)
121
            broadcast.send()
122
            assert broadcast.result
123
            assert len(mailoutbox) == i+1
124

    
125
            signature = urllib.unquote(re.findall('/unsubscribe/(.*)"', mailoutbox[i].html)[0])
126
            unsubscription_link = reverse('unsubscribe', kwargs={'unsubscription_token': signature})
127
            assert signing.loads(signature) == {
128
                'category': announce.category.pk, 'identifier': uri}
129
            assert mailoutbox[i].subject == announce.title
130
            assert unsubscription_link in mailoutbox[i].html
131
            assert unsubscription_link in mailoutbox[i].text
132
            assert unsubscription_link_sentinel != unsubscription_link
133
            # make sure the uri schema is not in the page
134
            resp = app.get(unsubscription_link)
135
            assert scheme not in resp.content
136
        unsubscription_link_sentinel = unsubscription_link
(4-4/4)