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

Last change on this file since 6758 was 6758, checked in by uli, 13 years ago

Use more simple form names, fix nesting errors, etc.

  • Property svn:keywords set to Id
File size: 15.1 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 6758 2011-09-14 01:56:26Z uli $
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
27from datetime import datetime
28from zope.component import createObject
29from zope.component.hooks import setSite, clearSite
30from zope.security.interfaces import Unauthorized
31from zope.testbrowser.testing import Browser
32from waeup.sirp.testing import FunctionalLayer, FunctionalTestCase
33from waeup.sirp.app import University
34from waeup.sirp.students.student import Student
35from waeup.sirp.university.faculty import Faculty
36from waeup.sirp.university.department import Department
37from waeup.sirp.interfaces import IUserAccount
38
39PH_LEN = 2059  # Length of placeholder file
40
41class StudentsFullSetup(FunctionalTestCase):
42    # A test case that only contains a setup and teardown
43    #
44    # Complete setup for students handlings is rather complex and
45    # requires lots of things created before we can start. This is a
46    # setup that does all this, creates a university, creates PINs,
47    # etc.  so that we do not have to bother with that in different
48    # test cases.
49
50    layer = FunctionalLayer
51
52    def setUp(self):
53        super(StudentsFullSetup, self).setUp()
54
55        # Setup a sample site for each test
56        app = University()
57        self.dc_root = tempfile.mkdtemp()
58        app['datacenter'].setStoragePath(self.dc_root)
59
60        # Prepopulate the ZODB...
61        self.getRootFolder()['app'] = app
62        # we add the site immediately after creation to the
63        # ZODB. Catalogs and other local utilities are not setup
64        # before that step.
65        self.app = self.getRootFolder()['app']
66        # Set site here. Some of the following setup code might need
67        # to access grok.getSite() and should get our new app then
68        setSite(app)
69
70        # Add student with subobjects (done by addStudent)
71        student = Student()
72        student.name = u'Anna Tester'
73        student.reg_number = u'123'
74        student.matric_number = u'234'
75        self.test_student_id = self.app['students'].addStudent(student)
76        # Set password
77        IUserAccount(
78            self.app['students'][self.test_student_id]).setPassword('spwd')
79
80        self.login_path = 'http://localhost/app/login'
81        self.container_path = 'http://localhost/app/students'
82        self.manage_container_path = self.container_path + '/@@manage'
83        self.add_student_path = self.container_path + '/addstudent'
84        self.student_path = self.container_path + '/' + self.test_student_id
85        self.manage_student_path = self.student_path + '/edit_base'
86        self.clearance_student_path = self.student_path + '/view_clearance'
87        self.personal_student_path = self.student_path + '/view_personal'
88        self.edit_clearance_student_path = self.student_path + '/edit_clearance'
89        self.edit_personal_student_path = self.student_path + '/edit_personal'
90
91        self.studycourse_student_path = self.student_path + '/studycourse'
92        self.payments_student_path = self.student_path + '/payments'
93        self.accommodation_student_path = self.student_path + '/accommodation'
94        self.history_student_path = self.student_path + '/history'
95
96        # Create 5 access codes with prefix'PWD' and cost 9.99 each
97        pin_container = self.app['accesscodes']
98        pin_container.createBatch(
99            datetime.now(), 'some_userid', 'PWD', 9.99, 5)
100        pins = pin_container[pin_container.keys()[0]].values()
101        self.pins = [x.representation for x in pins]
102        self.existing_pin = self.pins[0]
103        parts = self.existing_pin.split('-')[1:]
104        self.existing_series, self.existing_number = parts
105
106        # Populate university
107        certificate = createObject('waeup.Certificate')
108        certificate.code = 'CERT1'
109        certificate.application_category = 'basic'
110        self.app['faculties']['fac1'] = Faculty()
111        self.app['faculties']['fac1']['dep1'] = Department()
112        self.app['faculties']['fac1']['dep1'].certificates.addCertificate(
113            certificate)
114
115        # Put the prepopulated site into test ZODB and prepare test
116        # browser
117        self.browser = Browser()
118        self.browser.handleErrors = False
119
120    def tearDown(self):
121        super(StudentsFullSetup, self).tearDown()
122        clearSite()
123        shutil.rmtree(self.dc_root)
124
125
126
127class StudentsContainerUITests(StudentsFullSetup):
128    # Tests for StudentsContainer class views and pages
129
130    layer = FunctionalLayer
131
132    def test_anonymous_access(self):
133        # Anonymous users can't access students containers
134        self.assertRaises(
135            Unauthorized, self.browser.open, self.container_path)
136        self.assertRaises(
137            Unauthorized, self.browser.open, self.manage_container_path)
138        return
139
140    def test_manage_access(self):
141        # Managers can access the view page of students
142        # containers and can perform actions
143        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
144        self.browser.open(self.container_path)
145        self.assertEqual(self.browser.headers['Status'], '200 Ok')
146        self.assertEqual(self.browser.url, self.container_path)
147        self.browser.getLink("Manage student section").click()
148        self.assertEqual(self.browser.headers['Status'], '200 Ok')
149        self.assertEqual(self.browser.url, self.manage_container_path)
150        return
151
152    def test_add_search_delete_students(self):
153        # Managers can add search and remove students
154        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
155        self.browser.open(self.manage_container_path)
156        self.browser.getLink("Add student").click()
157        self.assertEqual(self.browser.headers['Status'], '200 Ok')
158        self.assertEqual(self.browser.url, self.add_student_path)
159        self.browser.getControl(name="form.name").value = 'Bob Tester'
160        self.browser.getControl("Create student record").click()
161        self.assertTrue('Student record created' in self.browser.contents)
162
163        # Registration numbers must be unique
164        self.browser.getLink("Manage").click()
165        self.browser.getControl(name="form.reg_number").value = '123'
166        self.browser.getControl("Save").click()
167        self.assertMatches('...value already exists in catalog...',
168                           self.browser.contents)
169
170        self.browser.open(self.container_path)
171        self.browser.getControl("Search").click()
172        self.assertTrue('Empty search string' in self.browser.contents)
173        self.browser.getControl(name="searchtype").value = ['student_id']
174        self.browser.getControl(name="searchterm").value = self.test_student_id
175        self.browser.getControl("Search").click()
176        self.assertTrue('Anna Tester' in self.browser.contents)
177
178        self.browser.open(self.manage_container_path)
179        self.browser.getControl("Search").click()
180        self.assertTrue('Empty search string' in self.browser.contents)
181        self.browser.getControl(name="searchtype").value = ['name']
182        self.browser.getControl(name="searchterm").value = 'Anna Tester'
183        self.browser.getControl("Search").click()
184        self.assertTrue('Anna Tester' in self.browser.contents)
185        # The old searchterm will be used again
186        self.browser.getControl("Search").click()
187        self.assertTrue('Anna Tester' in self.browser.contents)
188
189        ctrl = self.browser.getControl(name='entries')
190        ctrl.getControl(value=self.test_student_id).selected = True
191        self.browser.getControl("Remove selected", index=0).click()
192        self.assertTrue('Successfully removed' in self.browser.contents)
193        self.browser.getControl(name="searchtype").value = ['student_id']
194        self.browser.getControl(name="searchterm").value = self.test_student_id
195        self.browser.getControl("Search").click()
196        self.assertTrue('No student found' in self.browser.contents)
197
198        self.browser.open(self.container_path)
199        self.browser.getControl(name="searchtype").value = ['student_id']
200        self.browser.getControl(name="searchterm").value = self.test_student_id
201        self.browser.getControl("Search").click()
202        self.assertTrue('No student found' in self.browser.contents)
203
204class StudentUITests(StudentsFullSetup):
205    # Tests for Student class views and pages
206
207    layer = FunctionalLayer
208
209    def test_manage_access(self):
210        # Managers can access the pages of students
211        # and can perform actions
212        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
213
214        self.browser.open(self.student_path)
215        self.assertEqual(self.browser.headers['Status'], '200 Ok')
216        self.assertEqual(self.browser.url, self.student_path)
217        self.browser.getLink("Manage").click()
218        self.assertEqual(self.browser.headers['Status'], '200 Ok')
219        self.assertEqual(self.browser.url, self.manage_student_path)
220        # Managers can edit base data and fire transitions
221        self.browser.getControl(name="transition").value = ['admit']
222        self.browser.getControl(name="form.name").value = 'John Tester'
223        self.browser.getControl(name="form.reg_number").value = '123'
224        self.browser.getControl(name="password").value = 'secret'
225        self.browser.getControl(name="control_password").value = 'secret'
226        self.browser.getControl("Save").click()
227        self.assertMatches('...Form has been saved...',
228                           self.browser.contents)
229        self.browser.open(self.student_path)
230        self.browser.getLink("Clearance Data").click()
231        self.assertEqual(self.browser.headers['Status'], '200 Ok')
232        self.assertEqual(self.browser.url, self.clearance_student_path)
233        self.browser.getLink("Manage").click()
234        self.assertEqual(self.browser.headers['Status'], '200 Ok')
235        self.assertEqual(self.browser.url, self.edit_clearance_student_path)
236
237        self.browser.open(self.student_path)
238        self.browser.getLink("Personal Data").click()
239        self.assertEqual(self.browser.headers['Status'], '200 Ok')
240        self.assertEqual(self.browser.url, self.personal_student_path)
241        self.browser.getLink("Manage").click()
242        self.assertEqual(self.browser.headers['Status'], '200 Ok')
243        self.assertEqual(self.browser.url, self.edit_personal_student_path)
244
245        self.browser.open(self.student_path)
246        self.browser.getLink("Study Course").click()
247        self.assertEqual(self.browser.headers['Status'], '200 Ok')
248        self.assertEqual(self.browser.url, self.studycourse_student_path)
249        self.browser.getLink("Manage").click()
250        self.assertTrue('Manage study course' in self.browser.contents)
251
252        self.browser.open(self.student_path)
253        self.browser.getLink("Payments").click()
254        self.assertEqual(self.browser.headers['Status'], '200 Ok')
255        self.assertEqual(self.browser.url, self.payments_student_path)
256
257        self.browser.open(self.student_path)
258        self.browser.getLink("Accommodation").click()
259        self.assertEqual(self.browser.headers['Status'], '200 Ok')
260        self.assertEqual(self.browser.url, self.accommodation_student_path)
261
262        self.browser.open(self.student_path)
263        self.browser.getLink("History").click()
264        self.assertEqual(self.browser.headers['Status'], '200 Ok')
265        self.assertEqual(self.browser.url, self.history_student_path)
266        self.assertMatches('...Student admitted by zope.mgr...',
267                           self.browser.contents)
268        return
269
270    def test_student_access(self):
271        # Students can access their own objects
272        # and can perform actions
273        self.browser.open(self.login_path)
274        self.browser.getControl(name="form.login").value = self.test_student_id
275        self.browser.getControl(name="form.password").value = 'spwd'
276        self.browser.getControl("Login").click()
277        self.assertEqual(self.browser.url, self.student_path)
278        self.assertTrue('You logged in' in self.browser.contents)
279        # Change password
280        self.browser.getLink("Change password").click()
281        self.browser.getControl(name="form.password").value = 'new_password'
282        self.browser.getControl(
283            name="form.password_repeat").value = 'new_password'
284        self.browser.getControl("Save").click()
285        self.assertTrue('Form has been saved' in self.browser.contents)
286        # We are still logged in. Changing the password hasn't thrown us out.
287        self.browser.getLink("My Data").click()
288        self.assertEqual(self.browser.url, self.student_path)
289        # We can logout
290        self.browser.getLink("Logout").click()
291        self.assertTrue('You have been logged out' in self.browser.contents)
292        self.assertEqual(self.browser.url, 'http://localhost/app')
293        # We can login again with the new password
294        self.browser.getLink("Login").click()
295        self.browser.open(self.login_path)
296        self.browser.getControl(name="form.login").value = self.test_student_id
297        self.browser.getControl(name="form.password").value = 'new_password'
298        self.browser.getControl("Login").click()
299        self.assertEqual(self.browser.url, self.student_path)
300        self.assertTrue('You logged in' in self.browser.contents)
301        return
302
303    def test_setpassword(self):
304        # Set password for first-time access
305        # Add student with subobjects (done by addStudent)
306        student = Student()
307        student.reg_number = u'123456'
308        student.name = u'Klaus Tester'
309        test_student_id = self.app['students'].addStudent(student)
310        setpassword_path = 'http://localhost/app/setpassword'
311        student_path = 'http://localhost/app/students/%s' % test_student_id
312        self.browser.open(setpassword_path)
313        self.browser.getControl(name="ac_series").value = self.existing_series
314        self.browser.getControl(name="ac_number").value = self.existing_number
315        self.browser.getControl(name="reg_number").value = '123456'
316        self.browser.getControl("Show").click()
317        self.assertMatches('...Password has been set. Your Student Id is...',
318                           self.browser.contents)
319        # The student can login with the new credentials
320        self.browser.open(self.login_path)
321        self.browser.getControl(name="form.login").value = test_student_id
322        self.browser.getControl(
323            name="form.password").value = self.existing_number
324        self.browser.getControl("Login").click()
325        self.assertEqual(self.browser.url, student_path)
326        self.assertTrue('You logged in' in self.browser.contents)
327        return
Note: See TracBrowser for help on using the repository browser.