|
1 from twisted.internet.defer import inlineCallbacks |
|
2 |
|
3 from datetime import datetime |
|
4 from decimal import Decimal |
|
5 from mock import patch, Mock |
|
6 |
|
7 from iro.model.job import exJobs |
|
8 from iro.model.pool import data |
|
9 from iro.model.schema import User, Offer as DBOffer, Userright |
|
10 from iro.model.message import SMS, Mail |
|
11 from iro.model import offer |
|
12 |
|
13 from iro.controller.task import Task, taskPool |
|
14 from iro.telnumber import Telnumber |
|
15 |
|
16 from iro.offer import Smstrade, SMTP, Offer |
|
17 from iro.offer.smstrade import SmstradeException, StatusCode |
|
18 |
|
19 from ..test_helpers.dbtestcase import DBTestCase |
|
20 |
|
21 class DummyPool(): |
|
22 def run(self, f,*a,**k): |
|
23 return f(*a,**k) |
|
24 |
|
25 def run( f,*a,**k): |
|
26 return f(*a,**k) |
|
27 |
|
28 from twisted.python import log |
|
29 |
|
30 class DummyObserver(object): |
|
31 def __init__(self): |
|
32 self.e=[] |
|
33 |
|
34 def start(self): |
|
35 log.addObserver(self.emit) |
|
36 |
|
37 def stop(self): |
|
38 log.removeObserver(self.emit) |
|
39 |
|
40 def emit(self, eventDict): |
|
41 self.e.append(eventDict) |
|
42 |
|
43 |
|
44 |
|
45 class IntegratedOfferTests(DBTestCase): |
|
46 def setUp(self): |
|
47 DBTestCase.setUp(self) |
|
48 self.pool = data.pool |
|
49 data.pool = DummyPool() |
|
50 |
|
51 self.taskPool = taskPool.run |
|
52 taskPool.run = run |
|
53 |
|
54 self.log = DummyObserver() |
|
55 self.log.start() |
|
56 |
|
57 def tearDown(self): |
|
58 self.log.stop() |
|
59 exJobs.clear() |
|
60 data.pool = self.pool |
|
61 self.pool = None |
|
62 taskPool.run = self.taskPool |
|
63 self.taskPool = None |
|
64 DBTestCase.tearDown(self) |
|
65 |
|
66 |
|
67 @patch("iro.model.job.datetime") |
|
68 @patch("urllib.urlopen") |
|
69 @inlineCallbacks |
|
70 def testSmstrade(self, p_u, p_dt): |
|
71 f = Mock() |
|
72 f.readlines.return_value = ["100","12345678","0.055","1"] |
|
73 p_u.return_value = f |
|
74 |
|
75 p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5) |
|
76 |
|
77 with self.session() as session: |
|
78 u = User(name='test',apikey='abcdef123456789') |
|
79 session.add(u) |
|
80 o=DBOffer(name="s", provider="bla", route="basic", typ="sms") |
|
81 u.rights.append(Userright(o)) |
|
82 |
|
83 |
|
84 offer.providers["bla"] = Smstrade("bla") |
|
85 offer.providers["bla"].key = "XXXXXX" |
|
86 offer.offers["s"] = Offer("s",offer.providers["bla"],"basic","sms") |
|
87 |
|
88 j = yield exJobs.create(u,[Telnumber("0123456789")],SMS("bla"),['s'],'tesched') |
|
89 t = Task(Telnumber("0123456789"),j) |
|
90 yield t.start() |
|
91 |
|
92 self.assertEqual(self.log.e[0]['message'], ("Job(%s) to '0049123456789' ended sucecessfully via bla:basic."%j.dbjob,)) |
|
93 |
|
94 with self.session() as session: |
|
95 u = session.merge(u) |
|
96 o = session.merge(o) |
|
97 job = u.job(j.dbjob) |
|
98 self.assertEqual(job.status,"sended") |
|
99 self.assertEqual(job.info,"tesched") |
|
100 self.assertEqual(len(job.messages),1) |
|
101 |
|
102 msg = job.messages[0] |
|
103 self.assertEqual(msg.price,Decimal('0.0550')) |
|
104 self.assertEqual(msg.isBilled,False) |
|
105 self.assertEqual(msg.recipient,str(Telnumber('123456789'))) |
|
106 self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5)) |
|
107 self.assertEqual(msg.offer,o) |
|
108 self.assertEqual(msg.exID,"12345678") |
|
109 self.assertEqual(msg.count,1) |
|
110 |
|
111 |
|
112 @patch("urllib.urlopen") |
|
113 @inlineCallbacks |
|
114 def testSmstradeException(self, mock_urlopen): |
|
115 f = Mock() |
|
116 f.readlines.return_value = ["703"] |
|
117 mock_urlopen.return_value = f |
|
118 |
|
119 with self.session() as session: |
|
120 u = User(name='test',apikey='abcdef123456789') |
|
121 session.add(u) |
|
122 o=DBOffer(name="s", provider="bla", route="basic", typ="sms") |
|
123 u.rights.append(Userright(o)) |
|
124 |
|
125 offer.providers["bla"] = Smstrade("bla") |
|
126 offer.providers["bla"].key = "XXXXXX" |
|
127 offer.offers["s"] = Offer("s",offer.providers["bla"],"basic","sms") |
|
128 |
|
129 j = yield exJobs.create(u,[Telnumber("0123456789")],SMS("bla"),['s'],'tesched') |
|
130 t = Task(Telnumber("0123456789"),j) |
|
131 yield t.start() |
|
132 |
|
133 errors = self.flushLoggedErrors(SmstradeException) |
|
134 self.assertEqual(len(errors), 1) |
|
135 self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to '0049123456789' failed."%j.dbjob) |
|
136 |
|
137 self.assertEqual(t.error, True) |
|
138 self.assertEqual(str(t.status.value),str(SmstradeException(StatusCode(703)))) |
|
139 |
|
140 with self.session() as session: |
|
141 u = session.merge(u) |
|
142 o = session.merge(o) |
|
143 job = u.job(j.dbjob) |
|
144 self.assertEqual(job.status,"error") |
|
145 self.assertEqual(len(job.messages),0) |
|
146 |
|
147 @patch("smtplib.SMTP") |
|
148 @inlineCallbacks |
|
149 def testSmtp(self, p_s ): |
|
150 with self.session() as session: |
|
151 u = User(name='test',apikey='abcdef123456789') |
|
152 session.add(u) |
|
153 o=DBOffer(name="s", provider="bla", route=None, typ="mail") |
|
154 u.rights.append(Userright(o)) |
|
155 |
|
156 offer.providers["bla"] = SMTP("bla") |
|
157 offer.providers["bla"].SSL = False |
|
158 offer.providers["bla"].TLS = False |
|
159 offer.providers["bla"].host = "localhost" |
|
160 offer.providers["bla"].port = 12345 |
|
161 offer.providers["bla"].user = "" |
|
162 offer.providers["bla"].send_from = "frm@test.de" |
|
163 offer.offers["s"] = Offer("s",offer.providers["bla"],None,"mail") |
|
164 |
|
165 j = yield exJobs.create(u,["t@test.de"],Mail("bla",'msg',None),['s'],'tesched') |
|
166 t = Task("t@test.de",j) |
|
167 yield t.start() |
|
168 |
|
169 self.assertEqual(self.log.e[0]['message'], ("Job(%s) to 't@test.de' ended sucecessfully via bla:None."%j.dbjob,)) |
|
170 |
|
171 with self.session() as session: |
|
172 u = session.merge(u) |
|
173 o = session.merge(o) |
|
174 job = u.job(j.dbjob) |
|
175 self.assertEqual(job.status,"sended") |
|
176 self.assertEqual(job.info,"tesched") |
|
177 self.assertEqual(len(job.messages),0) |
|
178 |
|
179 @patch("smtplib.SMTP") |
|
180 @inlineCallbacks |
|
181 def testSmtpException(self, p_s): |
|
182 p_s.side_effect = IOError(111,"Connection refused") |
|
183 with self.session() as session: |
|
184 u = User(name='test',apikey='abcdef123456789') |
|
185 session.add(u) |
|
186 o=DBOffer(name="s", provider="bla", route=None, typ="mail") |
|
187 u.rights.append(Userright(o)) |
|
188 |
|
189 offer.providers["bla"] = SMTP("bla") |
|
190 offer.providers["bla"].SSL = False |
|
191 offer.providers["bla"].TLS = False |
|
192 offer.providers["bla"].host = "localhost" |
|
193 offer.providers["bla"].port = 12345 |
|
194 offer.providers["bla"].user = "" |
|
195 offer.providers["bla"].send_from = "frm@test.de" |
|
196 offer.offers["s"] = Offer("s",offer.providers["bla"],None,"mail") |
|
197 |
|
198 j = yield exJobs.create(u,["t@test.de"],Mail("bla",'msg',None),['s'],'tesched') |
|
199 t = Task("t@test.de",j) |
|
200 yield t.start() |
|
201 |
|
202 errors = self.flushLoggedErrors(IOError) |
|
203 self.assertEqual(len(errors), 1) |
|
204 self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to 't@test.de' failed."%j.dbjob |
|
205 ) |
|
206 self.assertEqual(t.error, True) |
|
207 self.assertEqual(str(t.status.value),str(IOError(111,"Connection refused"))) |
|
208 |
|
209 with self.session() as session: |
|
210 u = session.merge(u) |
|
211 o = session.merge(o) |
|
212 job = u.job(j.dbjob) |
|
213 self.assertEqual(job.status,"error") |
|
214 self.assertEqual(len(job.messages),0) |
|
215 |