|
1 from datetime import datetime |
|
2 from decimal import Decimal |
|
3 from mock import patch |
|
4 |
|
5 from iro.model.job import exJobs, ExJob |
|
6 from iro.model.pool import data |
|
7 from iro.model.message import SMS |
|
8 from iro.model.status import Status |
|
9 from iro.model.schema import Job, User, Offer as DBOffer, Userright |
|
10 |
|
11 from iro.controller.task import Task |
|
12 |
|
13 from iro.offer.provider import Provider |
|
14 |
|
15 from iro.telnumber import Telnumber |
|
16 from iro.validate import vInteger |
|
17 |
|
18 from ..test_helpers.dbtestcase import DBTestCase |
|
19 |
|
20 class DummyPool(): |
|
21 def run(self, f,*a,**k): |
|
22 return f(*a,**k) |
|
23 |
|
24 from twisted.python import log |
|
25 |
|
26 class DummyObserver(object): |
|
27 def __init__(self): |
|
28 self.e=[] |
|
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): |
|
40 def setUp(self): |
|
41 DBTestCase.setUp(self) |
|
42 self.pool = data.pool |
|
43 data.pool = DummyPool() |
|
44 |
|
45 def tearDown(self): |
|
46 exJobs.clear() |
|
47 data.pool = self.pool |
|
48 self.pool = None |
|
49 DBTestCase.tearDown(self) |
|
50 |
|
51 |
|
52 class exJobsTest(JobTestCase): |
|
53 '''tests for exJobs''' |
|
54 |
|
55 def testCreate(self): |
|
56 with self.session() as session: |
|
57 u = User(name='test',apikey='abcdef123456789') |
|
58 session.add(u) |
|
59 |
|
60 job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test']) |
|
61 self.assertIsInstance(job, ExJob) |
|
62 self.assertTrue(vInteger(job.dbjob, None, minv=0 )) |
|
63 self.assertEqual(job.message, SMS('test')) |
|
64 self.assertEqual(job.recipients, [Telnumber('123456789')]) |
|
65 self.assertEqual(job.offers,[]) |
|
66 self.assertEqual(job.tasks,{}) |
|
67 |
|
68 with self.session() as session: |
|
69 j = session.query(Job.id).all() |
|
70 self.assertEqual(j,[(job.dbjob,)]) |
|
71 |
|
72 self.assertEqual(exJobs[job.dbjob],job) |
|
73 |
|
74 def testCreate2(self): |
|
75 with self.session() as session: |
|
76 u = User(name='test',apikey='abcdef123456789') |
|
77 session.add(u) |
|
78 o=DBOffer(name="test", provider="bla", route="basic", typ="sms") |
|
79 u.rights.append(Userright(o)) |
|
80 |
|
81 job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test']) |
|
82 self.assertEqual(job.offers,['test']) |
|
83 |
|
84 def testGet(self): |
|
85 with self.session() as session: |
|
86 u = User(name='test',apikey='abcdef123456789') |
|
87 session.add(u) |
|
88 |
|
89 job = ExJob(None, [Telnumber('123456789')], SMS('test'), ['test']) |
|
90 exJobs[1] = job |
|
91 |
|
92 self.assertEqual(len(exJobs), 1) |
|
93 self.assertEqual(job, exJobs[1]) |
|
94 |
|
95 def testGetFromDB(self): |
|
96 with self.session() as session: |
|
97 u = User(name='test',apikey='abcdef123456789') |
|
98 job = Job( info="info", status="started") |
|
99 u.jobs.append(job) |
|
100 session.add(u) |
|
101 |
|
102 with self.session() as session: |
|
103 job = session.merge(job) |
|
104 u = session.merge(u) |
|
105 ejob= ExJob(job.id, [Telnumber('123456789')], SMS('test'), ['test']) |
|
106 exJobs[job.id]=ejob |
|
107 self.assertEqual(job.extend, ejob) |
|
108 self.assertEqual(u.jobs[0].extend,ejob) |
|
109 |
|
110 def testUnknownExJob(self): |
|
111 self.assertRaises(KeyError,exJobs.__getitem__,'a1234567890') |
|
112 |
|
113 |
|
114 class StatiTest(JobTestCase): |
|
115 def setUp(self): |
|
116 JobTestCase.setUp(self) |
|
117 self.log = DummyObserver() |
|
118 self.log.start() |
|
119 |
|
120 with self.session() as session: |
|
121 u = User(name='test',apikey='abcdef123456789') |
|
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 |
|
128 |
|
129 self.provider=Provider("bla", {"sms":["a","b","c"]}) |
|
130 self.job = exJobs.create(u, [Telnumber('123456789')], SMS('test'), []) |
|
131 |
|
132 def tearDown(self): |
|
133 self.log.stop() |
|
134 JobTestCase.tearDown(self) |
|
135 |
|
136 |
|
137 def testSetError(self): |
|
138 self.job.setError(Task(Telnumber('123456789'),self),Exception("muhaha")) |
|
139 errors = self.flushLoggedErrors(Exception) |
|
140 self.assertEqual(len(errors), 1) |
|
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") |
|
147 |
|
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) |
|
160 |
|
161 def testMultipleRecipients(self): |
|
162 self.job.recipients.append(Telnumber("01234567890")) |
|
163 task = Task(Telnumber('123456789'),self.job) |
|
164 status = Status(self.provider,"a") |
|
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 @patch("iro.model.job.datetime") |
|
173 def testCosts(self,p_dt): |
|
174 p_dt.today.return_value = datetime(2000, 1, 2, 3, 4, 5) |
|
175 task = Task(Telnumber('123456789'),self.job) |
|
176 status = Status(self.provider,"a",costs=0.055,exID="12345678",count=1) |
|
177 |
|
178 self.job.setStatus(task, status) |
|
179 |
|
180 with self.session() as session: |
|
181 u = session.merge(self.user) |
|
182 o = session.merge(self.offer) |
|
183 job = u.job(self.job.dbjob) |
|
184 self.assertEqual(job.status,"sended") |
|
185 self.assertEqual(len(job.messages),1) |
|
186 |
|
187 msg = job.messages[0] |
|
188 self.assertEqual(msg.price,Decimal('0.0550')) |
|
189 self.assertEqual(msg.isBilled,False) |
|
190 self.assertEqual(msg.recipient,str(Telnumber('123456789'))) |
|
191 self.assertEqual(msg.date,datetime(2000, 1, 2, 3, 4, 5)) |
|
192 self.assertEqual(msg.offer,o) |
|
193 self.assertEqual(msg.exID,"12345678") |
|
194 self.assertEqual(msg.count,1) |