~ubuntu-branches/ubuntu/raring/schooltool.intervention/raring

« back to all changes in this revision

Viewing changes to src/schooltool/intervention/browser/ftests/ftests.py

  • Committer: Gediminas Paulauskas
  • Date: 2011-09-19 16:56:45 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: menesis@pov.lt-20110919165645-718diuud5tc4mjsx
Tags: 0.5.0-0ubuntu1
* New upstream release.
* debian/rules: move gradebook to Suggests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# SchoolTool - common information systems platform for school administration
 
3
# Copyright (c) 2005 Shuttleworth Foundation
 
4
#
 
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.
 
9
#
 
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.
 
14
#
 
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
 
18
#
 
19
"""
 
20
Functional tests for schooltool.intervention
 
21
 
 
22
"""
 
23
 
 
24
import unittest
 
25
import os
 
26
from datetime import date
 
27
 
 
28
from zope.interface import Interface, implements
 
29
from zope.publisher.browser import BrowserView
 
30
from zope.security.proxy import removeSecurityProxy
 
31
 
 
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
 
40
 
 
41
 
 
42
class IInterventionFtestingSkin(IBasicPersonLayer, ISchoolToolSkin):
 
43
    """Skin for Intervention functional tests."""
 
44
 
 
45
 
 
46
dir = os.path.abspath(os.path.dirname(__file__))
 
47
filename = os.path.join(dir, '../ftesting.zcml')
 
48
 
 
49
intervention_functional_layer = ZCMLLayer(filename,
 
50
                                 __name__,
 
51
                                 'intervention_functional_layer')
 
52
 
 
53
 
 
54
def logInManager():
 
55
    return setup.logIn('manager', 'schooltool')
 
56
 
 
57
 
 
58
def addPerson(first_name, last_name, username, password, groups=None, browser=None):
 
59
    """Add a person.
 
60
 
 
61
    If username is not specified, it will be taken to be name.lower().
 
62
 
 
63
    If password is not specified, it will be taken to be username + 'pwd'.
 
64
    """
 
65
    if browser is None:
 
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()
 
76
 
 
77
    if groups:
 
78
        browser.open('http://localhost/persons/%s' % username)
 
79
        browser.getLink('edit groups').click()
 
80
        for group in groups:
 
81
            browser.getControl(name='add_item.%s' % group).value = True
 
82
        browser.getControl('Add').click()
 
83
        browser.getControl('OK').click()
 
84
 
 
85
    fillInContactInfo(username, browser=browser,
 
86
                      email='%s@example.com' % username)
 
87
    browser.open('http://localhost/persons')
 
88
 
 
89
 
 
90
def fillInContactInfo(username, browser=None, email=None, language=None):
 
91
    if browser is None:
 
92
        browser = logInManager()
 
93
    browser.open('http://localhost/persons/%s' % username)
 
94
    # TODO: other needed fields
 
95
    contact_fields = {
 
96
        'form.widgets.email': email,
 
97
        'form.widgets.language': language,
 
98
        }
 
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()
 
105
 
 
106
 
 
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()
 
127
 
 
128
 
 
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()
 
138
 
 
139
 
 
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()
 
149
 
 
150
 
 
151
def _checkPersonsResponsible(browser, url, persons_responsible):
 
152
    browser.open(url)
 
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
 
161
 
 
162
 
 
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()
 
167
 
 
168
 
 
169
def addEditGoal(browser, url, persons_responsible, values=None):
 
170
    _checkPersonsResponsible(browser, url, persons_responsible)
 
171
    if values is None:
 
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()
 
180
 
 
181
 
 
182
class TestOnlyUpdateResponsibleView(BrowserView):
 
183
 
 
184
    def __call__(self):
 
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)
 
194
 
 
195
 
 
196
class TestOnlyUpdateRecipientsView(TestOnlyUpdateResponsibleView):
 
197
 
 
198
    def __init__(self, context, request):
 
199
        super(TestOnlyUpdateRecipientsView, self).__init__(context, request)
 
200
        self.responsible = removeSecurityProxy(self.context).recipients
 
201
 
 
202
 
 
203
class TestOnlyUpdatePersonsResponsibleView(TestOnlyUpdateResponsibleView):
 
204
 
 
205
    def __init__(self, context, request):
 
206
        super(TestOnlyUpdatePersonsResponsibleView, self).__init__(context, request)
 
207
        self.responsible = removeSecurityProxy(self.context).persons_responsible
 
208
 
 
209
 
 
210
class ActivitiesStub(object):
 
211
    def values(self):
 
212
        worksheet1 = WorksheetStub('Worksheet1', True)
 
213
        worksheet2 = WorksheetStub('Worksheet2', False)
 
214
        return [worksheet1, worksheet2]
 
215
 
 
216
 
 
217
class IWorksheetStub(Interface):
 
218
    pass
 
219
 
 
220
 
 
221
class WorksheetStub(object):
 
222
    implements(IWorksheetStub)
 
223
 
 
224
    def __init__(self, title, deployed):
 
225
        self.title = title
 
226
        self.deployed = deployed
 
227
 
 
228
 
 
229
class WorksheetAbsoluteURLStub(object):
 
230
    def __init__(self, worksheet, request):
 
231
        self.worksheet = worksheet
 
232
 
 
233
    def __call__(self):
 
234
        return self.worksheet.title
 
235
 
 
236
 
 
237
def getSectionIndependentActivities(section):
 
238
    if section.title == 'special title':
 
239
        return ActivitiesStub()
 
240
 
 
241
 
 
242
def test_suite():
 
243
    return collect_ftests(layer=intervention_functional_layer)
 
244
 
 
245
 
 
246
if __name__ == '__main__':
 
247
    unittest.main(defaultTest='test_suite')
 
248