[#5123] Attraper les time-out lors de l'envoi de courriels
[auf_django_mailing.git] / tests / tests.py
1 # -*- encoding: utf-8 -*-
2 from django.contrib.sites.models import Site
3 from django.core import mail
4 from django.db import models
5 from django.db.models.fields import CharField
6 from django.db.models.fields.related import ForeignKey
7
8 from django.test import TestCase
9
10 from auf.django.mailing.models import EntreeLog, Enveloppe, envoyer,\
11 ModeleCourriel, generer_jeton, TAILLE_JETON
12
13 class TestDestinataire(models.Model):
14 adresse_courriel = CharField(max_length=128)
15 nom = CharField(max_length=64)
16
17
18 class TestEnveloppeParams(models.Model):
19 destinataire = ForeignKey(TestDestinataire)
20 enveloppe = ForeignKey(Enveloppe, unique=True)
21 jeton = CharField(max_length=TAILLE_JETON)
22
23 def save(self, *args, **kwargs):
24 if not self.jeton:
25 self.jeton = generer_jeton(TAILLE_JETON)
26 super(TestEnveloppeParams, self).save(*args, **kwargs)
27
28 def get_adresse(self):
29 return self.destinataire.adresse_courriel
30
31 def get_corps_context(self):
32 context = {
33 'nom_destinataire' : self.destinataire.nom,
34 'jeton': self.jeton,
35 }
36 return context
37
38
39 class MailTest(TestCase):
40
41 def setUp(self):
42 self.dest1 = TestDestinataire(adresse_courriel='dest1@test.org',
43 nom='nom dest1')
44 self.dest1.save()
45 self.dest2 = TestDestinataire(adresse_courriel='dest2@test.org',
46 nom='nom dest2')
47 self.dest2.save()
48 self.modele_courriel = ModeleCourriel(code='mod_test',
49 sujet='sujet_modele', corps='{{ nom_destinataire }}{{ url }}',
50 html=False)
51 self.modele_courriel.save()
52 mail.outbox = []
53
54 def get_site(self):
55 return Site.objects.all()[0]
56
57 def create_enveloppe_params(self, dest):
58 enveloppe = Enveloppe(modele=self.modele_courriel)
59 enveloppe.save()
60 enveloppe_params = TestEnveloppeParams(enveloppe=enveloppe, destinataire=dest)
61 enveloppe_params.save()
62 return enveloppe, enveloppe_params
63
64
65 def test_envoi_simple(self):
66 enveloppe, enveloppe_params = self.create_enveloppe_params(self.dest1)
67
68 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy')
69
70 self.assertEqual(len(mail.outbox), 1)
71 self.assertEqual(mail.outbox[0].body, self.dest1.nom +
72 'http://example.com/acces/' + enveloppe_params.jeton)
73 self.assertEqual(mail.outbox[0].to, [self.dest1.adresse_courriel])
74
75 entrees_log = EntreeLog.objects.all()
76 self.assertEqual(len(entrees_log), 1)
77 self.assertEqual(entrees_log[0].enveloppe, enveloppe)
78 self.assertEqual(entrees_log[0].adresse, self.dest1.adresse_courriel)
79
80 # normalement un deuxième envoi ne devrait rien envoyer de ce qui a
81 # déjà été logué
82 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy')
83 self.assertEqual(len(mail.outbox), 1)
84 entrees_log = EntreeLog.objects.all()
85 self.assertEqual(len(entrees_log), 1)
86
87 # par contre si une erreur s'est produite l'envoi devrait être retenté
88 entrees_log[0].erreur = u'libellé erreur'
89 entrees_log[0].save()
90 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy')
91 self.assertEqual(len(mail.outbox), 2)
92 entrees_log = EntreeLog.objects.all()
93 self.assertEqual(len(entrees_log), 2)
94
95 # mais pas si on demande que les erreurs ne soient pas retentées
96 EntreeLog.objects.all()[1].delete()
97 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', retry_errors=False)
98 self.assertEqual(len(mail.outbox), 2)
99 entrees_log = EntreeLog.objects.all()
100 self.assertEqual(len(entrees_log), 1)
101
102 entrees_log[0].delete()
103
104 # le courriel devrait également être renvoyé si l'adresse du destinataire
105 # a changé
106 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', retry_errors=False)
107 self.dest1.adresse_courriel = 'autre_adresse@test.org'
108 self.dest1.save()
109 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy')
110 self.assertEqual(len(mail.outbox), 4)
111 entrees_log = EntreeLog.objects.all()
112 self.assertEqual(len(entrees_log), 2)
113
114 def test_limit(self):
115 self.create_enveloppe_params(self.dest1)
116 self.create_enveloppe_params(self.dest2)
117 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', limit=1, retry_errors=False)
118 self.assertEqual(len(mail.outbox), 1)
119 envoyer(self.modele_courriel.code, 'expediteur@test.org', self.get_site(), 'dummy', limit=1, retry_errors=False)
120 self.assertEqual(len(mail.outbox), 2)
121
122
123
124
125
126
127
128
129