source: main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py @ 6876

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

Implement getPaymentDetails and getSchoolFee functions (to be moved to the FUTMinna customization package).

  • Property svn:keywords set to Id
File size: 31.2 KB
Line 
1##
2## test_browser.py
3## Login : <uli@pu.smp.net>
4## Started on  Tue Mar 29 11:31:11 2011 Uli Fouquet
5## $Id: test_browser.py 6876 2011-10-12 19:30:01Z henrik $
6##
7## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
8## This program is free software; you can redistribute it and/or modify
9## it under the terms of the GNU General Public License as published by
10## the Free Software Foundation; either version 2 of the License, or
11## (at your option) any later version.
12##
13## This program is distributed in the hope that it will be useful,
14## but WITHOUT ANY WARRANTY; without even the implied warranty of
15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16## GNU General Public License for more details.
17##
18## You should have received a copy of the GNU General Public License
19## along with this program; if not, write to the Free Software
20## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21##
22"""
23Test the student-related UI components.
24"""
25import shutil
26import tempfile
27import cStringIO
28from datetime import datetime
29from zope.component import createObject
30from zope.component.hooks import setSite, clearSite
31from zope.security.interfaces import Unauthorized
32from zope.testbrowser.testing import Browser
33from hurry.workflow.interfaces import IWorkflowInfo
34from waeup.sirp.testing import FunctionalLayer, FunctionalTestCase
35from waeup.sirp.app import University
36from waeup.sirp.students.student import Student
37from waeup.sirp.university.faculty import Faculty
38from waeup.sirp.university.department import Department
39from waeup.sirp.interfaces import IUserAccount
40
41PH_LEN = 2059  # Length of placeholder file
42
43def lookup_submit_value(name, value, browser):
44    """Find a button with a certain value."""
45    for num in range(0, 100):
46        try:
47            button = browser.getControl(name=name, index=num)
48            if button.value.endswith(value):
49                return button
50        except IndexError:
51            break
52    return None
53
54class StudentsFullSetup(FunctionalTestCase):
55    # A test case that only contains a setup and teardown
56    #
57    # Complete setup for students handlings is rather complex and
58    # requires lots of things created before we can start. This is a
59    # setup that does all this, creates a university, creates PINs,
60    # etc.  so that we do not have to bother with that in different
61    # test cases.
62
63    layer = FunctionalLayer
64
65    def setUp(self):
66        super(StudentsFullSetup, self).setUp()
67
68        # Setup a sample site for each test
69        app = University()
70        self.dc_root = tempfile.mkdtemp()
71        app['datacenter'].setStoragePath(self.dc_root)
72
73        # Prepopulate the ZODB...
74        self.getRootFolder()['app'] = app
75        # we add the site immediately after creation to the
76        # ZODB. Catalogs and other local utilities are not setup
77        # before that step.
78        self.app = self.getRootFolder()['app']
79        # Set site here. Some of the following setup code might need
80        # to access grok.getSite() and should get our new app then
81        setSite(app)
82
83        # Add student with subobjects
84        student = Student()
85        student.fullname = u'Anna Tester'
86        student.reg_number = u'123'
87        student.matric_number = u'234'
88        self.app['students'].addStudent(student)
89        self.student_id = student.student_id
90        self.student = self.app['students'][self.student_id]
91
92        # Set password
93        IUserAccount(
94            self.app['students'][self.student_id]).setPassword('spwd')
95
96        self.login_path = 'http://localhost/app/login'
97        self.container_path = 'http://localhost/app/students'
98        self.manage_container_path = self.container_path + '/@@manage'
99        self.add_student_path = self.container_path + '/addstudent'
100        self.student_path = self.container_path + '/' + self.student_id
101        self.manage_student_path = self.student_path + '/edit_base'
102        self.clearance_student_path = self.student_path + '/view_clearance'
103        self.personal_student_path = self.student_path + '/view_personal'
104        self.edit_clearance_student_path = self.student_path + '/edit_clearance'
105        self.edit_personal_student_path = self.student_path + '/edit_personal'
106
107        self.studycourse_student_path = self.student_path + '/studycourse'
108        self.payments_student_path = self.student_path + '/payments'
109        self.accommodation_student_path = self.student_path + '/accommodation'
110        self.history_student_path = self.student_path + '/history'
111
112        # Create 5 access codes with prefix'PWD'
113        pin_container = self.app['accesscodes']
114        pin_container.createBatch(
115            datetime.now(), 'some_userid', 'PWD', 9.99, 5)
116        pins = pin_container[pin_container.keys()[0]].values()
117        self.pwdpins = [x.representation for x in pins]
118        self.existing_pwdpin = self.pwdpins[0]
119        parts = self.existing_pwdpin.split('-')[1:]
120        self.existing_pwdseries, self.existing_pwdnumber = parts
121        # Create 5 access codes with prefix 'CLR'
122        pin_container.createBatch(
123            datetime.now(), 'some_userid', 'CLR', 9.99, 5)
124        pins = pin_container[pin_container.keys()[0]].values()
125        self.clrpins = [x.representation for x in pins]
126        self.existing_clrpin = self.clrpins[0]
127        self.existing_clrpin
128        parts = self.existing_clrpin.split('-')[1:]
129        self.existing_clrseries, self.existing_clrnumber = parts
130
131        # Populate university
132        self.certificate = createObject('waeup.Certificate')
133        self.certificate.code = 'CERT1'
134        self.certificate.application_category = 'basic'
135        self.certificate.start_level = 100
136        self.certificate.end_level = 500
137        self.app['faculties']['fac1'] = Faculty()
138        self.app['faculties']['fac1']['dep1'] = Department()
139        self.app['faculties']['fac1']['dep1'].certificates.addCertificate(
140            self.certificate)
141        self.course = createObject('waeup.Course')
142        self.course.code = 'COURSE1'
143        self.course.semester = 1
144        self.course.credits = 10
145        self.course.passmark = 40
146        self.app['faculties']['fac1']['dep1'].courses.addCourse(
147            self.course)
148        self.app['faculties']['fac1']['dep1'].certificates['CERT1'].addCourseRef(
149            self.course, level=100)
150
151        # Set study course attributes of test student
152        self.student['studycourse'].certificate = self.certificate
153        self.student['studycourse'].current_session = 2004
154        self.student['studycourse'].current_verdict = 'A'
155        self.student['studycourse'].current_level = 100
156
157        # Put the prepopulated site into test ZODB and prepare test
158        # browser
159        self.browser = Browser()
160        self.browser.handleErrors = False
161
162    def tearDown(self):
163        super(StudentsFullSetup, self).tearDown()
164        clearSite()
165        shutil.rmtree(self.dc_root)
166
167
168
169class StudentsContainerUITests(StudentsFullSetup):
170    # Tests for StudentsContainer class views and pages
171
172    layer = FunctionalLayer
173
174    def test_anonymous_access(self):
175        # Anonymous users can't access students containers
176        self.assertRaises(
177            Unauthorized, self.browser.open, self.container_path)
178        self.assertRaises(
179            Unauthorized, self.browser.open, self.manage_container_path)
180        return
181
182    def test_manage_access(self):
183        # Managers can access the view page of students
184        # containers and can perform actions
185        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
186        self.browser.open(self.container_path)
187        self.assertEqual(self.browser.headers['Status'], '200 Ok')
188        self.assertEqual(self.browser.url, self.container_path)
189        self.browser.getLink("Manage student section").click()
190        self.assertEqual(self.browser.headers['Status'], '200 Ok')
191        self.assertEqual(self.browser.url, self.manage_container_path)
192        return
193
194    def test_add_search_delete_students(self):
195        # Managers can add search and remove students
196        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
197        self.browser.open(self.manage_container_path)
198        self.browser.getLink("Add student").click()
199        self.assertEqual(self.browser.headers['Status'], '200 Ok')
200        self.assertEqual(self.browser.url, self.add_student_path)
201        self.browser.getControl(name="form.fullname").value = 'Bob Tester'
202        self.browser.getControl("Create student record").click()
203        self.assertTrue('Student record created' in self.browser.contents)
204
205        # Registration and matric numbers must be unique
206        self.browser.getLink("Manage").click()
207        self.browser.getControl(name="form.reg_number").value = '123'
208        self.browser.getControl("Save").click()
209        self.assertMatches('...Registration number exists...',
210                           self.browser.contents)
211        self.browser.getControl(name="form.reg_number").value = '789'
212        self.browser.getControl(name="form.matric_number").value = '234'
213        self.browser.getControl("Save").click()
214        self.assertMatches('...Matriculation number exists...',
215                           self.browser.contents)
216
217        self.browser.open(self.container_path)
218        self.browser.getControl("Search").click()
219        self.assertTrue('Empty search string' in self.browser.contents)
220        self.browser.getControl(name="searchtype").value = ['student_id']
221        self.browser.getControl(name="searchterm").value = self.student_id
222        self.browser.getControl("Search").click()
223        self.assertTrue('Anna Tester' in self.browser.contents)
224
225        self.browser.open(self.manage_container_path)
226        self.browser.getControl("Search").click()
227        self.assertTrue('Empty search string' in self.browser.contents)
228        self.browser.getControl(name="searchtype").value = ['fullname']
229        self.browser.getControl(name="searchterm").value = 'Anna Tester'
230        self.browser.getControl("Search").click()
231        self.assertTrue('Anna Tester' in self.browser.contents)
232        # The old searchterm will be used again
233        self.browser.getControl("Search").click()
234        self.assertTrue('Anna Tester' in self.browser.contents)
235
236        ctrl = self.browser.getControl(name='entries')
237        ctrl.getControl(value=self.student_id).selected = True
238        self.browser.getControl("Remove selected", index=0).click()
239        self.assertTrue('Successfully removed' in self.browser.contents)
240        self.browser.getControl(name="searchtype").value = ['student_id']
241        self.browser.getControl(name="searchterm").value = self.student_id
242        self.browser.getControl("Search").click()
243        self.assertTrue('No student found' in self.browser.contents)
244
245        self.browser.open(self.container_path)
246        self.browser.getControl(name="searchtype").value = ['student_id']
247        self.browser.getControl(name="searchterm").value = self.student_id
248        self.browser.getControl("Search").click()
249        self.assertTrue('No student found' in self.browser.contents)
250        return
251
252class StudentUITests(StudentsFullSetup):
253    # Tests for Student class views and pages
254
255    layer = FunctionalLayer
256
257    def test_manage_access(self):
258        # Managers can access the pages of students
259        # and can perform actions
260        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
261
262        self.browser.open(self.student_path)
263        self.assertEqual(self.browser.headers['Status'], '200 Ok')
264        self.assertEqual(self.browser.url, self.student_path)
265        self.browser.getLink("Manage").click()
266        self.assertEqual(self.browser.headers['Status'], '200 Ok')
267        self.assertEqual(self.browser.url, self.manage_student_path)
268        # Managers can edit base data and fire transitions
269        self.browser.getControl(name="transition").value = ['admit']
270        self.browser.getControl(name="form.fullname").value = 'John Tester'
271        self.browser.getControl(name="form.reg_number").value = '345'
272        self.browser.getControl(name="password").value = 'secret'
273        self.browser.getControl(name="control_password").value = 'secret'
274        self.browser.getControl("Save").click()
275        self.assertMatches('...Form has been saved...',
276                           self.browser.contents)
277        self.browser.open(self.student_path)
278        self.browser.getLink("Clearance Data").click()
279        self.assertEqual(self.browser.headers['Status'], '200 Ok')
280        self.assertEqual(self.browser.url, self.clearance_student_path)
281        self.browser.getLink("Manage").click()
282        self.assertEqual(self.browser.headers['Status'], '200 Ok')
283        self.assertEqual(self.browser.url, self.edit_clearance_student_path)
284        self.browser.getControl(name="form.date_of_birth").value = '09/10/1961'
285        self.browser.getControl("Save").click()
286        self.assertMatches('...Form has been saved...',
287                           self.browser.contents)
288
289        self.browser.open(self.student_path)
290        self.browser.getLink("Personal Data").click()
291        self.assertEqual(self.browser.headers['Status'], '200 Ok')
292        self.assertEqual(self.browser.url, self.personal_student_path)
293        self.browser.getLink("Manage").click()
294        self.assertEqual(self.browser.headers['Status'], '200 Ok')
295        self.assertEqual(self.browser.url, self.edit_personal_student_path)
296        self.browser.getControl("Save").click()
297        self.assertMatches('...Form has been saved...',
298                           self.browser.contents)
299
300        # Managers can browse all subobjects
301        self.browser.open(self.student_path)
302        self.browser.getLink("Payments").click()
303        self.assertEqual(self.browser.headers['Status'], '200 Ok')
304        self.assertEqual(self.browser.url, self.payments_student_path)
305        self.browser.open(self.student_path)
306        self.browser.getLink("Accommodation").click()
307        self.assertEqual(self.browser.headers['Status'], '200 Ok')
308        self.assertEqual(self.browser.url, self.accommodation_student_path)
309        self.browser.open(self.student_path)
310        self.browser.getLink("History").click()
311        self.assertEqual(self.browser.headers['Status'], '200 Ok')
312        self.assertEqual(self.browser.url, self.history_student_path)
313        self.assertMatches('...Student admitted by zope.mgr...',
314                           self.browser.contents)
315        return
316
317    def test_manage_course_lists(self):
318        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
319        self.browser.open(self.student_path)
320        self.browser.getLink("Study Course").click()
321        self.assertEqual(self.browser.headers['Status'], '200 Ok')
322        self.assertEqual(self.browser.url, self.studycourse_student_path)
323        self.browser.getLink("Manage").click()
324        self.assertTrue('Manage study course' in self.browser.contents)
325        # Before we can select a level, the certificate must be selected and saved
326        self.browser.getControl(name="form.certificate").value = ['CERT1']
327        self.browser.getControl(name="form.current_session").value = ['2004']
328        self.browser.getControl(name="form.current_verdict").value = ['A']
329        self.browser.getControl("Save").click()
330        # Now we can save also the current level which depends on start and end
331        # level of the certificate
332        self.browser.getControl(name="form.current_level").value = ['100']
333        self.browser.getControl("Save").click()
334        # Managers can add and remove any study level (course list)
335        self.browser.getControl(name="addlevel").value = ['100']
336        self.browser.getControl("Add study level").click()
337        self.assertMatches('...<span>100</span>...', self.browser.contents)
338        self.browser.getControl(name="val_id").value = ['100']
339        self.browser.getControl("Remove selected").click()
340        self.assertMatches('...Successfully removed...', self.browser.contents)
341        # Add again level again
342        self.browser.getControl(name="addlevel").value = ['100']
343        self.browser.getControl("Add study level").click()
344
345        # Managers can view and manage course lists
346        self.browser.getLink("100").click()
347        self.assertMatches('...: Study Level 100 (Year 1)...', self.browser.contents)
348        self.browser.getLink("Manage").click()
349        self.browser.getControl(name="form.level_session").value = ['2002']
350        self.browser.getControl("Save").click()
351        ctrl = self.browser.getControl(name='val_id')
352        ctrl.getControl(value='COURSE1').selected = True
353        self.browser.getControl("Remove selected", index=0).click()
354        self.assertTrue('Successfully removed' in self.browser.contents)
355        self.browser.getControl("Add course ticket").click()
356        self.browser.getControl(name="form.course").value = ['COURSE1']
357        self.browser.getControl("Add course ticket").click()
358        self.assertTrue('Successfully added' in self.browser.contents)
359        self.browser.getLink("COURSE1").click()
360        self.browser.getLink("Manage").click()
361        self.browser.getControl(name="form.score").value = '10'
362        self.browser.getControl("Save").click()
363        self.assertTrue('Form has been saved' in self.browser.contents)
364        return
365
366    def test_manage_workflow(self):
367        # Managers can pass through the whole workflow
368        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
369        student = self.app['students'][self.student_id]
370        self.browser.open(self.manage_student_path)
371        self.assertTrue(student.clearance_locked)
372        self.browser.getControl(name="transition").value = ['admit']
373        self.browser.getControl("Save").click()
374        self.assertTrue(student.clearance_locked)
375        self.browser.getControl(name="transition").value = ['start_clearance']
376        self.browser.getControl("Save").click()
377        self.assertFalse(student.clearance_locked)
378        self.browser.getControl(name="transition").value = ['request_clearance']
379        self.browser.getControl("Save").click()
380        self.assertTrue(student.clearance_locked)
381        self.browser.getControl(name="transition").value = ['clear']
382        self.browser.getControl("Save").click()
383        self.browser.getControl(name="transition").value = ['pay_first_school_fee']
384        self.browser.getControl("Save").click()
385        self.browser.getControl(name="transition").value = ['reset6']
386        self.browser.getControl("Save").click()
387        # In state returning the pay_school_fee transition triggers some
388        # changes of attributes
389        self.browser.getControl(name="transition").value = ['pay_school_fee']
390        self.browser.getControl("Save").click()
391        self.assertEqual(student['studycourse'].current_session, 2005) # +1
392        self.assertEqual(student['studycourse'].current_level, 200) # +100
393        self.assertEqual(student['studycourse'].current_verdict, '0') # 0 = not set
394        self.assertEqual(student['studycourse'].previous_verdict, 'A')
395        self.browser.getControl(name="transition").value = ['register_courses']
396        self.browser.getControl("Save").click()
397        self.browser.getControl(name="transition").value = ['validate_courses']
398        self.browser.getControl("Save").click()
399        self.browser.getControl(name="transition").value = ['return']
400        self.browser.getControl("Save").click()
401        return
402
403    def test_manage_import(self):
404        # Managers can import student data files
405        datacenter_path = 'http://localhost/app/datacenter'
406        # Prepare a csv file for students
407        open('students.csv', 'wb').write(
408"""firstname,lastname,fullname,reg_number,date_of_birth,matric_number
409Aaren,Pieri,Aaren Pieri,1,1990-01-02,100000
410Claus,Finau,Claus Finau,2,1990-01-03,100001
411Brit,Berson,Brit Berson,3,1990-01-04,100001
412""")
413        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
414        self.browser.open(datacenter_path)
415        self.browser.getLink('Upload CSV file').click()
416        filecontents = cStringIO.StringIO(open('students.csv', 'rb').read())
417        filewidget = self.browser.getControl(name='uploadfile:file')
418        filewidget.add_file(filecontents, 'text/plain', 'students.csv')
419        self.browser.getControl(name='SUBMIT').click()
420        self.browser.getLink('Batch processing').click()
421        button = lookup_submit_value(
422            'select', 'students_zope.mgr.csv', self.browser)
423        button.click()
424        importerselect = self.browser.getControl(name='importer')
425        modeselect = self.browser.getControl(name='mode')
426        importerselect.getControl('Student Importer').selected = True
427        modeselect.getControl(value='create').selected = True
428        self.browser.getControl('Proceed to step 3...').click()
429        self.assertTrue('Header fields OK' in self.browser.contents)
430        self.browser.getControl('Perform import...').click()
431        self.assertTrue('Processing of 1 rows failed' in self.browser.contents)
432        self.assertTrue('Successfully processed 2 rows' in self.browser.contents)
433        self.assertTrue('Batch processing finished' in self.browser.contents)
434        open('studycourses.csv', 'wb').write(
435"""reg_number,matric_number,certificate,current_session,current_level
4361,,CERT1,2008,100
437,100001,CERT1,2008,100
438,100002,CERT1,2008,100
439""")
440        self.browser.open(datacenter_path)
441        self.browser.getLink('Upload CSV file').click()
442        filecontents = cStringIO.StringIO(open('studycourses.csv', 'rb').read())
443        filewidget = self.browser.getControl(name='uploadfile:file')
444        filewidget.add_file(filecontents, 'text/plain', 'studycourses.csv')
445        self.browser.getControl(name='SUBMIT').click()
446        self.browser.getLink('Batch processing').click()
447        button = lookup_submit_value(
448            'select', 'studycourses_zope.mgr.csv', self.browser)
449        button.click()
450        importerselect = self.browser.getControl(name='importer')
451        modeselect = self.browser.getControl(name='mode')
452        importerselect.getControl(
453            'StudentStudyCourse Importer (update only)').selected = True
454        modeselect.getControl(value='create').selected = True
455        self.browser.getControl('Proceed to step 3...').click()
456        self.assertTrue('Update mode only' in self.browser.contents)
457        self.browser.getControl('Proceed to step 3...').click()
458        self.assertTrue('Header fields OK' in self.browser.contents)
459        self.browser.getControl('Perform import...').click()
460        self.assertTrue('Processing of 1 rows failed' in self.browser.contents)
461        self.assertTrue('Successfully processed 2 rows' in self.browser.contents)
462
463    def test_student_change_password(self):
464        # Students can change the password
465        self.browser.open(self.login_path)
466        self.browser.getControl(name="form.login").value = self.student_id
467        self.browser.getControl(name="form.password").value = 'spwd'
468        self.browser.getControl("Login").click()
469        self.assertEqual(self.browser.url, self.student_path)
470        self.assertTrue('You logged in' in self.browser.contents)
471        # Change password
472        self.browser.getLink("Change password").click()
473        self.browser.getControl(name="form.password").value = 'new_password'
474        self.browser.getControl(
475            name="form.password_repeat").value = 'new_passssword'
476        self.browser.getControl("Save").click()
477        self.assertTrue('passwords do not match' in self.browser.contents)
478        self.browser.getControl(name="form.password").value = 'new_password'
479        self.browser.getControl(
480            name="form.password_repeat").value = 'new_password'
481        self.browser.getControl("Save").click()
482        self.assertTrue('Form has been saved' in self.browser.contents)
483        # We are still logged in. Changing the password hasn't thrown us out.
484        self.browser.getLink("My Data").click()
485        self.assertEqual(self.browser.url, self.student_path)
486        # We can logout
487        self.browser.getLink("Logout").click()
488        self.assertTrue('You have been logged out' in self.browser.contents)
489        self.assertEqual(self.browser.url, 'http://localhost/app')
490        # We can login again with the new password
491        self.browser.getLink("Login").click()
492        self.browser.open(self.login_path)
493        self.browser.getControl(name="form.login").value = self.student_id
494        self.browser.getControl(name="form.password").value = 'new_password'
495        self.browser.getControl("Login").click()
496        self.assertEqual(self.browser.url, self.student_path)
497        self.assertTrue('You logged in' in self.browser.contents)
498        return
499
500    def test_setpassword(self):
501        # Set password for first-time access
502        student = Student()
503        student.reg_number = u'123456'
504        student.fullname = u'Klaus Tester'
505        self.app['students'].addStudent(student)
506        setpassword_path = 'http://localhost/app/setpassword'
507        student_path = 'http://localhost/app/students/%s' % student.student_id
508        self.browser.open(setpassword_path)
509        self.browser.getControl(name="ac_series").value = self.existing_pwdseries
510        self.browser.getControl(name="ac_number").value = self.existing_pwdnumber
511        self.browser.getControl(name="reg_number").value = '223456'
512        self.browser.getControl("Show").click()
513        self.assertMatches('...No student found...',
514                           self.browser.contents)
515        self.browser.getControl(name="reg_number").value = '123456'
516        self.browser.getControl(name="ac_number").value = '999999'
517        self.browser.getControl("Show").click()
518        self.assertMatches('...Access code is invalid...',
519                           self.browser.contents)
520        self.browser.getControl(name="ac_number").value = self.existing_pwdnumber
521        self.browser.getControl("Show").click()
522        self.assertMatches('...Password has been set. Your Student Id is...',
523                           self.browser.contents)
524        self.browser.getControl("Show").click()
525        self.assertMatches(
526            '...Password has already been set. Your Student Id is...',
527            self.browser.contents)
528        existing_pwdpin = self.pwdpins[1]
529        parts = existing_pwdpin.split('-')[1:]
530        existing_pwdseries, existing_pwdnumber = parts
531        self.browser.getControl(name="ac_series").value = existing_pwdseries
532        self.browser.getControl(name="ac_number").value = existing_pwdnumber
533        self.browser.getControl(name="reg_number").value = '123456'
534        self.browser.getControl("Show").click()
535        self.assertMatches(
536            '...You are using the wrong Access Code...',
537            self.browser.contents)
538        # The student can login with the new credentials
539        self.browser.open(self.login_path)
540        self.browser.getControl(name="form.login").value = student.student_id
541        self.browser.getControl(
542            name="form.password").value = self.existing_pwdnumber
543        self.browser.getControl("Login").click()
544        self.assertEqual(self.browser.url, student_path)
545        self.assertTrue('You logged in' in self.browser.contents)
546        return
547
548    def test_student_access(self):
549        # Students can access their own objects
550        # and can perform actions
551        student = self.app['students'][self.student_id]
552        IWorkflowInfo(student).fireTransition('admit')
553        self.browser.open(self.login_path)
554        self.browser.getControl(name="form.login").value = self.student_id
555        self.browser.getControl(name="form.password").value = 'spwd'
556        self.browser.getControl("Login").click()
557        # Student can view the clearance data
558        self.browser.getLink("Clearance Data").click()
559        # Student can't open clearance edit form before starting clearance
560        self.browser.open(self.student_path + '/cedit')
561        self.assertMatches('...The requested form is locked...',
562                           self.browser.contents)
563        self.browser.getLink("Clearance Data").click()
564        self.browser.getLink("Start clearance").click()
565        self.browser.getControl(name="ac_series").value = self.existing_clrseries
566        self.browser.getControl(name="ac_number").value = self.existing_clrnumber
567        self.browser.getControl("Start clearance now").click()
568        self.assertMatches('...Clearance process has been started...',
569                           self.browser.contents)
570        self.browser.getControl(name="form.date_of_birth").value = '09/10/1961'
571        self.browser.getControl("Save", index=0).click()
572        # Student can view the clearance data
573        self.browser.getLink("Clearance Data").click()
574        # and go back to the edit form
575        self.browser.getLink("Edit").click()
576        self.browser.getControl("Save and request clearance").click()
577        self.browser.getControl(name="ac_series").value = self.existing_clrseries
578        self.browser.getControl(name="ac_number").value = self.existing_clrnumber
579        self.browser.getControl("Request clearance now").click()
580        self.assertMatches('...Clearance has been requested...',
581                           self.browser.contents)
582        # Student can't reopen clearance form after requesting clearance
583        self.browser.open(self.student_path + '/cedit')
584        self.assertMatches('...The requested form is locked...',
585                           self.browser.contents)
586        IWorkflowInfo(student).fireTransition('clear')
587        IWorkflowInfo(student).fireTransition('pay_first_school_fee')
588        # Students can add the current study level
589        self.browser.getLink("Study Course").click()
590        self.browser.getLink("Add course list").click()
591        self.assertMatches('...Add current level 100 (Year 1)...',
592                           self.browser.contents)
593        self.browser.getControl("Create course list now").click()
594        self.browser.getLink("100").click()
595        self.browser.getLink("Add and remove courses").click()
596        self.browser.getControl("Add course ticket").click()
597        self.browser.getControl(name="form.course").value = ['COURSE1']
598        self.browser.getControl("Add course ticket").click()
599        self.assertMatches('...The ticket exists...',
600                           self.browser.contents)
601        self.student['studycourse'].current_level = 200
602        self.browser.getLink("Study Course").click()
603        self.browser.getLink("Add course list").click()
604        self.assertMatches('...Add current level 200 (Year 2)...',
605                           self.browser.contents)
606        self.browser.getControl("Create course list now").click()
607        self.browser.getLink("200").click()
608        self.browser.getLink("Add and remove courses").click()
609        self.browser.getControl("Add course ticket").click()
610        self.browser.getControl(name="form.course").value = ['COURSE1']
611        self.browser.getControl("Add course ticket").click()
612        self.assertMatches('...Successfully added COURSE1...',
613                           self.browser.contents)
614        ctrl = self.browser.getControl(name='val_id')
615        ctrl.getControl(value='COURSE1').selected = True
616        self.browser.getControl("Remove selected", index=0).click()
617        self.assertTrue('Successfully removed' in self.browser.contents)
618        self.browser.getControl("Register course list").click()
619        self.assertTrue('Course list has been registered' in self.browser.contents)
620        self.assertEqual(self.student.state, 'courses registered')
621        return
622
623    def test_manage_access(self):
624        # Managers can add online payment tickets
625        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
626        self.browser.open(self.payments_student_path)
627        self.browser.getLink("Manage").click()
628        self.browser.getControl("Add online payment ticket").click()
Note: See TracBrowser for help on using the repository browser.