source: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/etranzact/tests.py @ 15599

Last change on this file since 15599 was 15598, checked in by Henrik Bettermann, 5 years ago

Application payment should work now.

  • Property svn:keywords set to Id
File size: 7.5 KB
Line 
1## $Id: tests.py 15598 2019-09-20 13:14:07Z henrik $
2##
3## Copyright (C) 2017 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 unittest
20import random
21import json
22import hashlib
23import httplib
24from urllib import urlencode
25from datetime import datetime, timedelta, date
26from zope.component import createObject, getUtility
27from zope.catalog.interfaces import ICatalog
28from hurry.workflow.interfaces import IWorkflowState
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 kofacustom.nigeria.students.payments import NigeriaStudentOnlinePayment
33from kofacustom.nigeria.testing import FunctionalLayer
34from kofacustom.nigeria.etranzact.helpers import (
35    query_history,)
36
37#from kofacustom.nigeria.etranzact.helpers import (query_etranzact)
38
39# Also run tests that send requests to external servers?
40#   If you enable this, please make sure the external services
41#   do exist really and are not bothered by being spammed by a test programme.
42
43EXTERNAL_TESTS = True
44
45TERMINAL_ID = '0000000001'
46HOST = 'demo.etranzact.com'
47HTTPS = True
48SECRET_KEY = 'DEMO_KEY'
49LOGO_URL = 'https://iuokada.waeup.org/static_custom/iou_logo.png'
50
51# Valid transaction id in eTranzact system
52TID = 'p5689785145198'
53
54def external_test(func):
55    if not EXTERNAL_TESTS:
56        myself = __file__
57        if myself.endswith('.pyc'):
58            myself = myself[:-1]
59        print "WARNING: external tests are skipped!"
60        print "WARNING: edit %s to enable them." % myself
61        return
62    return func
63
64def post_caller(host, https, terminal_id, transaction_id, responseurl,
65                        amount_auth, email, phone, display_fullname, hashvalue,
66                        logo_url):
67    headers={"Content-type": "application/x-www-form-urlencoded",
68             "Accept": "text/plain"}
69    url = "/webconnect/v3/caller.jsp"
70    if https:
71        h = httplib.HTTPSConnection(host)
72    else:
73        h = httplib.HTTPConnection(host)
74    args = {'TERMINAL_ID': terminal_id,
75            'TRANSACTION_ID': transaction_id,
76            'RESPONSE_URL': responseurl,
77            'AMOUNT': amount_auth,
78            'EMAIL': email,
79            'PHONENO': phone,
80            'FULL_NAME': display_fullname,
81            'CURRENCY_CODE': 'NGN',
82            'CHECKSUM': hashvalue,
83            'LOGO_URL': logo_url,
84            }
85    h.request('POST', url, urlencode(args), headers)
86    return
87    response = h.getresponse()
88    if response.status!=200:
89        return 'Connection error (%s, %s)' % (response.status, response.reason)
90    resp = response.read()
91    return resp
92
93def create_transaction(transaction_id):
94    responseurl = 'http://xxxx'
95    amount = '4444.0'
96    email = 'aa@aa.ng'
97    phone = '12324'
98    display_fullname = 'Tester'
99    logo_url = 'http://xxxx'
100    hashargs =  amount + TERMINAL_ID + transaction_id \
101        + responseurl + 'DEMO_KEY'
102    hashvalue = hashlib.md5(hashargs).hexdigest()
103    response = post_caller(HOST, HTTPS, TERMINAL_ID,
104                         transaction_id, responseurl,
105                         amount, email, phone,
106                         display_fullname, hashvalue,
107                         logo_url)
108    return response
109
110
111class HelperTests(unittest.TestCase):
112
113    terminal_id = TERMINAL_ID
114
115    @external_test
116    def test_query_history(self):
117        transaction_id = str(random.randint(100000000, 999999999))
118        raw, formvars = query_history(HOST, self.terminal_id,
119                                transaction_id, HTTPS)
120        self.assertTrue(
121            'Transaction with the given transaction_id (%s) not found'
122            % transaction_id in raw)
123        # Okay, let's create a transaction
124        caller_response = create_transaction(transaction_id)
125        self.assertEqual(caller_response, None)
126        # It seems that the transaction has been created but we don't get a
127        # useful response
128        raw, formvars = query_history(HOST, self.terminal_id,
129                                transaction_id, HTTPS)
130        self.assertTrue(
131            '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"\r\n    '
132            '"http://www.w3.org/TR/html4/loose.dtd">' in raw)
133        # The same, an 'empty' response obviously means that the transaction
134        # was found but no result was  sent to the response_url because the
135        # payment was cancelled.
136
137        # Peter: No response would be returned because payment status information
138        # was not saved. Whenever you get a null response, means payment was
139        # not received only payments with error code 0 is successful.
140        # So in this case transaction fails.
141
142        # We manually created and tried to pay a transaction
143        # which seems to be valid till next restart of the demo portal.
144        raw, formvars = query_history(HOST, self.terminal_id, TID, HTTPS)
145        # Now eTranzact is redirecting but the response is still useless
146        self.assertTrue('Redirecting...' in raw)
147        self.assertEqual(formvars['TRANSACTION_ID'], TID)
148        return
149
150class EtranzactTestsApplicants(ApplicantsFullSetup):
151    """Tests for the Etranzact payment gateway.
152    """
153
154    layer = FunctionalLayer
155
156    def setUp(self):
157        super(EtranzactTestsApplicants, self).setUp()
158        configuration = SessionConfiguration()
159        configuration.academic_session = datetime.now().year - 2
160        configuration.etranzact_enabled = True
161        self.app['configuration'].addSessionConfiguration(configuration)
162        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
163        self.browser.open(self.manage_path)
164        #IWorkflowState(self.student).setState('started')
165        super(EtranzactTestsApplicants, self).fill_correct_values()
166        self.applicantscontainer.application_fee = 3333.0
167        self.browser.getControl(name="form.nationality").value = ['NG']
168        self.browser.getControl(name="transition").value = ['start']
169        self.browser.getControl("Save").click()
170        self.browser.getControl("Add online").click()
171        self.assertMatches('...ticket created...',
172                           self.browser.contents)
173        self.payment = self.applicant.values()[0]
174        self.payment_url = self.browser.url
175
176    @external_test
177    def test_views(self):
178        # Manager can access eTranzact form
179        self.browser.getLink("Pay via eTranzact").click()
180        self.assertTrue("Pay now" in self.browser.contents)
181        # Means of testing end here.
182        # We requery an existing paiment now.
183        self.payment.p_id = TID
184        self.browser.open(self.payment_url)
185        self.browser.getLink("Requery eTranzact History").click()
186        self.assertTrue('Wrong checksum.' in self.browser.contents)
187        # ... probably because responseurl of the transaction stored in the
188        # system and the responseurl generated in process_response are
189        # different
190        # Means of testing end here again.
191        return
192
193
Note: See TracBrowser for help on using the repository browser.