# Tests for webservices
import xmlrpclib
import os
from cStringIO import StringIO
from zope.app.testing.xmlrpc import ServerProxy
from zope.component import getUtility
from waeup.kofa.interfaces import IExtFileStore, IFileStoreNameChooser
from waeup.kofa.testing import FunctionalLayer
from waeup.kofa.students.payments import StudentOnlinePayment
from waeup.kofa.students.tests.test_browser import StudentsFullSetup
from waeup.kofa.students.studylevel import StudentStudyLevel, CourseTicket
class XMLRPCTests(StudentsFullSetup):
# check XMLRPC services for university portal
layer = FunctionalLayer
def setup_student(self, student):
study_level = StudentStudyLevel()
study_level.level_session = 2012
study_level.level_verdict = "A"
study_level.level = 100
study_level.validated_by = u"my adviser"
student['studycourse'].addStudentStudyLevel(
self.certificate, study_level)
ticket = CourseTicket()
ticket.automatic = True
ticket.carry_over = True
ticket.code = u'CRS1'
ticket.title = u'Course 1'
ticket.fcode = u'FAC1'
ticket.dcode = u'DEP1'
ticket.credits = 100
ticket.passmark = 100
ticket.semester = 2
study_level[ticket.code] = ticket
def create_passport_img(self, student):
# create some passport file for `student`
storage = getUtility(IExtFileStore)
image_path = os.path.join(os.path.dirname(__file__), 'test_image.jpg')
self.image_contents = open(image_path, 'rb').read()
file_id = IFileStoreNameChooser(student).chooseName(
attr='passport.jpg')
storage.createFile(file_id, StringIO(self.image_contents))
def XMLRPC_post(self, body):
self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
self.browser.addHeader('Content-Length', len(body))
self.browser.post('http://localhost/app', body,
'text/xml; charset=utf-8')
return self.browser.contents
def test_get_student_id_no_match(self):
# w/o any students we get none
server = ServerProxy('http://mgr:mgrpw@localhost/app')
result = server.get_student_id('Nonsense')
self.assertTrue(result is None)
return
def test_get_student_id_regno_exists(self):
# we can get the id of an existing student with matching reg_no
server = ServerProxy('http://mgr:mgrpw@localhost/app')
result = server.get_student_id('123')
self.assertEqual(result, 'K1000000')
self.assertEqual(self.student_id, result)
REQUEST_XML = """\
get_student_id
123
"""
RESPONSE_XML = """\
K1000000
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertEqual(xmlout, RESPONSE_XML)
return
def test_get_student_id_block_unauthorized(self):
# requests from unauthorized users are blocked
# no username nor password
server = ServerProxy('http://localhost/app')
self.assertRaises(
xmlrpclib.ProtocolError, server.get_student_id, '123')
# wrong password
server = ServerProxy('http://mgr:WRONGPW@localhost/app')
self.assertRaises(
xmlrpclib.ProtocolError, server.get_student_id, '123')
# wrong username
server = ServerProxy('http://WRONGUSER:mgrpw@localhost/app')
self.assertRaises(
xmlrpclib.ProtocolError, server.get_student_id, '123')
return
def test_get_courses_by_session(self):
server = ServerProxy('http://mgr:mgrpw@localhost/app')
result = server.get_courses_by_session('K1000000')
self.assertEqual(result, None)
self.setup_student(self.student)
result = server.get_courses_by_session('K1000000', '2010')
self.assertEqual(result, None)
result = server.get_courses_by_session('K1000000', '2012')
self.assertEqual(result,
{'100|CRS1': 'Course 1', '100|COURSE1': 'Unnamed Course'})
result = server.get_courses_by_session('K1000000')
self.assertEqual(result,
{'100|CRS1': 'Course 1', '100|COURSE1': 'Unnamed Course'})
# Also matric_number ...
result = server.get_courses_by_session('234')
self.assertEqual(result,
{'100|CRS1': 'Course 1', '100|COURSE1': 'Unnamed Course'})
# ... or reg_number can be used.
result = server.get_courses_by_session('123')
self.assertEqual(result,
{'100|CRS1': 'Course 1', '100|COURSE1': 'Unnamed Course'})
result = server.get_courses_by_session('Nonsense')
self.assertEqual(result, None)
REQUEST_XML = """\
get_courses_by_session
K1000000
"""
RESPONSE_XML = """\
100|CRS1
Course 1
100|COURSE1
Unnamed Course
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertEqual(xmlout, RESPONSE_XML)
return
def test_get_students_by_course(self):
self.setup_student(self.student)
server = ServerProxy('http://mgr:mgrpw@localhost/app')
result = server.get_students_by_course('CRS1', '2010')
self.assertEqual(result, None)
result = server.get_students_by_course('CRS1', '2012')
self.assertEqual(result, [['K1000000', '234', 'my adviser', 0], ])
result = server.get_students_by_course('CRS1')
self.assertEqual(result, [['K1000000', '234', 'my adviser', 0], ])
payment = StudentOnlinePayment()
payment.p_id = 'my-id'
payment.p_session = 2012
payment.amount_auth = 12.12
payment.p_state = u'paid'
payment.p_category = u'schoolfee'
self.student['payments']['my-payment'] = payment
result = server.get_students_by_course('CRS1')
self.assertEqual(result, [['K1000000', '234', 'my adviser', 12.12], ])
REQUEST_XML = """\
get_students_by_course
CRS1
2012
"""
RESPONSE_XML = """\
K1000000
234
my adviser
12.12
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertEqual(xmlout, RESPONSE_XML)
return
def test_get_student_info(self):
server = ServerProxy('http://mgr:mgrpw@localhost/app')
self.setup_student(self.student)
result = server.get_student_info('123')
self.assertEqual(result,
['Anna Tester', 'CERT1', '1234', 'aa@aa.ng'])
REQUEST_XML = """\
get_student_info
K1000000
"""
RESPONSE_XML = """\
Anna Tester
CERT1
1234
aa@aa.ng
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertEqual(xmlout, RESPONSE_XML)
return
def test_get_student_passport(self):
server = ServerProxy('http://mgr:mgrpw@localhost/app')
self.setup_student(self.student)
self.create_passport_img(self.student)
result = server.get_student_passport('123')
img = getUtility(IExtFileStore).getFileByContext(
self.student, attr='passport.jpg')
binary = img.read()
self.assertEqual(binary, result)
REQUEST_XML = """\
get_student_passport
K1000000
"""
RESPONSE_XML = """\
/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertTrue(xmlout.startswith(RESPONSE_XML))
def test_get_paid_sessions(self):
server = ServerProxy('http://mgr:mgrpw@localhost/app')
self.setup_student(self.student)
payment = StudentOnlinePayment()
payment.p_id = 'my-id'
payment.p_session = 2009
payment.amount_auth = 12.12
payment.p_state = u'paid'
payment.p_category = u'schoolfee'
self.student['payments']['my-payment'] = payment
result = server.get_paid_sessions('123')
self.assertEqual(result, {'2009': 12.12})
REQUEST_XML = """\
get_paid_sessions
K1000000
"""
RESPONSE_XML = """\
2009
12.12
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertEqual(xmlout, RESPONSE_XML)
return
def test_check_student_credentials(self):
# make sure we can get student infos providing valid creds
server = ServerProxy('http://mgr:mgrpw@localhost/app')
self.setup_student(self.student)
stud_id = self.student.student_id
result = server.check_student_credentials(stud_id, 'spwd')
self.assertEqual(
result, {
'description': 'Anna Tester',
'email': 'aa@aa.ng',
'id': 'K1000000',
'type': 'student'}
)
return
def test_get_student_moodle_data(self):
server = ServerProxy('http://mgr:mgrpw@localhost/app')
self.setup_student(self.student)
result = server.get_student_moodle_data(self.student.student_id)
self.assertEqual(result,
{'lastname': 'Tester', 'email': 'aa@aa.ng', 'firstname': 'Anna'})
REQUEST_XML = """\
get_student_moodle_data
K1000000
"""
RESPONSE_XML = """\
lastname
Tester
email
aa@aa.ng
firstname
Anna
"""
xmlout = self.XMLRPC_post(REQUEST_XML)
self.assertEqual(xmlout, RESPONSE_XML)
return