42 |
42 |
return announces
|
43 |
43 |
|
44 |
44 |
|
45 |
|
def test_emailing_with_no_subscriptions(app, categories, announces):
|
|
45 |
def test_emailing_with_no_subscriptions(app, categories, announces, mailoutbox):
|
46 |
46 |
for announce in announces:
|
47 |
47 |
broadcast = Broadcast.objects.get(announce=announce)
|
48 |
48 |
broadcast.send()
|
49 |
49 |
assert not broadcast.result
|
50 |
|
assert not mail.outbox
|
|
50 |
assert not len(mailoutbox)
|
51 |
51 |
|
52 |
52 |
|
53 |
|
def test_send_email(app, categories, announces):
|
|
53 |
def test_send_email(app, categories, announces, mailoutbox):
|
54 |
54 |
for category in categories:
|
55 |
55 |
uuid = uuid4()
|
56 |
56 |
Subscription.objects.create(category=category,
|
57 |
57 |
identifier='%s@example.net' % uuid, uuid=uuid)
|
58 |
|
for announce in announces:
|
|
58 |
for i, announce in enumerate(announces):
|
59 |
59 |
broadcast = Broadcast.objects.get(announce=announce)
|
60 |
60 |
broadcast.send()
|
61 |
61 |
assert broadcast.result
|
62 |
|
assert mail.outbox
|
|
62 |
assert len(mailoutbox) == i+1
|
63 |
63 |
|
64 |
64 |
|
65 |
|
def test_check_inline_css(app, categories, announces):
|
66 |
|
for announce in announces:
|
|
65 |
def test_check_inline_css(app, categories, announces, mailoutbox):
|
|
66 |
total_sent = 0
|
|
67 |
for i, announce in enumerate(announces):
|
67 |
68 |
announce.text = '<style type="text/css">h2 {color: #F00}</style>' + announce.text
|
68 |
69 |
announce.save()
|
69 |
70 |
uuid = uuid4()
|
... | ... | |
72 |
73 |
broadcast = Broadcast.objects.get(announce=announce)
|
73 |
74 |
broadcast.send()
|
74 |
75 |
assert broadcast.result
|
75 |
|
assert mail.outbox
|
76 |
|
assert 'h2 style="color:#F00"' in mail.outbox[0].html
|
77 |
|
mail.outbox = []
|
|
76 |
assert len(mailoutbox) == total_sent + broadcast.result
|
|
77 |
total_sent += broadcast.result
|
|
78 |
assert 'h2 style="color:#F00"' in mailoutbox[i].html
|
78 |
79 |
|
79 |
80 |
|
80 |
|
def test_check_inline_images(app, categories, announces):
|
|
81 |
@mock.patch('emails.utils.requests.get')
|
|
82 |
def test_check_inline_images(mocked_get, app, categories, announces, mailoutbox):
|
81 |
83 |
storage = DefaultStorage()
|
82 |
84 |
media_path = os.path.join(os.path.dirname(__file__), 'media')
|
83 |
85 |
image_name = 'logo.png'
|
84 |
86 |
image_name = storage.save(image_name, file(os.path.join(media_path, image_name)))
|
85 |
|
for announce in announces:
|
|
87 |
total_sent = 0
|
|
88 |
for i, announce in enumerate(announces):
|
86 |
89 |
img_src = "/media/%s" % image_name
|
87 |
90 |
announce.text = announce.text + '<img src="%s" />' % img_src
|
88 |
91 |
announce.save()
|
... | ... | |
92 |
95 |
broadcast = Broadcast.objects.get(announce=announce)
|
93 |
96 |
broadcast.send()
|
94 |
97 |
assert broadcast.result
|
95 |
|
assert mail.outbox
|
96 |
|
transformed_image_src = transform_image_src(img_src)
|
97 |
|
assert transformed_image_src in mail.outbox[0].attachments.keys()
|
98 |
|
assert 'cid:%s' % transformed_image_src in mail.outbox[0].html_body
|
99 |
|
assert 'cid:%s' % transformed_image_src in mail.outbox[0].text_body
|
100 |
|
mail.outbox = []
|
|
98 |
|
|
99 |
assert len(mailoutbox) == total_sent + broadcast.result
|
|
100 |
attachments = [a['filename'] for a in mailoutbox[i].attachments.as_dict()]
|
|
101 |
assert image_name in attachments
|
|
102 |
assert 'cid:%s' % image_name in mailoutbox[i].html_body
|
|
103 |
assert 'cid:%s' % image_name in mailoutbox[i].text_body
|
|
104 |
total_sent += broadcast.result
|
101 |
105 |
storage.delete(image_name)
|
102 |
106 |
|
103 |
107 |
|
104 |
|
def test_unsubscription_link(app, categories, announces):
|
|
108 |
def test_unsubscription_link(app, categories, announces, mailoutbox):
|
105 |
109 |
unsubscription_link_sentinel = ''
|
106 |
110 |
for category in categories:
|
107 |
111 |
uuid = uuid4()
|
108 |
112 |
scheme = 'mailto:'
|
109 |
113 |
uri = scheme + '%s@example.net' % uuid
|
110 |
114 |
Subscription.objects.create(category=category, identifier=uri, uuid=str(uuid))
|
111 |
|
for announce in announces:
|
|
115 |
for i, announce in enumerate(announces):
|
112 |
116 |
if announce.category != category:
|
113 |
117 |
continue
|
114 |
118 |
broadcast = Broadcast.objects.get(announce=announce)
|
115 |
119 |
broadcast.send()
|
116 |
120 |
assert broadcast.result
|
117 |
|
assert mail.outbox
|
|
121 |
assert len(mailoutbox) == i+1
|
118 |
122 |
|
119 |
|
signature = urllib.unquote(re.findall('/unsubscribe/(.*)"', mail.outbox[0].html)[0])
|
|
123 |
signature = urllib.unquote(re.findall('/unsubscribe/(.*)"', mailoutbox[i].html)[0])
|
120 |
124 |
unsubscription_link = reverse('unsubscribe', kwargs={'unsubscription_token': signature})
|
121 |
125 |
assert signing.loads(signature) == {
|
122 |
126 |
'category': announce.category.pk, 'identifier': uri}
|
123 |
|
assert mail.outbox[0].subject == announce.title
|
124 |
|
assert unsubscription_link in mail.outbox[0].html
|
125 |
|
assert unsubscription_link in mail.outbox[0].text
|
|
127 |
assert mailoutbox[i].subject == announce.title
|
|
128 |
assert unsubscription_link in mailoutbox[i].html
|
|
129 |
assert unsubscription_link in mailoutbox[i].text
|
126 |
130 |
assert unsubscription_link_sentinel != unsubscription_link
|
127 |
|
mail.outbox = []
|
128 |
131 |
# make sure the uri schema is not in the page
|
129 |
132 |
resp = app.get(unsubscription_link)
|
130 |
133 |
assert scheme not in resp.content
|
tests: use new 'mailoutbox' fixture (#14046)