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

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

Fix tests.

  • Property svn:keywords set to Id
File size: 20.3 KB
RevLine 
[13814]1# -*- coding: utf-8 -*-
[10589]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"""
[13552]22import os
[16078]23import datetime
24import pytz
[11736]25from StringIO import StringIO
[11788]26from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
[11736]27from zope.securitypolicy.interfaces import IPrincipalRoleManager
[16078]28from zope.component import createObject, getUtility
29from waeup.kofa.interfaces import IUserAccount
[13552]30from waeup.kofa.browser.tests.test_pdf import samples_dir
31from waeup.kofa.applicants.container import ApplicantsContainer
[10589]32from waeup.uniben.testing import FunctionalLayer
[11788]33from waeup.uniben.configuration import CustomSessionConfiguration
[11736]34from waeup.kofa.applicants.tests.test_browser import ApplicantsFullSetup, PH_LEN
[10589]35
[16078]36session_1 = datetime.datetime.now().year - 2
[13816]37SAMPLE_IMAGE = os.path.join(os.path.dirname(__file__), 'test_image.jpg')
38
[10589]39class CustomApplicantUITests(ApplicantsFullSetup):
40    # Tests for uploading/browsing the passport image of appplicants
41
42    layer = FunctionalLayer
43
[11788]44    #def setUp(self):
45    #    super(CustomApplicantUITests, self).setUp()
46    #    return
47
[18100]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
[10589]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(
[17298]67            'You logged in as an applicant.' in self.browser.contents)
[10589]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
[11736]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
[15313]84        self.app['users'].addUser('mrcrpu', 'mrCrpusecret1')
[11736]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'
[15313]92        self.browser.getControl(name="form.password").value = 'mrCrpusecret1'
[11736]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)
[11788]130
131    def test_pay_admission_checking_fee(self):
132        IWorkflowState(self.applicant).setState('admitted')
[16744]133        self.applicant.screening_score = 55.0
[11788]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)
[16744]141        self.assertTrue('<span>55.0</span>' in self.browser.contents)
[11788]142        configuration = CustomSessionConfiguration()
[16078]143        configuration.academic_session = datetime.datetime.now().year - 2
[11788]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)
[16744]151        self.assertTrue('<span>55.0</span>' in self.browser.contents)
[11788]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)
[16744]159        self.assertFalse('<span>55.0</span>' in self.browser.contents)
[11788]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)
[16744]176        self.assertTrue('<span>55.0</span>' in self.browser.contents)
[11788]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
[13552]183
[14147]184    def test_application_slips(self):
[13552]185
[13558]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')
[16330]192        self.browser.open(self.view_path)
[13558]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
[14147]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'
[14167]206        self.applicant.screening_venue = u'MAIN AUDITORIUM'
[14168]207        self.applicantscontainer.application_slip_notice = u'This is an additional notice.'
[14147]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
[13558]217
218    def test_akoka_application_slip(self):
219
[13552]220        # Remove required FieldProperty attribute first ...
221        delattr(ApplicantsContainer, 'prefix')
[13558]222        # ... and replace by akoka
[14061]223        self.applicantscontainer.prefix = 'akj'
[14064]224        self.applicantscontainer.title = u'FCET Akoka JUPEB Pre-Degree (Foundation) Studies 2016/2017'
[13552]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')
[16330]232        self.browser.open(self.view_path)
[13552]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')
[13558]237        path = os.path.join(samples_dir(), 'akoka_application_slip.pdf')
[13552]238        open(path, 'wb').write(self.browser.contents)
[13558]239        print "Sample akoka_application_slip.pdf written to %s" % path
[13615]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')
[16330]254        self.browser.open(self.view_path)
[13615]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
[13814]262
[13816]263    def test_ictwk_application(self):
[13814]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'
[13819]276        #self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
277        self.browser.getControl(name="form.sex").value = ['m']
[13814]278        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
[18100]279        self.browser.getControl(name="form.phone.ext").value = '12345'
[13816]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')
[13814]284        self.browser.getControl("Save").click()
285        self.applicant.registration_cats = ['group', 'corporate']
[13816]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)
[16330]291        self.browser.getControl("Create and make online").click()
[13816]292        self.assertMatches('...Payment ticket created...',
293                           self.browser.contents)
294        self.assertEqual(self.applicant.values()[0].amount_auth, 450000)
[13814]295        IWorkflowState(self.applicant).setState('submitted')
296        self.browser.open(self.view_path)
297        self.assertTrue('Group Registration @ ₦ 200000' in self.browser.contents)
[16330]298        self.browser.open(self.view_path)
[13814]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
[16078]306
[16184]307    def test_transcript_application(self):
[16151]308        configuration = CustomSessionConfiguration()
[16078]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
[16151]314        applicantscontainer.application_fee = 1.0 # Must be set but is not used.
[16183]315        applicantscontainer.code = u'tsc1234'
[16164]316        applicantscontainer.prefix = 'tscf'
[16183]317        applicantscontainer.title = u'This is a tsc container'
[16078]318        applicantscontainer.application_category = 'no'
319        applicantscontainer.mode = 'create'
320        applicantscontainer.strict_deadline = True
[16184]321        applicantscontainer.with_picture = True
[16078]322        delta = datetime.timedelta(days=10)
323        applicantscontainer.startdate = datetime.datetime.now(pytz.utc) - delta
324        applicantscontainer.enddate = datetime.datetime.now(pytz.utc) + delta
[16183]325        self.app['applicants']['tsc1234'] = applicantscontainer
[16078]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'
[17593]331        applicant.collected = True
[16183]332        self.app['applicants']['tsc1234'].addApplicant(applicant)
[16078]333        IUserAccount(
[16183]334            self.app['applicants']['tsc1234'][
[16078]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']
[16151]348        self.browser.getControl(name="form.no_copies").value = ['2']
[16078]349        self.browser.getControl(name="form.course_studied").value = ['CERT1']
[17659]350        self.browser.getControl(name="form.matric_number").value = 'a234'
[16184]351        self.browser.getControl(name="form.dispatch_address").value = 'Kuensche\nMarsch 5'
[16078]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'
[18020]357        self.browser.getControl(name="form.charge").value = ['local']
[16773]358        self.browser.getControl(name="form.order").value = ['o']
[16184]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')
[16078]363        self.browser.getControl("Save").click()
[16504]364        applicant_url = self.browser.url
[16330]365        self.browser.getControl("Create and make online").click()
[16078]366        self.assertTrue('Payment ticket created' in self.browser.contents)
[18015]367        self.assertTrue('<span>55000.0</span>' in self.browser.contents)
368        self.assertEqual(applicant.values()[0].amount_auth, 55000.0)
[16504]369        applicant.values()[0].p_state = 'paid'
370        payment_url = self.browser.url
[16184]371        IWorkflowState(applicant).setState('submitted')
[16504]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)
[16184]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
[16078]389        return
Note: See TracBrowser for help on using the repository browser.