source: main/waeup.fceokene/trunk/src/waeup/fceokene/applicants/tests.py @ 8919

Last change on this file since 8919 was 8807, checked in by Henrik Bettermann, 13 years ago

Merged with waeup.uniben 8802:HEAD.

  • Property svn:keywords set to Id
File size: 13.0 KB
RevLine 
[7866]1## $Id: tests.py 8807 2012-06-26 07:46:53Z 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 shutil
20import tempfile
[8056]21import datetime
[8671]22import grok
23import pytz
24from zope.event import notify
[8056]25from zope.intid.interfaces import IIntIds
[7866]26from zope.interface.verify import verifyClass, verifyObject
27from zope.component.hooks import setSite, clearSite
[8056]28from zope.component import createObject, getUtility
29from zope.catalog.interfaces import ICatalog
[8012]30from zope.testbrowser.testing import Browser
[8671]31from hurry.workflow.interfaces import IWorkflowState
[7866]32from waeup.kofa.app import University
33from waeup.kofa.university.faculty import Faculty
34from waeup.kofa.university.department import Department
35from waeup.kofa.testing import FunctionalTestCase
[8528]36from waeup.kofa.configuration import SessionConfiguration
[8012]37from waeup.kofa.applicants.container import ApplicantsContainer
[8056]38from waeup.kofa.applicants.tests.test_batching import ApplicantImportExportSetup
39from waeup.kofa.interfaces import IBatchProcessor
[8460]40from waeup.fceokene.testing import FunctionalLayer
41from waeup.fceokene.applicants.export import CustomApplicantsExporter
[8584]42from waeup.fceokene.applicants.batching import CustomApplicantProcessor
[7866]43
[8056]44
[8012]45class ApplicantUITest(FunctionalTestCase):
46    """Perform some browser tests.
[7866]47    """
48    layer = FunctionalLayer
49
50    def setUp(self):
[8012]51        super(ApplicantUITest, self).setUp()
[7866]52        # Setup a sample site for each test
53        app = University()
54        self.dc_root = tempfile.mkdtemp()
55        app['datacenter'].setStoragePath(self.dc_root)
56
57        # Prepopulate the ZODB...
58        self.getRootFolder()['app'] = app
59        # we add the site immediately after creation to the
60        # ZODB. Catalogs and other local utilities are not setup
61        # before that step.
62        self.app = self.getRootFolder()['app']
63        # Set site here. Some of the following setup code might need
64        # to access grok.getSite() and should get our new app then
65        setSite(app)
66
[8671]67        # Add an applicants containers
[8012]68        self.ugcontainer = ApplicantsContainer()
[8528]69        self.ugcontainer.code = u'putme2011'
70        self.ugcontainer.prefix = u'putme'
[8624]71        self.ugcontainer.application_category = u'basic'
[8528]72        self.ugcontainer.year = 2011
73        self.ugcontainer.application_fee = 200.0
74        self.ugcontainer.title = u'This is the app2011 container'
[8012]75        self.app['applicants']['app2011'] = self.ugcontainer
[7866]76
[8671]77        self.ugcontainer.mode = 'update'
78        delta = datetime.timedelta(days=10)
79        self.ugcontainer.startdate = datetime.datetime.now(pytz.utc) - delta
80        self.ugcontainer.enddate = datetime.datetime.now(pytz.utc) + delta
81
[7866]82        # Populate university
83        self.certificate = createObject('waeup.Certificate')
84        self.certificate.code = 'CERT1'
85        self.certificate.application_category = 'basic'
86        self.certificate.start_level = 100
87        self.certificate.end_level = 500
[8671]88        self.certificate.study_mode = u'ug_ft'
[7866]89        self.app['faculties']['fac1'] = Faculty()
90        self.app['faculties']['fac1']['dep1'] = Department()
91        self.app['faculties']['fac1']['dep1'].certificates.addCertificate(
92            self.certificate)
93
[8671]94        # Add (customized) applicant
[8012]95        ugapplicant = createObject(u'waeup.Applicant')
96        ugapplicant.firstname = u'Klaus'
97        ugapplicant.lastname = u'Under'
98        self.app['applicants']['app2011'].addApplicant(ugapplicant)
99        self.ugapplication_number = ugapplicant.application_number
100        self.ugapplicant = self.app['applicants']['app2011'][
101            self.ugapplication_number]
[8528]102        self.ugapplicant_path = ('http://localhost/app/applicants/app2011/%s'
103            % self.ugapplication_number)
[8012]104
105        self.browser = Browser()
106        self.browser.handleErrors = False
107
[7866]108    def tearDown(self):
[8012]109        super(ApplicantUITest, self).tearDown()
[7866]110        shutil.rmtree(self.dc_root)
111        clearSite()
112        return
113
[8528]114    def fill_correct_values(self):
115        self.browser.getControl(name="form.reg_number").value = '1234'
116        self.browser.getControl(name="form.firstname").value = 'John'
117        self.browser.getControl(name="form.lastname").value = 'Tester'
118        self.browser.getControl(name="form.date_of_birth").value = '09/09/1988'
119        self.browser.getControl(name="form.lga").value = ['foreigner']
[8671]120        self.browser.getControl(name="form.nationality").value = ['NG']
[8528]121        self.browser.getControl(name="form.sex").value = ['m']
122        self.browser.getControl(name="form.email").value = 'xx@yy.zz'
123
124    def test_application_payment(self):
125        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
126
127        # UG (UTME) applicant
128        self.browser.open(self.ugapplicant_path)
129        self.browser.open(self.ugapplicant_path + '/manage')
130        self.assertEqual(self.browser.headers['Status'], '200 Ok')
131        self.fill_correct_values()
[8624]132        self.browser.getControl(name="form.course1").value = ['CERT1']
[8528]133        self.browser.getControl("Save").click()
134        self.assertMatches('...Form has been saved...', self.browser.contents)
135        self.browser.getControl("Save").click()
136        self.browser.getControl("Add online payment ticket").click()
137        self.assertMatches('...Payment ticket created...',
138                           self.browser.contents)
139        self.assertMatches('...Amount Authorized...',
140                           self.browser.contents)
141        payment_id = self.ugapplicant.keys()[0]
142        payment = self.ugapplicant[payment_id]
143        self.assertEqual(payment.p_item,'This is the app2011 container')
144        self.assertEqual(payment.p_session,2011)
145        self.assertEqual(payment.p_category,'application')
146        self.assertEqual(payment.amount_auth, 200.0)
147
[8671]148        return
149
150    def test_create_ugstudent(self):
151        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
152        manage_path = 'http://localhost/app/applicants/%s/%s/%s' % (
153            'app2011', self.ugapplicant.application_number, 'manage')
154        self.browser.open(manage_path)
[8528]155        self.fill_correct_values()
156        self.browser.getControl("Save").click()
[8671]157        IWorkflowState(self.ugapplicant).setState('admitted')
158        self.browser.getControl(name="form.course1").value = ['CERT1']
159        self.browser.getControl(name="form.course_admitted").value = ['CERT1']
160        self.browser.getControl("Save").click()
161        self.browser.getLink("Create student").click()
162        student_id =  self.app['students'].keys()[0]
163        self.assertTrue(('Student %s created' % student_id)
164            in self.browser.contents)
165        student = self.app['students'][student_id]
166        self.assertEqual(student.email, 'xx@yy.zz')
167        self.assertEqual(student.firstname, 'John')
168        self.assertEqual(student.lastname, 'Tester')
169        # Also additional attributes have been copied.
170        self.assertEqual(student.lga, 'foreigner')
171        self.assertEqual(student.nationality, 'NG')
[8528]172        return
173
[8056]174class ApplicantsExporterTest(ApplicantImportExportSetup):
175
176    layer = FunctionalLayer
177
178    def setUp(self):
179        super(ApplicantsExporterTest, self).setUp()
180        self.outfile = os.path.join(self.workdir, 'myoutput.csv')
181        self.cat = getUtility(ICatalog, name='applicants_catalog')
182        self.intids = getUtility(IIntIds)
183        return
184
185    def setup_applicant(self, applicant):
186        # set predictable values for `applicant`
187        applicant.reg_number = u'123456'
188        applicant.applicant_id = u'dp2011_654321'
189        applicant.firstname = u'Anna'
190        applicant.lastname = u'Tester'
191        applicant.middlename = u'M.'
192        applicant.date_of_birth = datetime.date(1981, 2, 4)
193        applicant.sex = 'f'
194        applicant.email = 'anna@sample.com'
195        applicant.phone = u'+234-123-12345'
196        applicant.course1 = self.certificate
197        applicant.course2 = self.certificate
198        applicant.course_admitted = self.certificate
199        applicant.notice = u'Some notice\nin lines.'
200        applicant.screening_score = 98
201        applicant.screening_venue = u'Exam Room'
[8584]202        applicant.screening_date = u'Saturday, 16th June 2012 2:00:00 PM'
[8056]203        applicant.password = 'any password'
204        return applicant
205
[8584]206    def test_export_reimport_all(self):
[8056]207        # we can export all applicants in a portal
208        # set values we can expect in export file
209        self.applicant = self.setup_applicant(self.applicant)
[8196]210        exporter = CustomApplicantsExporter()
[8056]211        exporter.export_all(self.app, self.outfile)
212        result = open(self.outfile, 'rb').read()
213        # The exported records do contain a real date in their
214        # history dict. We skip the date and split the comparison
215        # into two parts.
216        self.assertTrue(
[8807]217            'aggregate,applicant_id,application_date,application_number,course1,course2,'
[8056]218            'course_admitted,date_of_birth,display_fullname,email,emp2_end,'
[8130]219            'emp2_position,emp2_reason,emp2_start,emp_end,emp_position,'
220            'emp_reason,emp_start,employer,employer2,firstname,history,'
221            'hq_degree,hq_disc,hq_matric_no,hq_school,hq_session,hq_type,'
[8537]222            'jamb_score,jamb_subjects,lastname,lga,locked,middlename,'
223            'nationality,notice,nysc_lga,'
[8130]224            'nysc_year,password,perm_address,phone,pp_school,presently_inst,'
[8807]225            'reg_number,result_uploaded,screening_date,screening_score,screening_venue,sex,'
[8584]226            'state,student_id,'
[8531]227            'container_code'
[8056]228            in result)
229        self.assertTrue(
[8537]230            'Application initialized by system\'],,,,,,,,,Tester,,0,M.,,'
[8130]231            '"Some notice\nin lines.",,,any password,,+234-123-12345,,,'
[8807]232            '123456,,"Saturday, 16th June 2012 2:00:00 PM",98,Exam Room,f,'
233            'initialized,,dp2011'
234            in result)
235        # We can import the same file if we ignore some columns.
[8584]236        # Since the applicants_catalog hasn't been notified, the same
237        # record with same reg_number can be imported twice.
238        processor = CustomApplicantProcessor()
239        result = processor.doImport(
240            self.outfile,
[8807]241            ['aggreagate','ignore_applicant_id','application_date',
242            'ignore_application_number','course1','course2',
[8587]243            'course_admitted','date_of_birth','ignore3','email','emp2_end',
244            'emp2_position','emp2_reason','emp2_start','emp_end','emp_position',
245            'emp_reason','emp_start','employer','employer2','firstname','ignore4',
246            'hq_degree','hq_disc','hq_matric_no','hq_school','hq_session','hq_type',
247            'jamb_score','jamb_subjects','lastname','lga','locked','middlename',
248            'nationality','notice','nysc_lga',
249            'nysc_year','password','perm_address','phone','pp_school','presently_inst',
[8807]250            'reg_number','result_uploaded',
251            'screening_date','screening_score','screening_venue','sex',
[8584]252            'state','student_id','container_code'],
253            mode='create')
254        num_succ, num_fail, finished_path, failed_path = result
255        self.assertEqual(num_succ,1)
256        self.assertEqual(num_fail,0)
[8587]257        # Now we ignore also the container_code and import the same file
258        # in update mode which means that ICustomApplicantUpdateByRegNo
259        # is used for field conversion. applicant_id must be ignored
260        # too since the previous import has notified the applicants_catalog
261        # so that the portal 'knows' that reg_number is in use.
262        processor = CustomApplicantProcessor()
263        result = processor.doImport(
264            self.outfile,
[8807]265            ['aggregate','ignore_applicant_id','application_date',
266            'ignore_application_number','course1','course2',
[8587]267            'course_admitted','date_of_birth','ignore3','email','emp2_end',
268            'emp2_position','emp2_reason','emp2_start','emp_end','emp_position',
269            'emp_reason','emp_start','employer','employer2','firstname','ignore4',
270            'hq_degree','hq_disc','hq_matric_no','hq_school','hq_session','hq_type',
271            'jamb_score','jamb_subjects','lastname','lga','locked','middlename',
272            'nationality','notice','nysc_lga',
273            'nysc_year','password','perm_address','phone','pp_school','presently_inst',
[8807]274            'reg_number','result_uploaded','screening_date','screening_score',
275            'screening_venue','sex',
[8587]276            'state','student_id','ignore_container_code'],
277            mode='update')
278        num_succ, num_fail, finished_path, failed_path = result
279        self.assertEqual(num_succ,1)
280        self.assertEqual(num_fail,0)
[8671]281        return
Note: See TracBrowser for help on using the repository browser.