source: main/waeup.uniben/trunk/src/waeup/uniben/applicants/tests/test_browser.py @ 18100

Last change on this file since 18100 was 18100, checked in by Henrik Bettermann, 8 days ago

Fix tests.

  • Property svn:keywords set to Id
File size: 20.3 KB
Line 
1# -*- coding: utf-8 -*-
2## $Id: test_browser.py 18100 2025-06-29 09:35:51Z henrik $
3##
4## Copyright (C) 2013 Uli Fouquet & Henrik Bettermann
5## This program is free software; you can redistribute it and/or modify
6## it under the terms of the GNU General Public License as published by
7## the Free Software Foundation; either version 2 of the License, or
8## (at your option) any later version.
9##
10## This program is distributed in the hope that it will be useful,
11## but WITHOUT ANY WARRANTY; without even the implied warranty of
12## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13## GNU General Public License for more details.
14##
15## You should have received a copy of the GNU General Public License
16## along with this program; if not, write to the Free Software
17## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18##
19"""
20Test the applicant-related UI components.
21"""
22import os
23import datetime
24import pytz
25from StringIO import StringIO
26from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
27from zope.securitypolicy.interfaces import IPrincipalRoleManager
28from zope.component import createObject, getUtility
29from waeup.kofa.interfaces import IUserAccount
30from waeup.kofa.browser.tests.test_pdf import samples_dir
31from waeup.kofa.applicants.container import ApplicantsContainer
32from waeup.uniben.testing import FunctionalLayer
33from waeup.uniben.configuration import CustomSessionConfiguration
34from waeup.kofa.applicants.tests.test_browser import ApplicantsFullSetup, PH_LEN
35
36session_1 = datetime.datetime.now().year - 2
37SAMPLE_IMAGE = os.path.join(os.path.dirname(__file__), 'test_image.jpg')
38
39class CustomApplicantUITests(ApplicantsFullSetup):
40    # Tests for uploading/browsing the passport image of appplicants
41
42    layer = FunctionalLayer
43
44    #def setUp(self):
45    #    super(CustomApplicantUITests, self).setUp()
46    #    return
47
48    def fill_correct_values(self):
49        # Fill the edit form with suitable values
50        self.browser.getControl(name="form.firstname").value = 'John'
51        self.browser.getControl(name="form.middlename").value = 'Anthony'
52        self.browser.getControl(name="form.lastname").value = 'Tester'
53        self.browser.getControl(name="form.course1").value = ['CERT1']
54        self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
55        self.browser.getControl(name="form.sex").value = ['m']
56        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
57        self.browser.getControl(name="form.phone.ext").value = '12345'
58
59    def test_applicant_access(self):
60        # Anonymous users can't see the application fee.
61        self.browser.open(self.container_path)
62        self.assertFalse('Application Fee' in self.browser.contents)
63        # Applicants can edit their record
64        self.browser.open(self.login_path)
65        self.login()
66        self.assertTrue(
67            'You logged in as an applicant.' in self.browser.contents)
68        self.browser.open(self.edit_path)
69        self.assertTrue(self.browser.url != self.login_path)
70        self.assertEqual(self.browser.headers['Status'], '200 Ok')
71        self.fill_correct_values()
72        self.browser.getControl("Save").click()
73        self.assertMatches('...Form has been saved...', self.browser.contents)
74        # Applicants can't see the application fee.
75        self.browser.open(self.container_path)
76        self.assertFalse('Application Fee' in self.browser.contents)
77        return
78       
79    def image_url(self, filename):
80        return self.edit_path.replace('edit', filename)
81
82    def test_upload_passport_wo_permission(self):
83        # Create CRPU officer
84        self.app['users'].addUser('mrcrpu', 'mrCrpusecret1')
85        self.app['users']['mrcrpu'].email = 'mrcrpu@foo.ng'
86        self.app['users']['mrcrpu'].title = 'Carlo Pitter'
87        prmglobal = IPrincipalRoleManager(self.app)
88        prmglobal.assignRoleToPrincipal('waeup.CCOfficer', 'mrcrpu')
89        # Login as CRPU officer
90        self.browser.open(self.login_path)
91        self.browser.getControl(name="form.login").value = 'mrcrpu'
92        self.browser.getControl(name="form.password").value = 'mrCrpusecret1'
93        self.browser.getControl("Login").click()
94        self.assertMatches('...You logged in...', self.browser.contents)
95        # Let's try to change the passport image
96        self.browser.open(self.manage_path)
97        self.fill_correct_values()
98        # Create a pseudo image file and select it to be uploaded in form
99        pseudo_image = StringIO('I pretend to be a graphics file')
100        ctrl = self.browser.getControl(name='form.passport')
101        file_ctrl = ctrl.mech_control
102        file_ctrl.add_file(pseudo_image, filename='myphoto.jpg')
103        self.browser.getControl("Save").click()
104        self.assertMatches('...You are not entitled to upload passport pictures...',
105            self.browser.contents)
106        # The officer still sees the placeholder passport image
107        self.browser.open(self.image_url('passport.jpg'))
108        self.assertEqual(
109            self.browser.headers['content-type'], 'image/jpeg')
110        self.assertEqual(len(self.browser.contents), PH_LEN)
111        # After adding the additional role ...
112        prmglobal.assignRoleToPrincipal('waeup.PassportPictureManager', 'mrcrpu')
113        # ... passport pictures can be uploaded
114        self.browser.open(self.manage_path)
115        self.fill_correct_values()
116        pseudo_image = StringIO('I pretend to be a graphics file')
117        ctrl = self.browser.getControl(name='form.passport')
118        file_ctrl = ctrl.mech_control
119        file_ctrl.add_file(pseudo_image, filename='myphoto.jpg')
120        self.browser.getControl("Save").click()
121        self.assertMatches('...Form has been saved...', self.browser.contents)
122        # There is a correct <img> link included
123        self.assertTrue(
124            '<img src="passport.jpg" height="180px" />' in self.browser.contents)
125        # Browsing the link shows a real image
126        self.browser.open(self.image_url('passport.jpg'))
127        self.assertEqual(
128            self.browser.headers['content-type'], 'image/jpeg')
129        self.assertEqual(len(self.browser.contents), 31)
130
131    def test_pay_admission_checking_fee(self):
132        IWorkflowState(self.applicant).setState('admitted')
133        self.applicant.screening_score = 55.0
134        self.applicant.course_admitted = self.certificate
135        self.login()
136        # SessionConfiguration is not set, thus admission checking payment
137        # is not necessary. Screening results and course admitted are visible.
138        self.assertFalse(
139            'Add admission checking payment ticket' in self.browser.contents)
140        self.assertTrue('<a href="http://localhost/app/faculties/fac1/dep1/certificates/CERT1">CERT1 - Unnamed Certificate</a>' in self.browser.contents)
141        self.assertTrue('<span>55.0</span>' in self.browser.contents)
142        configuration = CustomSessionConfiguration()
143        configuration.academic_session = datetime.datetime.now().year - 2
144        self.app['configuration'].addSessionConfiguration(configuration)
145        # Admission checking fee is 0, thus admission checking payment
146        # is not necessary. Screening results and course admitted are visible.
147        self.browser.open(self.view_path)
148        self.assertFalse(
149            'Add admission checking payment ticket' in self.browser.contents)
150        self.assertTrue('<a href="http://localhost/app/faculties/fac1/dep1/certificates/CERT1">CERT1 - Unnamed Certificate</a>' in self.browser.contents)
151        self.assertTrue('<span>55.0</span>' in self.browser.contents)
152        configuration.admchecking_fee = 22.0
153        # Admission checking payment button is now visible, but screening results
154        # and course admitted are not.
155        self.browser.open(self.view_path)
156        self.assertTrue(
157            'Add admission checking payment ticket' in self.browser.contents)
158        self.assertFalse('<a href="http://localhost/app/faculties/fac1/dep1/certificates/CERT1">CERT1 - Unnamed Certificate</a>' in self.browser.contents)
159        self.assertFalse('<span>55.0</span>' in self.browser.contents)
160        # Application slip can't be downloaded
161        self.assertFalse('Download application slip' in self.browser.contents)
162        slip_path = self.view_path + '/application_slip.pdf'
163        self.browser.open(slip_path)
164        self.assertTrue(
165            'Please pay admission checking fee before trying to download'
166            in self.browser.contents)
167        # Pay admission checking fee.
168        self.browser.getControl("Add admission checking").click()
169        p_id = self.applicant.keys()[0]
170        self.applicant[p_id].p_state = 'paid'
171        # Screening results and course admitted are visible after payment.
172        self.browser.open(self.view_path)
173        self.assertFalse(
174            'Add admission checking payment ticket' in self.browser.contents)
175        self.assertTrue('<a href="http://localhost/app/faculties/fac1/dep1/certificates/CERT1">CERT1 - Unnamed Certificate</a>' in self.browser.contents)
176        self.assertTrue('<span>55.0</span>' in self.browser.contents)
177        # Application slip can be downloaded again.
178        self.browser.getLink("Download application slip").click()
179        self.assertEqual(self.browser.headers['Status'], '200 Ok')
180        self.assertEqual(self.browser.headers['Content-Type'],
181                         'application/pdf')
182        return
183
184    def test_application_slips(self):
185
186        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
187        self.browser.open(self.manage_path)
188        self.assertEqual(self.browser.headers['Status'], '200 Ok')
189        self.fill_correct_values()
190        self.browser.getControl("Save").click()
191        IWorkflowState(self.applicant).setState('submitted')
192        self.browser.open(self.view_path)
193        self.browser.getLink("Download application slip").click()
194        self.assertEqual(self.browser.headers['Status'], '200 Ok')
195        self.assertEqual(self.browser.headers['Content-Type'],
196                         'application/pdf')
197        path = os.path.join(samples_dir(), 'application_slip.pdf')
198        open(path, 'wb').write(self.browser.contents)
199        print "Sample application_slip.pdf written to %s" % path
200        # Screening invitation letter is not yet available
201        self.browser.open(self.view_path)
202        self.assertFalse('invitation slip' in self.browser.contents)
203        self.browser.open(self.view_path + '/screening_invitation_slip.pdf')
204        self.assertTrue('Forbidden' in self.browser.contents)
205        self.applicant.screening_date = u'any date'
206        self.applicant.screening_venue = u'MAIN AUDITORIUM'
207        self.applicantscontainer.application_slip_notice = u'This is an additional notice.'
208        # The invitation letter can be printed
209        self.browser.open(self.view_path)
210        self.browser.getLink("invitation").click()
211        self.assertEqual(self.browser.headers['Status'], '200 Ok')
212        self.assertEqual(self.browser.headers['Content-Type'],
213                         'application/pdf')
214        path = os.path.join(samples_dir(), 'screening_invitation_slip.pdf')
215        open(path, 'wb').write(self.browser.contents)
216        print "Sample screening_invitation_slip.pdf written to %s" % path
217
218    def test_akoka_application_slip(self):
219
220        # Remove required FieldProperty attribute first ...
221        delattr(ApplicantsContainer, 'prefix')
222        # ... and replace by akoka
223        self.applicantscontainer.prefix = 'akj'
224        self.applicantscontainer.title = u'FCET Akoka JUPEB Pre-Degree (Foundation) Studies 2016/2017'
225        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
226        self.slip_path = self.view_path + '/application_slip.pdf'
227        self.browser.open(self.manage_path)
228        self.assertEqual(self.browser.headers['Status'], '200 Ok')
229        self.fill_correct_values()
230        self.browser.getControl("Save").click()
231        IWorkflowState(self.applicant).setState('submitted')
232        self.browser.open(self.view_path)
233        self.browser.getLink("Download application slip").click()
234        self.assertEqual(self.browser.headers['Status'], '200 Ok')
235        self.assertEqual(self.browser.headers['Content-Type'],
236                         'application/pdf')
237        path = os.path.join(samples_dir(), 'akoka_application_slip.pdf')
238        open(path, 'wb').write(self.browser.contents)
239        print "Sample akoka_application_slip.pdf written to %s" % path
240
241    def test_nils_application_slip(self):
242
243        # Remove required FieldProperty attribute first ...
244        #delattr(ApplicantsContainer, 'prefix')
245        # ... and replace by akoka
246        self.applicantscontainer.prefix = 'pgn'
247        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
248        self.slip_path = self.view_path + '/application_slip.pdf'
249        self.browser.open(self.manage_path)
250        self.assertEqual(self.browser.headers['Status'], '200 Ok')
251        self.fill_correct_values()
252        self.browser.getControl("Save").click()
253        IWorkflowState(self.applicant).setState('submitted')
254        self.browser.open(self.view_path)
255        self.browser.getLink("Download application slip").click()
256        self.assertEqual(self.browser.headers['Status'], '200 Ok')
257        self.assertEqual(self.browser.headers['Content-Type'],
258                         'application/pdf')
259        path = os.path.join(samples_dir(), 'nils_application_slip.pdf')
260        open(path, 'wb').write(self.browser.contents)
261        print "Sample nils_application_slip.pdf written to %s" % path
262
263    def test_ictwk_application(self):
264
265        # Remove required FieldProperty attribute first ...
266        #delattr(ApplicantsContainer, 'prefix')
267        # ... and replace by ictw
268        self.applicantscontainer.prefix = 'ictwk'
269        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
270        self.slip_path = self.view_path + '/application_slip.pdf'
271        self.browser.open(self.manage_path)
272        self.assertEqual(self.browser.headers['Status'], '200 Ok')
273        self.browser.getControl(name="form.firstname").value = 'John'
274        self.browser.getControl(name="form.middlename").value = 'Anthony'
275        self.browser.getControl(name="form.lastname").value = 'Tester'
276        #self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
277        self.browser.getControl(name="form.sex").value = ['m']
278        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
279        self.browser.getControl(name="form.phone.ext").value = '12345'
280        image = open(SAMPLE_IMAGE, 'rb')
281        ctrl = self.browser.getControl(name='form.passport')
282        file_ctrl = ctrl.mech_control
283        file_ctrl.add_file(image, filename='myphoto.jpg')
284        self.browser.getControl("Save").click()
285        self.applicant.registration_cats = ['group', 'corporate']
286        IWorkflowState(self.applicant).setState('started')
287        configuration = CustomSessionConfiguration()
288        configuration.academic_session = session_1
289        configuration.application_fee = 0.0
290        self.app['configuration'].addSessionConfiguration(configuration)
291        self.browser.getControl("Create and make online").click()
292        self.assertMatches('...Payment ticket created...',
293                           self.browser.contents)
294        self.assertEqual(self.applicant.values()[0].amount_auth, 450000)
295        IWorkflowState(self.applicant).setState('submitted')
296        self.browser.open(self.view_path)
297        self.assertTrue('Group Registration @ ₦ 200000' in self.browser.contents)
298        self.browser.open(self.view_path)
299        self.browser.getLink("Download application slip").click()
300        self.assertEqual(self.browser.headers['Status'], '200 Ok')
301        self.assertEqual(self.browser.headers['Content-Type'],
302                         'application/pdf')
303        path = os.path.join(samples_dir(), 'ictwk_application_slip.pdf')
304        open(path, 'wb').write(self.browser.contents)
305        print "Sample ictwk_application_slip.pdf written to %s" % path
306
307    def test_transcript_application(self):
308        configuration = CustomSessionConfiguration()
309        configuration.academic_session = session_1
310        self.app['configuration'].addSessionConfiguration(configuration)
311        # Add special application container
312        applicantscontainer = ApplicantsContainer()
313        applicantscontainer.year = session_1
314        applicantscontainer.application_fee = 1.0 # Must be set but is not used.
315        applicantscontainer.code = u'tsc1234'
316        applicantscontainer.prefix = 'tscf'
317        applicantscontainer.title = u'This is a tsc container'
318        applicantscontainer.application_category = 'no'
319        applicantscontainer.mode = 'create'
320        applicantscontainer.strict_deadline = True
321        applicantscontainer.with_picture = True
322        delta = datetime.timedelta(days=10)
323        applicantscontainer.startdate = datetime.datetime.now(pytz.utc) - delta
324        applicantscontainer.enddate = datetime.datetime.now(pytz.utc) + delta
325        self.app['applicants']['tsc1234'] = applicantscontainer
326        # Add an applicant
327        applicant = createObject('waeup.Applicant')
328        # reg_number is the only field which has to be preset here
329        # because managers are allowed to edit this required field
330        applicant.reg_number = u'12345'
331        applicant.collected = True
332        self.app['applicants']['tsc1234'].addApplicant(applicant)
333        IUserAccount(
334            self.app['applicants']['tsc1234'][
335            applicant.application_number]).setPassword('apwd')
336        # Login
337        self.browser.open(self.login_path)
338        self.browser.getControl(
339            name="form.login").value = applicant.applicant_id
340        self.browser.getControl(name="form.password").value = 'apwd'
341        self.browser.getControl("Login").click()
342        self.browser.getLink("Application record").click()
343        self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
344        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
345        self.browser.getControl(name="form.firstname").value = 'Angela'
346        self.browser.getControl(name="form.lastname").value = 'Merkel'
347        self.browser.getControl(name="form.sex").value = ['f']
348        self.browser.getControl(name="form.no_copies").value = ['2']
349        self.browser.getControl(name="form.course_studied").value = ['CERT1']
350        self.browser.getControl(name="form.matric_number").value = 'a234'
351        self.browser.getControl(name="form.dispatch_address").value = 'Kuensche\nMarsch 5'
352        self.browser.getControl(name="form.entry_mode").value = ['ug_ft']
353        self.browser.getControl(name="form.entry_session").value = ['2014']
354        self.browser.getControl(name="form.end_session").value = ['2015']
355        self.browser.getControl(name="form.phone.country").value = ['+234']
356        self.browser.getControl(name="form.phone.ext").value = '5678'
357        self.browser.getControl(name="form.charge").value = ['local']
358        self.browser.getControl(name="form.order").value = ['o']
359        image = open(SAMPLE_IMAGE, 'rb')
360        ctrl = self.browser.getControl(name='form.passport')
361        file_ctrl = ctrl.mech_control
362        file_ctrl.add_file(image, filename='myphoto.jpg')
363        self.browser.getControl("Save").click()
364        applicant_url = self.browser.url
365        self.browser.getControl("Create and make online").click()
366        self.assertTrue('Payment ticket created' in self.browser.contents)
367        self.assertTrue('<span>55000.0</span>' in self.browser.contents)
368        self.assertEqual(applicant.values()[0].amount_auth, 55000.0)
369        applicant.values()[0].p_state = 'paid'
370        payment_url = self.browser.url
371        IWorkflowState(applicant).setState('submitted')
372        self.browser.open(payment_url)
373        self.browser.getLink("Download payment slip").click()
374        self.assertEqual(self.browser.headers['Status'], '200 Ok')
375        self.assertEqual(self.browser.headers['Content-Type'],
376                         'application/pdf')
377        path = os.path.join(samples_dir(), 'tscf_payment_slip.pdf')
378        open(path, 'wb').write(self.browser.contents)
379        print "Sample tscf_payment_slip.pdf written to %s" % path
380        self.browser.open(applicant_url)
381        self.browser.getLink("My Data").click()
382        self.browser.getLink("Download application slip").click()
383        self.assertEqual(self.browser.headers['Status'], '200 Ok')
384        self.assertEqual(self.browser.headers['Content-Type'],
385                         'application/pdf')
386        path = os.path.join(samples_dir(), 'tscf_application_slip.pdf')
387        open(path, 'wb').write(self.browser.contents)
388        print "Sample tscf_application_slip.pdf written to %s" % path
389        return
Note: See TracBrowser for help on using the repository browser.