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

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

Add clearance_locked attribute and set True when a student is added.

Add clearance edit page for students.

Shorten page template names.

Rename Edit buttons for officers. Officers are managing and students are editing objects.

  • Property svn:keywords set to Id
File size: 12.8 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 6695 2011-09-09 06:03:28Z 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.password").value = 'secret'
208        self.browser.getControl("Save").click()
209        self.assertTrue('Form has been saved' in self.browser.contents)
210
211        self.browser.open(self.student_path)
212        self.browser.getLink("Clearance Data").click()
213        self.assertEqual(self.browser.headers['Status'], '200 Ok')
214        self.assertEqual(self.browser.url, self.clearance_student_path)
215        self.browser.getLink("Manage").click()
216        self.assertEqual(self.browser.headers['Status'], '200 Ok')
217        self.assertEqual(self.browser.url, self.edit_clearance_student_path)
218
219        self.browser.open(self.student_path)
220        self.browser.getLink("Personal Data").click()
221        self.assertEqual(self.browser.headers['Status'], '200 Ok')
222        self.assertEqual(self.browser.url, self.personal_student_path)
223        self.browser.getLink("Manage").click()
224        self.assertEqual(self.browser.headers['Status'], '200 Ok')
225        self.assertEqual(self.browser.url, self.edit_personal_student_path)
226
227        self.browser.open(self.student_path)
228        self.browser.getLink("Study Course").click()
229        self.assertEqual(self.browser.headers['Status'], '200 Ok')
230        self.assertEqual(self.browser.url, self.studycourse_student_path)
231        self.browser.getLink("Manage").click()
232        self.assertTrue('Manage study course' in self.browser.contents)
233
234        self.browser.open(self.student_path)
235        self.browser.getLink("Payments").click()
236        self.assertEqual(self.browser.headers['Status'], '200 Ok')
237        self.assertEqual(self.browser.url, self.payments_student_path)
238
239        self.browser.open(self.student_path)
240        self.browser.getLink("Accommodation").click()
241        self.assertEqual(self.browser.headers['Status'], '200 Ok')
242        self.assertEqual(self.browser.url, self.accommodation_student_path)
243
244        self.browser.open(self.student_path)
245        self.browser.getLink("History").click()
246        self.assertEqual(self.browser.headers['Status'], '200 Ok')
247        self.assertEqual(self.browser.url, self.history_student_path)
248        self.assertMatches('...Student admitted by zope.mgr...',
249                           self.browser.contents)
250        return
251
252    def test_student_access(self):
253        # Students can access their own objects
254        # and can perform actions
255
256        self.browser.open(self.login_path)
257        self.browser.getControl(name="form.login").value = self.test_student_id
258        self.browser.getControl(name="form.password").value = 'spwd'
259        self.browser.getControl("Login").click()
260        self.assertEqual(self.browser.url, self.student_path)
261        self.assertTrue('You logged in' in self.browser.contents)
262        # Change password
263        self.browser.getLink("Change password").click()
264        self.browser.getControl(name="form.password").value = 'new_password'
265        self.browser.getControl("Save").click()
266        self.assertTrue('Form has been saved' in self.browser.contents)
267        # We are still logged in. Changing the password hasn't thrown us out.
268        self.browser.getLink("My Data").click()
269        self.assertEqual(self.browser.url, self.student_path)
270        # We can logout
271        self.browser.getLink("Logout").click()
272        self.assertTrue('You have been logged out' in self.browser.contents)
273        self.assertEqual(self.browser.url, 'http://localhost/app')
274        # We can login again with the new password
275        self.browser.getLink("Login").click()
276        self.browser.open(self.login_path)
277        self.browser.getControl(name="form.login").value = self.test_student_id
278        self.browser.getControl(name="form.password").value = 'new_password'
279        self.browser.getControl("Login").click()
280        self.assertEqual(self.browser.url, self.student_path)
281        self.assertTrue('You logged in' in self.browser.contents)
282
283        return
Note: See TracBrowser for help on using the repository browser.