source: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/tests/test_browser.py

Last change on this file was 16546, checked in by Henrik Bettermann, 4 years ago

Adjust to changes in base package.

  • Property svn:keywords set to Id
File size: 9.7 KB
RevLine 
[10765]1## $Id: test_browser.py 16546 2021-07-13 16:05:29Z henrik $
2##
3## Copyright (C) 2013 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##
18"""
19Test the applicant-related UI components.
20"""
[15878]21import grok
22import datetime
23import pytz
[11543]24import os
[15878]25from StringIO import StringIO
26from zope.event import notify
[11543]27from zope.component import createObject, getUtility
28from zope.catalog.interfaces import ICatalog
29from zope.intid.interfaces import IIntIds
[11941]30from hurry.workflow.interfaces import IWorkflowState
[15878]31from zope.component import createObject, getUtility
32from waeup.kofa.configuration import SessionConfiguration
33from waeup.kofa.interfaces import (
34    IUserAccount, IExtFileStore, IFileStoreNameChooser)
[15563]35from kofacustom.iuokada.testing import FunctionalLayer
[15878]36from waeup.kofa.applicants.container import ApplicantsContainer
[11941]37from waeup.kofa.browser.tests.test_pdf import samples_dir
[15878]38from waeup.kofa.applicants.tests.test_browser import (ApplicantsFullSetup,
39    ApplicantsFullSetup, container_name_1, session_1)
[11543]40from waeup.kofa.applicants.tests.test_batching import ApplicantImportExportSetup
[15563]41from kofacustom.iuokada.applicants.export import CustomApplicantExporter
42from kofacustom.iuokada.applicants.batching import CustomApplicantProcessor
[10765]43
[16546]44SAMPLE_IMAGE = os.path.join(os.path.dirname(__file__), 'test_image.jpg')
45
[10765]46class CustomApplicantUITests(ApplicantsFullSetup):
47    # Tests for uploading/browsing the passport image of appplicants
48
49    layer = FunctionalLayer
[11543]50
[12084]51class ApplicantExporterTest(ApplicantImportExportSetup):
[11543]52
53    layer = FunctionalLayer
54
55    def setUp(self):
[12084]56        super(ApplicantExporterTest, self).setUp()
[11543]57        self.outfile = os.path.join(self.workdir, 'myoutput.csv')
58        self.cat = getUtility(ICatalog, name='applicants_catalog')
59        self.intids = getUtility(IIntIds)
60        return
61
62    def setup_applicant(self, applicant):
63        # set predictable values for `applicant`
64        applicant.reg_number = u'123456'
65        applicant.applicant_id = u'dp2011_654321'
66        applicant.firstname = u'Anna'
67        applicant.lastname = u'Tester'
68        applicant.middlename = u'M.'
69        applicant.nationality = u'NG'
70        applicant.date_of_birth = datetime.date(1981, 2, 4)
71        applicant.sex = 'f'
72        applicant.email = 'anna@sample.com'
73        applicant.phone = u'+234-123-12345'
74        applicant.course1 = self.certificate
75        applicant.course2 = self.certificate
76        applicant.course_admitted = self.certificate
77        applicant.notice = u'Some notice\nin lines.'
78        applicant.screening_score = 98
79        applicant.screening_venue = u'Exam Room'
80        applicant.screening_date = u'Saturday, 16th June 2012 2:00:00 PM'
81        applicant.password = 'any password'
82        return applicant
83
[11941]84class ApplicantsContainerUITests(ApplicantsFullSetup):
85    # Tests for ApplicantsContainer class views and pages
86
87    layer = FunctionalLayer
88
[16075]89    def fill_correct_values(self):
90        # Fill the edit form with suitable values
91        self.browser.getControl(name="form.firstname").value = 'John'
92        self.browser.getControl(name="form.middlename").value = 'Anthony'
93        self.browser.getControl(name="form.lastname").value = 'Tester'
94        self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
95        self.browser.getControl(name="form.sex").value = ['m']
96        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
[16292]97        self.browser.getControl(name="form.perm_address").value = 'Adresse'
[16075]98
99    def test_manage_application(self):
[11941]100        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
101        self.slip_path = self.view_path + '/application_slip.pdf'
102        self.browser.open(self.manage_path)
103        self.assertEqual(self.browser.headers['Status'], '200 Ok')
104        self.fill_correct_values()
[16220]105        self.browser.getControl(name="custom.course1").value = ['']
[11941]106        self.browser.getControl("Save").click()
[16220]107        self.assertTrue('Please select your 1st Choice Course of Study.'
108            in self.browser.contents)
109        self.browser.getControl(name="custom.course1").value = ['CERT1']
110        self.browser.getControl("Save").click()
[16075]111        self.assertEqual(self.applicant.course1, self.certificate)
112        self.assertEqual(self.applicant.course2, None)
[11941]113        IWorkflowState(self.applicant).setState('submitted')
[16233]114        self.browser.open(self.view_path)
[11941]115        self.browser.getLink("Download application slip").click()
116        self.assertEqual(self.browser.headers['Status'], '200 Ok')
117        self.assertEqual(self.browser.headers['Content-Type'],
118                         'application/pdf')
119        path = os.path.join(samples_dir(), 'application_slip.pdf')
120        open(path, 'wb').write(self.browser.contents)
121        print "Sample application_slip.pdf written to %s" % path
[16220]122        # Log entries have been added (course1 is missing because it was already stored)
[16075]123        logfile = os.path.join(
124            self.app['datacenter'].storage, 'logs', 'applicants.log')
125        logcontent = open(logfile).read()
126        self.assertTrue(
127            'zope.mgr - kofacustom.iuokada.applicants.browser.CustomApplicantManageFormPage - '
128            '%s - saved: firstname + middlename + lastname + date_of_birth '
[16220]129            '+ sex + email'
[16075]130            % (self.applicant.applicant_id)
131            in logcontent)
[15878]132
[15942]133    def test_upload_res_stat_by_manager(self):
[15878]134        # Add trans applicants container
135        self.transcontainer = ApplicantsContainer()
136        self.transcontainer.mode = 'create'
137        self.transcontainer.code = u'ug%s' % session_1
138        self.transcontainer.prefix = u'ug'
139        self.transcontainer.application_category = u'no'
140        self.transcontainer.year = session_1
141        self.transcontainer.application_fee = 300.0
142        self.transcontainer.title = u'This is the ug%s container' % session_1
143        self.app['applicants'][self.transcontainer.code] = self.transcontainer
144        delta = datetime.timedelta(days=10)
145        self.transcontainer.startdate = datetime.datetime.now(pytz.utc) - delta
146        self.transcontainer.enddate = datetime.datetime.now(pytz.utc) + delta
147        # Add applicant
148        transapplicant = createObject(u'waeup.Applicant')
149        transapplicant.firstname = u'Anna'
150        transapplicant.lastname = u'Post'
151        transapplicant.subtype = 'transfer'
152        self.app['applicants'][self.transcontainer.code].addApplicant(transapplicant)
153        self.transapplicant = self.app['applicants'][self.transcontainer.code][
154            transapplicant.application_number]
155        self.transapplicant_view_path = ('http://localhost/app/applicants/ug%s/%s'
156            % (session_1, transapplicant.application_number))
157        self.transapplicant_manage_path = ('http://localhost/app/applicants/ug%s/%s/manage'
158            % (session_1, transapplicant.application_number))
159        # Login
160        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
161        self.browser.open(self.transapplicant_manage_path)
162        # Create a pseudo file with acceptable size
[16546]163        #pdf_content = 'A' * 1024 * 300  # A string of 300 KB size
164        #pseudo_pdf = StringIO(pdf_content)
165        image = open(SAMPLE_IMAGE, 'rb')
166        ctrl = self.browser.getControl(name='res_stat')
[15878]167        file_ctrl = ctrl.mech_control
[16546]168        file_ctrl.add_file(image, filename='my_scan.jpg')
[15878]169        self.browser.getControl("Save").click() # submit form
170        # Even though the form could not be saved ...
171        self.assertTrue('Required input is missing' in self.browser.contents)
172        # ... the file has been successfully uploaded
[16546]173        image_url = self.transapplicant_manage_path.replace('manage', 'res_stat')
174        self.browser.open(image_url)
[15878]175        self.assertEqual(
[16546]176            self.browser.headers['content-type'], 'image/jpeg')
177        self.assertEqual(len(self.browser.contents), 2787)
[15878]178        # There is really a file stored for the applicant
179        storage = getUtility(IExtFileStore)
180        file_id = IFileStoreNameChooser(self.transapplicant).chooseName(
[15942]181            attr='res_stat.pdf')
[15878]182        # The stored file can be fetched
183        fd = storage.getFile(file_id)
184        file_len = len(fd.read())
[16546]185        self.assertEqual(file_len, 2787)
[15878]186        # A file link is displayed on the edit view ...
187        self.browser.open(self.transapplicant_manage_path)
[16546]188        self.assertTrue('<a href="res_stat">' in self.browser.contents)
[15878]189        # ... and on the dislay view
190        self.browser.open(self.transapplicant_view_path)
[16546]191        self.assertTrue('res_stat">Statement of Result</a>'
[15878]192            in self.browser.contents)
193        # Adding file is properly logged
194        logfile = os.path.join(
195            self.app['datacenter'].storage, 'logs', 'applicants.log')
196        logcontent = open(logfile).read()
197        self.assertTrue(
198            'zope.mgr - kofacustom.iuokada.applicants.browser.CustomApplicantManageFormPage'
[16546]199            ' - %s - saved: res_stat'
[15878]200            % (self.transapplicant.applicant_id)
201            in logcontent)
202        # When an applicant is removed, also the pdf files are gone.
203        del self.app['applicants'][self.transcontainer.code][self.transapplicant.application_number]
204        fd = storage.getFile(file_id)
205        self.assertTrue(fd is None)
Note: See TracBrowser for help on using the repository browser.