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

Last change on this file since 6700 was 6699, checked in by Henrik Bettermann, 14 years ago

Add SetPassword? page which uses an PWD access code as password for first-time login (admission checking).

Remove password from schema. This makes things much easier to handle.

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