1 from twisted.internet import reactor |
1 from datetime import datetime |
2 from twisted.internet.defer import inlineCallbacks |
2 from decimal import Decimal |
3 |
3 from mock import patch |
4 from Queue import deque |
|
5 |
|
6 from iro.controller.task import createJob, Task |
|
7 from iro.controller.pool import taskPool, dbPool |
|
8 |
4 |
9 from iro.model.job import exJobs, ExJob |
5 from iro.model.job import exJobs, ExJob |
|
6 from iro.model.pool import data |
|
7 from iro.model.message import SMS |
10 from iro.model.status import Status |
8 from iro.model.status import Status |
11 from iro.model.offer import offers |
9 from iro.model.schema import Job, User, Offer as DBOffer, Userright |
12 from iro.model.pool import data |
|
13 |
10 |
14 from iro.model.message import SMS, Fax, Mail |
11 from iro.controller.task import Task |
15 from iro.model.schema import Job, User, Offer as DBOffer, Userright |
12 |
|
13 from iro.offer.provider import Provider |
|
14 |
16 from iro.telnumber import Telnumber |
15 from iro.telnumber import Telnumber |
17 |
|
18 |
|
19 from iro.offer import Offer, Provider |
|
20 from iro.validate import vInteger |
16 from iro.validate import vInteger |
21 from iro.error import NoRouteForTask |
|
22 |
17 |
23 from .dbtestcase import DBTestCase |
18 from .dbtestcase import DBTestCase |
24 |
19 |
25 class DummyPool(): |
20 class DummyPool(): |
26 def run(self, f,*a,**k): |
21 def run(self, f,*a,**k): |
27 return f(*a,**k) |
22 return f(*a,**k) |
28 |
23 |
|
24 from twisted.python import log |
29 |
25 |
30 class exJobsTest(DBTestCase): |
26 class DummyObserver(object): |
31 '''tests for exJobs''' |
27 def __init__(self): |
|
28 self.e=[] |
32 |
29 |
|
30 def start(self): |
|
31 log.addObserver(self.emit) |
|
32 |
|
33 def stop(self): |
|
34 log.removeObserver(self.emit) |
|
35 |
|
36 def emit(self, eventDict): |
|
37 self.e.append(eventDict) |
|
38 |
|
39 class JobTestCase(DBTestCase): |
33 def setUp(self): |
40 def setUp(self): |
34 DBTestCase.setUp(self) |
41 DBTestCase.setUp(self) |
35 self.pool = data.pool |
42 self.pool = data.pool |
36 data.pool = DummyPool() |
43 data.pool = DummyPool() |
37 |
44 |
38 def tearDown(self): |
45 def tearDown(self): |
39 exJobs.clear() |
46 exJobs.clear() |
40 data.pool = self.pool |
47 data.pool = self.pool |
41 self.pool = None |
48 self.pool = None |
42 DBTestCase.tearDown(self) |
49 DBTestCase.tearDown(self) |
|
50 |
|
51 |
|
52 class exJobsTest(JobTestCase): |
|
53 '''tests for exJobs''' |
43 |
54 |
44 def testCreate(self): |
55 def testCreate(self): |
45 with self.session() as session: |
56 with self.session() as session: |
46 u = User(name='test',apikey='abcdef123456789') |
57 u = User(name='test',apikey='abcdef123456789') |
47 session.add(u) |
58 session.add(u) |
97 self.assertEqual(u.jobs[0].extend,ejob) |
108 self.assertEqual(u.jobs[0].extend,ejob) |
98 |
109 |
99 def testUnknownExJob(self): |
110 def testUnknownExJob(self): |
100 self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890') |
111 self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890') |
101 |
112 |
102 class TestTasks(DBTestCase): |
113 |
103 |
114 class StatiTest(JobTestCase): |
104 def setUp(self): |
115 def setUp(self): |
105 DBTestCase.setUp(self) |
116 JobTestCase.setUp(self) |
106 dbPool.start(reactor) |
117 self.log = DummyObserver() |
|
118 self.log.start() |
107 |
119 |
108 def tearDown(self): |
|
109 exJobs.clear() |
|
110 offers.clear() |
|
111 dbPool.pool.stop() |
|
112 taskPool.pool.q.queue = deque() |
|
113 DBTestCase.tearDown(self) |
|
114 |
|
115 @inlineCallbacks |
|
116 def testCreateSMS(self): |
|
117 with self.session() as session: |
120 with self.session() as session: |
118 u = User(name='test',apikey='abcdef123456789') |
121 u = User(name='test',apikey='abcdef123456789') |
119 session.add(u) |
122 session.add(u) |
|
123 o=DBOffer(name="test", provider="bla", route="a", typ="sms") |
|
124 u.rights.append(Userright(o)) |
|
125 |
|
126 self.user = u |
|
127 self.offer = o |
120 |
128 |
121 job = yield createJob(u,[Telnumber('0123325456')],SMS('sms'),[]) |
129 self.provider=Provider("bla", [], {"sms":["a","b","c"]}) |
122 |
130 self.job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), []) |
123 self.assertEqual(taskPool.pool.q.qsize(),1) |
|
124 |
|
125 self.assertEqual(job.tasks.keys(),[Telnumber('0123325456')]) |
|
126 self.assertIsInstance(job.tasks[Telnumber('0123325456')], Task) |
|
127 |
131 |
128 @inlineCallbacks |
132 def tearDown(self): |
129 def testRun(self): |
133 self.log.stop() |
130 with self.session() as session: |
134 JobTestCase.tearDown(self) |
131 u = User(name='test',apikey='abcdef123456789') |
|
132 session.add(u) |
|
133 o=DBOffer(name="test", provider="bla", route="basic", typ="sms") |
|
134 u.rights.append(Userright(o)) |
|
135 |
|
136 p=Provider(name="p", config={}, typs={"sms":["test",]}) |
|
137 def send(typ,route,recipient,message): |
|
138 return Status(provider=p, route=route, error="Error: Test") |
|
139 p.send=send |
|
140 offers["test"] = Offer("test",provider=p, route="test", typ="sms") |
|
141 |
|
142 exjob = yield exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test']) |
|
143 |
|
144 task=Task(Telnumber('123456789'), exjob) |
|
145 ret = yield task._run() |
|
146 self.assertIsInstance(ret, Status) |
|
147 self.assertEqual(ret.provider, p) |
|
148 self.assertEqual(ret.route, "test") |
|
149 self.assertEqual(ret.status, Status.ERROR) |
|
150 self.assertEqual(ret.error, "Error: Test") |
|
151 |
|
152 @inlineCallbacks |
|
153 def testNoRoute(self): |
|
154 with self.session() as session: |
|
155 u = User(name='test',apikey='abcdef123456789') |
|
156 session.add(u) |
|
157 |
|
158 exjob = yield exJobs.create(u, [Telnumber('123456789')], SMS('test'), []) |
|
159 |
|
160 task=Task(Telnumber('123456789'), exjob) |
|
161 d = task._run() |
|
162 self.assertFailure(d, NoRouteForTask) |
|
163 |
135 |
164 |
136 |
165 #def testCreateFax(self): |
137 def testSetError(self): |
166 # with self.session() as session: |
138 self.job.setError(Task(Telnumber('123456789'),self),Exception("muhaha")) |
167 # u = User(name='test',apikey='abcdef123456789') |
139 errors = self.flushLoggedErrors(Exception) |
168 # session.add(u) |
140 self.assertEqual(len(errors), 1) |
169 # job = createJob(u,[Telnumber('0123325456')],Fax('header','fax',[]),[]) |
141 self.assertEqual(self.log.e[0]['why'], "Error: Job(%s) to '0049123456789' failed."%self.job.dbjob) |
|
142 |
|
143 with self.session() as session: |
|
144 u = session.merge(self.user) |
|
145 job = u.job(self.job.dbjob) |
|
146 self.assertEqual(job.status,"error") |
170 |
147 |
171 # self.assertEqual(taskPool.pool.q.qsize(),1) |
148 def testSetStatus(self): |
|
149 task = Task(Telnumber('123456789'),self.job) |
|
150 status = Status(self.provider,"a") |
|
151 self.job.setStatus(task, status) |
|
152 |
|
153 self.assertEqual(self.log.e[0]['message'], ("Job(%s) to '0049123456789' ended sucecessfully via bla:a."%self.job.dbjob,)) |
|
154 |
|
155 with self.session() as session: |
|
156 u = session.merge(self.user) |
|
157 job = u.job(self.job.dbjob) |
|
158 self.assertEqual(job.status,"sended") |
|
159 self.assertEqual(len(job.messages),0) |
172 |
160 |
173 #def testCreateMail(self): |
161 def testMultipleRecipients(self): |
174 # with self.session() as session: |
162 self.job.recipients.append(Telnumber("01234567890")) |
175 # u = User(name='test',apikey='abcdef123456789') |
163 task = Task(Telnumber('123456789'),self.job) |
176 # session.add(u) |
164 status = Status(self.provider,"a") |
177 # job = createJob(u,[],Mail('sub','body','t@t.de'),[]) |
165 self.job.setStatus(task, status) |
|
166 |
|
167 with self.session() as session: |
|
168 u = session.merge(self.user) |
|
169 job = u.job(self.job.dbjob) |
|
170 self.assertEqual(job.status,"sending") |
|
171 |
|
172 |
|
173 |
|
174 @patch("iro.model.job.datetime") |
|
175 def testCosts(self,p_dt): |
|
176 p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5) |
|
177 task = Task(Telnumber('123456789'),self.job) |
|
178 status = Status(self.provider,"a") |
|
179 status.costs = 0.055 |
|
180 |
|
181 self.job.setStatus(task, status) |
|
182 |
|
183 with self.session() as session: |
|
184 u = session.merge(self.user) |
|
185 o = session.merge(self.offer) |
|
186 job = u.job(self.job.dbjob) |
|
187 self.assertEqual(job.status,"sended") |
|
188 self.assertEqual(len(job.messages),1) |
|
189 |
|
190 msg = job.messages[0] |
|
191 self.assertEqual(msg.price,Decimal('0.0550')) |
|
192 self.assertEqual(msg.isBilled,False) |
|
193 self.assertEqual(msg.recipient,str(Telnumber('123456789'))) |
|
194 self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5)) |
|
195 self.assertEqual(msg.offer,o) |