source: main/waeup.kwarapoly/branches/uli-pdfsigs/src/waeup/kwarapoly/interswitch/tests.py @ 11887

Last change on this file since 11887 was 11865, checked in by Henrik Bettermann, 10 years ago

Increase school fees and change bank account numbers.

  • Property svn:keywords set to Id
File size: 34.8 KB
Line 
1## $Id: tests.py 11865 2014-10-21 19:16:07Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18import os
19import grok
20import pytz
21from datetime import datetime, date, timedelta
22from hurry.workflow.interfaces import IWorkflowState
23from zope.component import createObject, getUtility
24from zope.catalog.interfaces import ICatalog
25from zope.event import notify
26from waeup.kofa.applicants.container import ApplicantsContainer
27from waeup.kofa.university.faculty import Faculty
28from waeup.kofa.university.department import Department
29from waeup.kofa.students.tests.test_browser import StudentsFullSetup
30from waeup.kofa.applicants.tests.test_browser import ApplicantsFullSetup
31from waeup.kofa.configuration import SessionConfiguration
32from waeup.kwarapoly.testing import FunctionalLayer
33from waeup.kwarapoly.students.payments import CustomStudentOnlinePayment
34
35# Also run tests that send requests to external servers?
36#   If you enable this, please make sure the external services
37#   do exist really and are not bothered by being spammed by a test programme.
38EXTERNAL_TESTS = False
39
40def external_test(func):
41    if not EXTERNAL_TESTS:
42        myself = __file__
43        if myself.endswith('.pyc'):
44            myself = myself[:-2]
45        print "WARNING: external tests are skipped!"
46        print "WARNING: edit %s to enable them." % myself
47        return
48    return func
49
50
51class InterswitchTestsStudents(StudentsFullSetup):
52    """Tests for the Interswitch payment gateway.
53    """
54
55    layer = FunctionalLayer
56
57    def setUp(self):
58        super(InterswitchTestsStudents, self).setUp()
59
60        # Create at least one Kwarapoly faculty
61        self.app['faculties']['CPGS'] = Faculty(code='CPGS')
62        self.app['faculties']['CPGS']['dep1'] = Department(code='dep1')
63        self.certificate2 = createObject('waeup.Certificate')
64        self.certificate2.code = u'CERT2'
65        self.certificate2.application_category = 'basic'
66        self.certificate2.study_mode = 'nd_ft'
67        self.certificate2.start_level = 100
68        self.certificate2.end_level = 300
69        self.app['faculties']['CPGS']['dep1'].certificates.addCertificate(
70            self.certificate2)
71        # Set study course attributes of test student
72        self.student['studycourse'].certificate = self.certificate2
73        self.student['studycourse'].current_session = 2004
74        self.student['studycourse'].entry_session = 2004
75        self.student['studycourse'].current_verdict = 'A'
76        self.student['studycourse'].current_level = 100
77        # Set local lga
78        self.student.lga = u'kwara_asa'
79        # Update the catalog
80        notify(grok.ObjectModifiedEvent(self.student))
81
82
83    def test_schoolfee_ticket_creation(self):
84        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
85        self.browser.open(self.payments_path)
86        IWorkflowState(self.student).setState('cleared')
87        self.browser.open(self.payments_path + '/addop')
88        self.browser.getControl(name="form.p_category").value = ['schoolfee']
89        self.browser.getControl("Create ticket").click()
90        self.assertMatches('...Book and pay for accommodation first...',
91                           self.browser.contents)
92        # We add a fake maint. payment ticket to meet the condition
93        maint_payment = CustomStudentOnlinePayment()
94        self.student['payments']['any_key'] = maint_payment
95        maint_payment.p_category = 'hostel_maintenance'
96        maint_payment.p_state = 'unpaid'
97        maint_payment.p_session = 2004
98        self.browser.getControl(name="form.p_category").value = ['schoolfee']
99        self.browser.getControl("Create ticket").click()
100        self.assertMatches('...Book and pay for accommodation first...',
101                           self.browser.contents)
102        # Ticket must be paid
103        maint_payment.p_state = 'paid'
104        self.browser.getControl(name="form.p_category").value = ['schoolfee']
105        self.browser.getControl("Create ticket").click()
106        self.assertMatches('...ticket created...',
107                           self.browser.contents)
108        ctrl = self.browser.getControl(name='val_id')
109        self.value = ctrl.options[1]
110        self.browser.getLink(self.value).click()
111        self.assertMatches('...Amount Authorized...',
112                           self.browser.contents)
113        self.assertMatches(
114            '...<span>39400.0</span>...',
115            self.browser.contents)
116        self.payment_url = self.browser.url
117
118
119#    def callback_url(self, payment_url, resp, apprAmt):
120#        return payment_url + (
121#            '/isw_callback?echo=' +
122#            '&resp=%s' +
123#            '&desc=Something went wrong' +
124#            '&txnRef=p1331792385335' +
125#            '&payRef=' + '&retRef=' +
126#            '&cardNum=0' +
127#            '&apprAmt=%s' +
128#            '&url=http://xyz') % (resp, apprAmt)
129
130    def test_interswitch_form(self):
131
132        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
133        self.browser.open(self.payments_path)
134        # In KwaraPoly only returning students can create school fee payment
135        # without haveing paid accommodation fee
136        IWorkflowState(self.student).setState('returning')
137        configuration = createObject('waeup.SessionConfiguration')
138        configuration.academic_session = 2005
139        self.app['configuration'].addSessionConfiguration(configuration)
140        self.browser.open(self.payments_path + '/addop')
141        self.browser.getControl(name="form.p_category").value = ['schoolfee']
142        self.browser.getControl("Create ticket").click()
143        self.assertMatches('...ticket created...', self.browser.contents)
144        ctrl = self.browser.getControl(name='val_id')
145        self.value = ctrl.options[0]
146        self.browser.getLink(self.value).click()
147        self.assertMatches('...Amount Authorized...', self.browser.contents)
148        self.assertMatches(
149            '...<span>30500.0</span>...',
150            self.browser.contents)
151        self.payment_url = self.browser.url
152
153        # Manager can access InterswitchForm
154        self.assertEqual(self.student['payments'][self.value].provider_amt, 0.0)
155        self.assertEqual(self.student['payments'][self.value].gateway_amt, 0.0)
156        self.assertEqual(self.student['payments'][self.value].thirdparty_amt, 0.0)
157        self.browser.getLink("CollegePAY", index=0).click()
158        # Split amounts have been set.
159        self.assertEqual(self.student['payments'][self.value].provider_amt, 1200.0)
160        self.assertEqual(self.student['payments'][self.value].gateway_amt, 300.0)
161        self.assertEqual(self.student['payments'][self.value].thirdparty_amt, 1800.0)
162        self.assertMatches('...Total Amount Authorized:...',
163                           self.browser.contents)
164        self.assertTrue(
165            '<input type="hidden" name="amount" value="3050000" />' in
166            self.browser.contents)
167        self.assertTrue(
168            'item_name="School Fee" item_amt="2720000" bank_id="120" acct_num="1771586608"' in
169            self.browser.contents)
170        self.assertTrue(
171            'item_name="Dalash" item_amt="180000" bank_id="117" acct_num="1013196791"' in
172            self.browser.contents)
173        self.assertTrue(
174            'item_name="BT Education" item_amt="120000" bank_id="117" acct_num="1010764827"' in
175            self.browser.contents)
176
177        # Let's do the same for maintenance fee payment
178
179        self.browser.open(self.payments_path)
180        self.browser.open(self.payments_path + '/addop')
181        self.browser.getControl(
182            name="form.p_category").value = ['hostel_maintenance']
183        self.browser.getControl("Create ticket").click()
184        self.assertMatches('...You have not yet booked accommodation...',
185                           self.browser.contents)
186        # Students have to book bed first
187        self.browser.open(self.acco_path)
188        IWorkflowState(self.student).setState('admitted')
189        self.browser.getLink("Book accommodation").click()
190        self.assertFalse('Activation Code:' in self.browser.contents)
191        self.browser.getControl("Create bed ticket").click()
192        # Bed is randomly selected but, since there is only
193        # one bed for this student, we know that ...
194        self.assertMatches('...Hall 1, Block A, Room 101, Bed A...',
195                           self.browser.contents)
196        self.assertMatches('...ticket created...',
197                           self.browser.contents)
198        self.browser.open(self.payments_path + '/addop')
199        self.browser.getControl(
200            name="form.p_category").value = ['hostel_maintenance']
201        self.browser.getControl("Create ticket").click()
202        self.assertMatches('...ticket created...',
203                           self.browser.contents)
204        ctrl = self.browser.getControl(name='val_id')
205        value = ctrl.options[1]
206        self.browser.getLink(value).click()
207        self.assertMatches('...Amount Authorized...',
208                           self.browser.contents)
209        # Maint fee is taken from the hostel object
210        self.assertMatches(
211            '...<span>876.0</span>...',
212            self.browser.contents)
213        self.payment_url = self.browser.url
214        # Manager can access InterswitchForm
215        self.browser.getLink("CollegePAY", index=0).click()
216        # Split amounts have been set.
217        self.assertEqual(self.student['payments'][value].provider_amt, 0.0)
218        self.assertEqual(self.student['payments'][value].thirdparty_amt, 0.0)
219        self.assertEqual(self.student['payments'][value].gateway_amt, 300.0)
220        # The total amount to be processed by Interswitch
221        # has been reduced by the Interswitch fee of 150 Nairas
222        self.assertMatches('...Total Amount Authorized:...',
223                           self.browser.contents)
224        self.assertMatches(
225            '...<input type="hidden" name="pay_item_id" value="102" />...',
226            self.browser.contents)
227        self.assertMatches(
228            '...<input type="hidden" name="amount" value="87600" />...',
229            self.browser.contents)
230        self.assertMatches(
231            '...item_name="Hostel Maintenance Fee" item_amt="57600" bank_id="31" acct_num="0039050937"...',
232            self.browser.contents)
233
234        # Create carryover ticket
235        self.browser.open(self.payments_path + '/addop')
236        self.browser.getControl(name="form.p_category").value = ['carryover1']
237        self.browser.getControl("Create ticket").click()
238        ctrl = self.browser.getControl(name='val_id')
239        value = ctrl.options[2]
240        self.browser.getLink(value).click()
241        self.assertMatches(
242            '...<span>6000.0</span>...',
243            self.browser.contents)
244        # Manager can access InterswitchForm
245        self.browser.getLink("CollegePAY", index=0).click()
246        # Split amounts have been set.
247        self.assertEqual(self.student['payments'][self.value].provider_amt, 1200.0)
248        self.assertEqual(self.student['payments'][self.value].gateway_amt, 300.0)
249        self.assertEqual(self.student['payments'][self.value].thirdparty_amt, 1800.0)
250        self.assertMatches('...<input type="hidden" name="pay_item_id" value="101" />...',
251                           self.browser.contents)
252        self.assertMatches('...Total Amount Authorized:...',
253                           self.browser.contents)
254        self.assertMatches(
255            '...<input type="hidden" name="amount" value="600000" />...',
256            self.browser.contents)
257        self.assertMatches(
258            '...item_name="School Fee" item_amt="270000" bank_id="120" acct_num="1771586608"...',
259            self.browser.contents)
260        self.assertMatches(
261            '...item_name="Dalash" item_amt="180000" bank_id="117" acct_num="1013196791"...',
262            self.browser.contents)
263        self.assertMatches(
264            '...item_name="BT Education" item_amt="120000" bank_id="117" acct_num="1010764827"...',
265            self.browser.contents)
266
267    def test_interswitch_form_new_payment_cats(self):
268        # only a few categories covered
269
270        self.app['configuration']['2004'].certificate_fee = 6800.0
271        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
272        self.browser.open(self.payments_path + '/addop')
273        self.browser.getControl(name="form.p_category").value = ['certificate']
274        self.browser.getControl("Create ticket").click()
275        self.assertMatches('...ticket created...', self.browser.contents)
276        ctrl = self.browser.getControl(name='val_id')
277        value = ctrl.options[0]
278        self.browser.getLink(value).click()
279        self.assertMatches('...Amount Authorized...', self.browser.contents)
280        self.assertMatches(
281            '...<span>6800.0</span>...', self.browser.contents)
282        self.browser.getLink("CollegePAY", index=0).click()
283        self.assertEqual(self.student['payments'][value].amount_auth, 6800.0)
284        self.assertEqual(self.student['payments'][value].provider_amt, 300.0)
285        self.assertEqual(self.student['payments'][value].gateway_amt, 300.0)
286        self.assertEqual(self.student['payments'][value].thirdparty_amt, 200.0)
287
288        self.app['configuration']['2004'].transcript_local_fee = 5000.0
289        self.browser.open(self.payments_path + '/addop')
290        self.browser.getControl(name="form.p_category").value = ['transcript_local']
291        self.browser.getControl("Create ticket").click()
292        ctrl = self.browser.getControl(name='val_id')
293        value = ctrl.options[1]
294        self.browser.getLink(value).click()
295        self.assertMatches('...Amount Authorized...', self.browser.contents)
296        self.assertMatches(
297            '...<span>5000.0</span>...', self.browser.contents)
298        self.payment_url = self.browser.url
299        self.browser.getLink("CollegePAY", index=0).click()
300        self.assertEqual(self.student['payments'][value].amount_auth, 5000.0)
301        self.assertEqual(self.student['payments'][value].provider_amt, 300.0)
302        self.assertEqual(self.student['payments'][value].gateway_amt, 300.0)
303        self.assertEqual(self.student['payments'][value].thirdparty_amt, 200.0)
304
305        self.app['configuration']['2004'].loss_idcard_fee = 1015.0
306        self.browser.open(self.payments_path + '/addop')
307        self.browser.getControl(name="form.p_category").value = ['loss_idcard']
308        self.browser.getControl("Create ticket").click()
309        ctrl = self.browser.getControl(name='val_id')
310        value = ctrl.options[2]
311        self.browser.getLink(value).click()
312        self.assertMatches('...Amount Authorized...', self.browser.contents)
313        self.assertMatches(
314            '...<span>1015.0</span>...', self.browser.contents)
315        self.payment_url = self.browser.url
316        self.browser.getLink("CollegePAY", index=0).click()
317        self.assertEqual(self.student['payments'][value].amount_auth, 1015.0)
318        self.assertEqual(self.student['payments'][value].provider_amt, 9.0)
319        self.assertEqual(self.student['payments'][value].gateway_amt, 15.22)
320        self.assertEqual(self.student['payments'][value].thirdparty_amt, 6.0)
321
322        self.app['configuration']['2004'].loss_examcard_fee = 500.0
323        self.browser.open(self.payments_path + '/addop')
324        self.browser.getControl(name="form.p_category").value = ['loss_examcard']
325        self.browser.getControl("Create ticket").click()
326        ctrl = self.browser.getControl(name='val_id')
327        value = ctrl.options[3]
328        self.browser.getLink(value).click()
329        self.assertMatches('...Amount Authorized...', self.browser.contents)
330        self.assertMatches(
331            '...<span>500.0</span>...', self.browser.contents)
332        self.payment_url = self.browser.url
333        self.browser.getLink("CollegePAY", index=0).click()
334        self.assertEqual(self.student['payments'][value].amount_auth, 500.0)
335        self.assertEqual(self.student['payments'][value].provider_amt, 4.5)
336        self.assertEqual(self.student['payments'][value].gateway_amt, 7.5)
337        self.assertEqual(self.student['payments'][value].thirdparty_amt, 3)
338
339        self.app['configuration']['2004'].change_inst_fee = 6000.0
340        self.browser.open(self.payments_path + '/addop')
341        self.browser.getControl(name="form.p_category").value = ['change_inst']
342        self.browser.getControl("Create ticket").click()
343        ctrl = self.browser.getControl(name='val_id')
344        value = ctrl.options[4]
345        self.browser.getLink(value).click()
346        self.assertMatches('...Amount Authorized...', self.browser.contents)
347        self.assertMatches(
348            '...<span>6000.0</span>...', self.browser.contents)
349        self.payment_url = self.browser.url
350        self.browser.getLink("CollegePAY", index=0).click()
351        self.assertEqual(self.student['payments'][value].amount_auth, 6000.0)
352        self.assertEqual(self.student['payments'][value].provider_amt, 300.0)
353        self.assertEqual(self.student['payments'][value].gateway_amt, 300.0)
354        self.assertEqual(self.student['payments'][value].thirdparty_amt, 200.0)
355
356        self.app['configuration']['2004'].loss_result_fee = 7000.0
357        self.browser.open(self.payments_path + '/addop')
358        self.browser.getControl(name="form.p_category").value = ['loss_result']
359        self.browser.getControl("Create ticket").click()
360        ctrl = self.browser.getControl(name='val_id')
361        value = ctrl.options[5]
362        self.browser.getLink(value).click()
363        self.assertMatches('...Amount Authorized...', self.browser.contents)
364        self.assertMatches(
365            '...<span>7000.0</span>...', self.browser.contents)
366        self.payment_url = self.browser.url
367        self.browser.getLink("CollegePAY", index=0).click()
368        self.assertEqual(self.student['payments'][value].amount_auth, 7000.0)
369        self.assertEqual(self.student['payments'][value].provider_amt, 300.0)
370        self.assertEqual(self.student['payments'][value].gateway_amt, 300.0)
371        self.assertEqual(self.student['payments'][value].thirdparty_amt, 200.0)
372
373        self.app['configuration']['2004'].loss_idcard_fee = 1900.0
374        self.browser.open(self.payments_path + '/addop')
375        self.browser.getControl(name="form.p_category").value = ['loss_idcard']
376        self.browser.getControl("Create ticket").click()
377        ctrl = self.browser.getControl(name='val_id')
378        value = ctrl.options[6]
379        self.browser.getLink(value).click()
380        self.assertMatches('...Amount Authorized...', self.browser.contents)
381        self.assertMatches(
382            '...<span>1900.0</span>...', self.browser.contents)
383        self.payment_url = self.browser.url
384        self.browser.getLink("CollegePAY", index=0).click()
385        self.assertEqual(self.student['payments'][value].amount_auth, 1900.0)
386        self.assertEqual(self.student['payments'][value].provider_amt, 9.0)
387        self.assertEqual(self.student['payments'][value].gateway_amt, 28.5)
388        self.assertEqual(self.student['payments'][value].thirdparty_amt, 6.0)
389
390
391    @external_test
392    def test_webservice(self):
393        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
394        IWorkflowState(self.student).setState('cleared')
395        # We add a fake maint. payment ticket to meet the condition
396        maint_payment = CustomStudentOnlinePayment()
397        self.student['payments']['any_key'] = maint_payment
398        maint_payment.p_category = 'hostel_maintenance'
399        maint_payment.p_state = 'paid'
400        maint_payment.p_session = 2004
401        # We create the school fee payment ticket
402        self.browser.open(self.payments_path + '/addop')
403        self.browser.getControl(name="form.p_category").value = ['schoolfee']
404        self.browser.getControl("Create ticket").click()
405        self.assertMatches('...ticket created...',
406                           self.browser.contents)
407        ctrl = self.browser.getControl(name='val_id')
408        self.value = ctrl.options[1]
409        self.browser.getLink(self.value).click()
410        self.payment_url = self.browser.url
411        # First we have open InterswitchPageStudent to set provider_amt
412        # and gateway_amt
413        self.browser.open(self.payment_url + '/goto_interswitch')
414        # Now we can call the webservice
415        self.browser.open(self.payment_url + '/request_webservice')
416        self.assertMatches('...Unsuccessful callback...',
417                          self.browser.contents)
418        # The payment is now in state failed ...
419        self.assertMatches('...<span>Failed</span>...',
420                          self.browser.contents)
421        # ... and the catalog has been updated
422        cat = getUtility(ICatalog, name='payments_catalog')
423        results = list(
424            cat.searchResults(p_state=('failed', 'failed')))
425        self.assertEqual(len(results), 1)
426        self.assertEqual(results[0].p_state, 'failed')
427
428        # Let's replace the p_id with a valid p_id of the Kwarapoly
429        # live system. This is definitely not an appropriate
430        # solution for testing, but we have no choice since
431        # Interswitch doesn't provide any interface
432        # for testing.
433        payment = self.student['payments'][self.value]
434        payment.p_id = 'p3543612043224'
435        self.browser.open(self.payment_url + '/request_webservice')
436        self.assertMatches('...Callback amount does not match...',
437                          self.browser.contents)
438        # The payment is now in state failed ...
439        self.assertMatches('...<span>Failed</span>...',
440                          self.browser.contents)
441        # Let's replace the amount autorized with the amount of the
442        # live system payment
443        payment.amount_auth = payment.r_amount_approved
444        self.browser.open(self.payment_url + '/request_webservice')
445        self.assertMatches('...Successful payment...',
446                          self.browser.contents)
447        # The payment is now in state paid ...
448        self.assertMatches('...<span>Paid</span>...',
449                          self.browser.contents)
450        # ... and the catalog has been updated
451        cat = getUtility(ICatalog, name='payments_catalog')
452        results = list(
453            cat.searchResults(p_state=('paid', 'paid')))
454        self.assertEqual(len(results), 1)
455        self.assertEqual(results[0].p_state, 'paid')
456        # Approval is logged in students.log ...
457        logfile = os.path.join(
458            self.app['datacenter'].storage, 'logs', 'students.log')
459        logcontent = open(logfile).read()
460        self.assertTrue(
461            'zope.mgr - '
462            'waeup.kwarapoly.interswitch.browser.CustomInterswitchPaymentRequestWebservicePageStudent - '
463            'W1000000 - successful schoolfee payment: p3543612043224\n'
464            in logcontent)
465        # ... and in payments.log
466        logfile = os.path.join(
467            self.app['datacenter'].storage, 'logs', 'payments.log')
468        logcontent = open(logfile).read()
469        self.assertTrue(
470            '"zope.mgr",W1000000,p3543612043224,schoolfee,'
471            '52100.0,00,1200.0,300.0,1800.0,,,\n'
472            in logcontent)
473
474
475class InterswitchTestsApplicants(ApplicantsFullSetup):
476    """Tests for the Interswitch payment gateway.
477    """
478
479    layer = FunctionalLayer
480
481    def setUp(self):
482        super(InterswitchTestsApplicants, self).setUp()
483        configuration = SessionConfiguration()
484        configuration.academic_session = datetime.now().year - 2
485        self.app['configuration'].addSessionConfiguration(configuration)
486        self.configuration = configuration
487        # Create at least one Kwarapoly faculty
488        self.app['faculties']['CPGS'] = Faculty(code='CPGS')
489        self.app['faculties']['CPGS']['dep1'] = Department(code='dep1')
490        self.certificate2 = createObject('waeup.Certificate')
491        self.certificate2.code = u'CERT2'
492        self.certificate2.application_category = 'ndft'
493        self.certificate2.study_mode = 'nd_ft'
494        self.certificate2.start_level = 100
495        self.certificate2.end_level = 300
496        self.app['faculties']['CPGS']['dep1'].certificates.addCertificate(
497            self.certificate2)
498        self.applicantscontainer.application_category = 'ndft'
499        self.applicant.applicant_id = u'nd_anything'
500       
501        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
502        self.browser.open(self.manage_path)
503        #IWorkflowState(self.student).setState('started')
504        super(InterswitchTestsApplicants, self).fill_correct_values()
505        self.browser.getControl(name="form.course1").value = ['CERT2']
506        self.applicantscontainer.application_fee = 3333.0
507        self.browser.getControl(name="form.nationality").value = ['NG']
508        self.browser.getControl(name="transition").value = ['start']
509        self.browser.getControl("Save").click()
510        self.browser.getControl("Add online").click()
511        self.assertMatches('...ticket created...',
512                           self.browser.contents)
513        self.assertMatches('...Amount Authorized...',
514                           self.browser.contents)
515        self.assertMatches(
516            '...<span>3333.0</span>...',
517            self.browser.contents)
518        self.payment_url = self.browser.url
519
520
521    def test_interswitch_form(self):
522
523        # Manager can access InterswitchForm
524        self.browser.getLink("CollegePAY", index=0).click()
525        self.assertMatches('...Total Amount Authorized:...',
526                           self.browser.contents)
527        self.assertTrue(
528            '<input type="hidden" name="amount" value="333300" />'
529            in self.browser.contents)
530        self.assertTrue(
531            '<item_detail item_id="1" item_name="Application Fee" '
532            'item_amt="253300" bank_id="120" acct_num="1771440667" />'
533            in self.browser.contents)
534
535        # Meanwhile hndft fee goes to same account
536        self.applicant.applicant_id = u'hnd_anything'
537        self.browser.open(self.manage_path)
538        ctrl = self.browser.getControl(name='val_id')
539        value = ctrl.options[0]
540        self.browser.getLink(value).click()
541        self.browser.getLink("CollegePAY", index=0).click()
542        self.assertTrue(
543            '<item_detail item_id="1" item_name="Application Fee" '
544            'item_amt="253300" bank_id="120" acct_num="1771440667" />'
545            in self.browser.contents)
546        # Commission or bribe?
547        self.assertTrue(
548            '<item_detail item_id="2" item_name="Dalash" item_amt="20000" '
549            'bank_id="117" acct_num="1013196791" />'
550            in self.browser.contents)
551        self.assertTrue(
552            '<item_detail item_id="3" item_name="BT Education" '
553            'item_amt="30000" bank_id="117" acct_num="1010764827" />'
554            in self.browser.contents)
555
556        # prehndft fee goes to another account
557        self.applicant.applicant_id = u'prehnd_anything'
558        self.browser.open(self.manage_path)
559        ctrl = self.browser.getControl(name='val_id')
560        value = ctrl.options[0]
561        self.browser.getLink(value).click()
562        self.browser.getLink("CollegePAY", index=0).click()
563        self.assertTrue(
564            '<item_detail item_id="1" item_name="Application Fee" '
565            'item_amt="253300" bank_id="10" acct_num="0106259811" />'
566            in self.browser.contents)
567        # No 'commission', no provider fee in 2013
568        #self.assertFalse('Dalash' in self.browser.contents)
569        #self.assertFalse('BT Education' in self.browser.contents)
570        # Comission is charged from 14/09/2014
571        self.assertTrue(
572            '<item_detail item_id="2" item_name="Dalash" item_amt="20000" '
573            'bank_id="117" acct_num="1013196791" />'
574            in self.browser.contents)
575        self.assertTrue(
576            '<item_detail item_id="3" item_name="BT Education" '
577            'item_amt="30000" bank_id="117" acct_num="1010764827" />'
578            in self.browser.contents)
579
580        # prejambites fee goes to another account
581        self.applicant.applicant_id = u'prejambites_anything'
582        self.browser.open(self.manage_path)
583        ctrl = self.browser.getControl(name='val_id')
584        value = ctrl.options[0]
585        self.browser.getLink(value).click()
586        self.browser.getLink("CollegePAY", index=0).click()
587        self.assertTrue(
588            '<item_detail item_id="1" item_name="Application Fee" '
589            'item_amt="253300" bank_id="8" acct_num="2013910271" />'
590            in self.browser.contents)
591        # No 'commission', no provider fee in 2013
592        #self.assertFalse('Dalash' in self.browser.contents)
593        #self.assertFalse('BT Education' in self.browser.contents)
594        # Comission is charged from 14/09/2014
595        self.assertTrue(
596            '<item_detail item_id="2" item_name="Dalash" item_amt="20000" '
597            'bank_id="117" acct_num="1013196791" />'
598            in self.browser.contents)
599        self.assertTrue(
600            '<item_detail item_id="3" item_name="BT Education" '
601            'item_amt="30000" bank_id="117" acct_num="1010764827" />'
602            in self.browser.contents)
603        self.assertTrue(
604            '<input type="hidden" name="pay_item_id" value="104" />'
605            in self.browser.contents)
606
607
608    def prepare_special_container(self):
609        # Add special application container
610        container_name = u'special%s' % (datetime.now().year - 2)
611        applicantscontainer = ApplicantsContainer()
612        applicantscontainer.code = container_name
613        applicantscontainer.prefix = 'special'
614        applicantscontainer.year = datetime.now().year - 2
615        applicantscontainer.title = u'This is a special app container'
616        applicantscontainer.application_category = 'no'
617        applicantscontainer.mode = 'create'
618        delta = timedelta(days=10)
619        applicantscontainer.startdate = datetime.now(pytz.utc) - delta
620        applicantscontainer.enddate = datetime.now(pytz.utc) + delta
621        applicantscontainer.strict_deadline = True
622        self.app['applicants'][container_name] = applicantscontainer
623        # Add an applicant
624        applicant = createObject('waeup.Applicant')
625        # reg_number is the only field which has to be preset here
626        # because managers are allowed to edit this required field
627        applicant.reg_number = u'12345'
628        applicant.firstname = u'Vorname'
629        applicant.lastname = u'Nachname'
630        applicant.email = 'aa@aa.aa'
631        applicant.special_application = u'transcript_local'
632        applicant.applicant_id = u'special_anything'
633        self.app['applicants'][container_name].addApplicant(applicant)
634        self.special_applicant = applicant
635        self.configuration.transcript_local_fee = 5300.0
636        self.special_manage_path = 'http://localhost/app/applicants/%s/%s/%s' % (
637            container_name, applicant.application_number, 'manage')
638
639    def test_interswitch_form_special(self):
640        self.prepare_special_container()
641        self.browser.open(self.special_manage_path)
642        self.browser.getControl("Add online").click()
643        self.assertMatches('...ticket created...',
644                           self.browser.contents)
645        self.browser.getLink("CollegePAY", index=0).click()
646        self.assertTrue(
647            '<item_detail item_id="1" item_name="ND Transcript (local)" '
648            'item_amt="450000" bank_id="9" acct_num="7000016724" />'
649            in self.browser.contents)
650
651        self.special_applicant.special_application = u'log_book'
652        self.configuration.log_book_fee = 570.5
653        self.browser.open(self.special_manage_path)
654        self.browser.getControl("Add online").click()
655        self.assertMatches('...ticket created...',
656                           self.browser.contents)
657        self.browser.getLink("CollegePAY", index=0).click()
658        # The university gets 570.5 - (1.5% x 570.5) - 3 - 4.5
659        self.assertTrue(
660            '<item_detail item_id="1" item_name="Log Book Fees" '
661            'item_amt="55444" bank_id="117" acct_num="1010508401" />'
662            in self.browser.contents)
663
664
665    @external_test
666    def test_webservice(self):
667        self.prepare_special_container()
668        IWorkflowState(self.special_applicant).setState('started')
669        self.browser.open(self.special_manage_path)
670        self.browser.getControl("Add online").click()
671        payment_url = self.browser.url
672        self.browser.open(payment_url + '/request_webservice')
673        self.assertMatches('...Unsuccessful callback...',
674                          self.browser.contents)
675        # The payment is now in state failed
676        self.assertMatches('...<span>Failed</span>...',
677                          self.browser.contents)
678        # Let's replace the p_id with a valid p_id of the Kwarapoly
679        # live system. This is definitely not an appropriate
680        # solution for testing, but we have no choice since
681        # Interswitch doesn't provide any interface
682        # for testing.
683        p_id = self.special_applicant.keys()[0]
684        payment = self.special_applicant[p_id]
685        payment.p_id = 'p3543612043224'
686        self.browser.open(payment_url + '/request_webservice')
687        self.assertMatches('...Callback amount does not match...',
688                          self.browser.contents)
689        payment.amount_auth = payment.r_amount_approved
690
691        self.browser.open(payment_url + '/request_webservice')
692        self.assertMatches('...Successful payment...',
693                          self.browser.contents)
694        # The payment is now in state paid ...
695        self.assertMatches('...<span>Paid</span>...',
696                          self.browser.contents)
697        # ... and the catalog has been updated
698        cat = getUtility(ICatalog, name='payments_catalog')
699        results = list(
700            cat.searchResults(p_state=('paid', 'paid')))
701        self.assertEqual(len(results), 1)
702        self.assertEqual(results[0].p_state, 'paid')
703        # Approval is logged in applicants.log ...
704        logfile = os.path.join(
705            self.app['datacenter'].storage, 'logs', 'applicants.log')
706        logcontent = open(logfile).read()
707        self.assertTrue(
708            'zope.mgr - waeup.kwarapoly.interswitch.browser.CustomInterswitchPaymentRequestWebservicePageApplicant'
709            ' - special_anything - successful payment: p3543612043224\n'
710            in logcontent)
711        # ... and in payments.log
712        logfile = os.path.join(
713            self.app['datacenter'].storage, 'logs', 'payments.log')
714        logcontent = open(logfile).read()
715        self.assertTrue(
716            '"zope.mgr",special_anything,p3543612043224,transcript_local,52100.0,'
717            '00,0.0,0.0,0.0,,,\n'
718            in logcontent)
719        self.assertEqual(self.applicant.state, 'started')
720        # Special Payment applicant can add new payment
721        self.browser.open(self.edit_path)
722        self.assertTrue('Add online payment ticket' in self.browser.contents)
Note: See TracBrowser for help on using the repository browser.