2
# SchoolTool - common information systems platform for school administration
3
# Copyright (c) 2005 Shuttleworth Foundation
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
Functional tests for schooltool.intervention
26
from datetime import date
28
from zope.interface import Interface, implements
29
from zope.publisher.browser import BrowserView
30
from zope.security.proxy import removeSecurityProxy
32
from schooltool.app.browser.ftests import setup
33
from schooltool.app.interfaces import ISchoolToolApplication
34
from schooltool.contact.interfaces import IContact
35
from schooltool.testing.analyze import queryHTML
36
from schooltool.testing.functional import collect_ftests
37
from schooltool.testing.functional import ZCMLLayer
38
from schooltool.skin.skin import ISchoolToolSkin
39
from schooltool.basicperson.browser.skin import IBasicPersonLayer
42
class IInterventionFtestingSkin(IBasicPersonLayer, ISchoolToolSkin):
43
"""Skin for Intervention functional tests."""
46
dir = os.path.abspath(os.path.dirname(__file__))
47
filename = os.path.join(dir, '../ftesting.zcml')
49
intervention_functional_layer = ZCMLLayer(filename,
51
'intervention_functional_layer')
55
return setup.logIn('manager', 'schooltool')
58
def addPerson(first_name, last_name, username, password, groups=None, browser=None):
61
If username is not specified, it will be taken to be name.lower().
63
If password is not specified, it will be taken to be username + 'pwd'.
66
browser = logInManager()
67
browser.getLink('Manage').click()
68
browser.getLink('Persons').click()
69
browser.getLink('New Person').click()
70
browser.getControl('First name').value = first_name
71
browser.getControl('Last name').value = last_name
72
browser.getControl('Username').value = username
73
browser.getControl('Password').value = password
74
browser.getControl('Confirm').value = password
75
browser.getControl('Add').click()
78
browser.open('http://localhost/persons/%s' % username)
79
browser.getLink('edit groups').click()
81
browser.getControl(name='add_item.%s' % group).value = True
82
browser.getControl('Add').click()
83
browser.getControl('OK').click()
85
fillInContactInfo(username, browser=browser,
86
email='%s@example.com' % username)
87
browser.open('http://localhost/persons')
90
def fillInContactInfo(username, browser=None, email=None, language=None):
92
browser = logInManager()
93
browser.open('http://localhost/persons/%s' % username)
94
# TODO: other needed fields
96
'form.widgets.email': email,
97
'form.widgets.language': language,
99
browser.getLink('Contacts').click()
100
browser.getLink('Edit').click()
101
for name, value in contact_fields.items():
102
if value is not None:
103
browser.getControl(name=name).value = value
104
browser.getControl('Apply').click()
107
def addCourseSectionMembers(course, section, teachers, students):
108
setup.addCourse(course, '2005-2006')
109
setup.addSection(course, '2005-2006', 'Spring', section)
110
manager = logInManager()
111
manager.getLink('Manage').click()
112
manager.getLink('School Years').click()
113
manager.getLink('2005-2006').click()
114
manager.getLink('Spring').click()
115
manager.getLink('Sections').click()
116
manager.getLink(section).click()
117
manager.getLink('edit instructors').click()
118
for teacher in teachers:
119
manager.getControl(teacher).click()
120
manager.getControl('Add').click()
121
manager.getControl('OK').click()
122
manager.getLink('edit individuals').click()
123
for student in students:
124
manager.getControl(student).click()
125
manager.getControl('Add').click()
126
manager.getControl('OK').click()
129
def addAdvisors(student, advisors):
130
manager = logInManager()
131
for advisor in advisors:
132
manager.getLink('Manage').click()
133
manager.getLink('Persons').click()
134
manager.getLink(student).click()
135
manager.getLink('Advisors').click()
136
manager.getControl(name='add_item.' + advisor).value = 'checked'
137
manager.getControl('Add').click()
140
def removeAdvisors(student, advisors):
141
manager = logInManager()
142
for advisor in advisors:
143
manager.getLink('Manage').click()
144
manager.getLink('Persons').click()
145
manager.getLink(student).click()
146
manager.getLink('Advisors').click()
147
manager.getControl(name='remove_item.' + advisor).value = 'checked'
148
manager.getControl('Remove').click()
151
def _checkPersonsResponsible(browser, url, persons_responsible):
153
pre_checked_xpath = '//input[@type="checkbox"][@checked="checked"]/@name'
154
for fld in queryHTML(pre_checked_xpath, browser.contents):
155
browser.getControl(name=fld).value = False
156
all_checkboxes_xpath = '//input[@type="checkbox"]/@name'
157
for person in persons_responsible:
158
for fld in queryHTML(all_checkboxes_xpath, browser.contents):
159
if fld.startswith('persons.' + person):
160
browser.getControl(name=fld).value = True
163
def addMessage(browser, url, persons_responsible, body='x'):
164
_checkPersonsResponsible(browser, url, persons_responsible)
165
browser.getControl(name='field.body').value = body
166
browser.getControl(name='UPDATE_SUBMIT').click()
169
def addEditGoal(browser, url, persons_responsible, values=None):
170
_checkPersonsResponsible(browser, url, persons_responsible)
172
values = ['x', 'x', 'x', 'x', 'x', date.today()]
173
browser.getControl('Presenting concerns').value = values[0]
174
browser.getControl(name='field.goal').value = values[1]
175
browser.getControl('Strengths').value = values[2]
176
browser.getControl('Indicators').value = values[3]
177
browser.getControl('Intervention').value = values[4]
178
browser.getControl('Timeline').value = str(values[5])
179
browser.getControl(name='UPDATE_SUBMIT').click()
182
class TestOnlyUpdateResponsibleView(BrowserView):
185
persons = ISchoolToolApplication(None)['persons']
186
if 'add' in self.request:
187
username = self.request.get('add')
188
contact = IContact(persons[username])
189
self.responsible.add(contact)
190
elif 'remove' in self.request:
191
username = self.request.get('remove')
192
contact = IContact(persons[username])
193
self.responsible.remove(contact)
196
class TestOnlyUpdateRecipientsView(TestOnlyUpdateResponsibleView):
198
def __init__(self, context, request):
199
super(TestOnlyUpdateRecipientsView, self).__init__(context, request)
200
self.responsible = removeSecurityProxy(self.context).recipients
203
class TestOnlyUpdatePersonsResponsibleView(TestOnlyUpdateResponsibleView):
205
def __init__(self, context, request):
206
super(TestOnlyUpdatePersonsResponsibleView, self).__init__(context, request)
207
self.responsible = removeSecurityProxy(self.context).persons_responsible
210
class ActivitiesStub(object):
212
worksheet1 = WorksheetStub('Worksheet1', True)
213
worksheet2 = WorksheetStub('Worksheet2', False)
214
return [worksheet1, worksheet2]
217
class IWorksheetStub(Interface):
221
class WorksheetStub(object):
222
implements(IWorksheetStub)
224
def __init__(self, title, deployed):
226
self.deployed = deployed
229
class WorksheetAbsoluteURLStub(object):
230
def __init__(self, worksheet, request):
231
self.worksheet = worksheet
234
return self.worksheet.title
237
def getSectionIndependentActivities(section):
238
if section.title == 'special title':
239
return ActivitiesStub()
243
return collect_ftests(layer=intervention_functional_layer)
246
if __name__ == '__main__':
247
unittest.main(defaultTest='test_suite')