1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
from lti.outcome_request import REPLACE_REQUEST
from lti import OutcomeRequest, OutcomeResponse, InvalidLTIConfigError
import unittest
from oauthlib.common import unquote
from httmock import all_requests, HTTMock
from django.conf import settings
from django.test import RequestFactory
settings.configure()
EXPECTED_XML = b'''<?xml version="1.0" encoding="UTF-8"?>
<imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0">
<imsx_POXHeader>
<imsx_POXRequestHeaderInfo>
<imsx_version>V1.0</imsx_version>
<imsx_messageIdentifier>123456789</imsx_messageIdentifier>
</imsx_POXRequestHeaderInfo>
</imsx_POXHeader>
<imsx_POXBody>
%s
</imsx_POXBody>
</imsx_POXEnvelopeRequest>
'''
REPLACE_RESULT_XML = EXPECTED_XML[:] % b'''
<replaceResultRequest>
<resultRecord>
<sourcedGUID>
<sourcedId>261-154-728-17-784</sourcedId>
</sourcedGUID>
<result>
<resultScore>
<language>en</language>
<textString>5</textString>
</resultScore>
</result>
</resultRecord>
</replaceResultRequest>
'''
READ_RESULT_XML = EXPECTED_XML[:] % b'''
<readResultRequest>
<resultRecord>
<sourcedGUID>
<sourcedId>261-154-728-17-784</sourcedId>
</sourcedGUID>
</resultRecord>
</readResultRequest>
'''
DELETE_RESULT_XML = EXPECTED_XML[:] % b'''
<deleteResultRequest>
<resultRecord>
<sourcedGUID>
<sourcedId>261-154-728-17-784</sourcedId>
</sourcedGUID>
</resultRecord>
</deleteResultRequest>
'''
@all_requests
def response_content(url, request):
return {'status_code': 200,
'content': 'Oh hai'}
class TestOutcomeRequest(unittest.TestCase):
def test_parse_replace_result_xml(self):
'''
Should parse replaceResult XML.
'''
request = OutcomeRequest()
request.process_xml(REPLACE_RESULT_XML)
self.assertEqual(request.operation, 'replaceResult')
self.assertEqual(request.lis_result_sourcedid, '261-154-728-17-784')
self.assertEqual(request.message_identifier, '123456789')
self.assertEqual(request.score, '5')
def test_parse_read_result_xml(self):
'''
Should parse readResult XML.
'''
request = OutcomeRequest()
request.process_xml(READ_RESULT_XML)
self.assertEqual(request.operation, 'readResult')
self.assertEqual(request.lis_result_sourcedid, '261-154-728-17-784')
self.assertEqual(request.message_identifier, '123456789')
self.assertEqual(request.score, None)
def test_parse_delete_result_xml(self):
'''
Should parse deleteRequest XML.
'''
request = OutcomeRequest()
request.process_xml(DELETE_RESULT_XML)
self.assertEqual(request.operation, 'deleteResult')
self.assertEqual(request.lis_result_sourcedid, '261-154-728-17-784')
self.assertEqual(request.message_identifier, '123456789')
self.assertEqual(request.score, None)
def test_has_required_attributes(self):
request = OutcomeRequest()
self.assertFalse(request.has_required_attributes())
request.consumer_key = 'foo'
request.consumer_secret = 'bar'
self.assertFalse(request.has_required_attributes())
request.lis_outcome_service_url = 'http://example.edu/'
request.lis_result_sourcedid = 1
request.operation = 'baz'
self.assertTrue(request.has_required_attributes())
def test_post_outcome_request(self):
request = OutcomeRequest()
self.assertRaises(InvalidLTIConfigError, request.post_outcome_request)
request.consumer_key = 'consumer'
request.consumer_secret = 'secret'
request.lis_outcome_service_url = 'http://example.edu/'
request.lis_result_sourcedid = 'foo'
request.operation = REPLACE_REQUEST
with HTTMock(response_content):
resp = request.post_outcome_request(
nonce='my_nonce',
timestamp='1234567890'
)
self.assertIsInstance(resp, OutcomeResponse)
request = resp.post_response.request
self.assertTrue('authorization' in request.headers)
auth_header = unquote(request.headers['authorization'].decode('utf-8'))
correct = ('OAuth '
'oauth_nonce="my_nonce", oauth_timestamp="1234567890", '
'oauth_version="1.0", oauth_signature_method="HMAC-SHA1", '
'oauth_consumer_key="consumer", '
'oauth_body_hash="glWvnsZZ8lMif1ATz8Tx64CTTaY=", '
'oauth_signature="XR6A1CmUauXZdJZXa1pJpTQi6OQ="')
self.assertEqual(auth_header, correct)
def test_from_post_request(self):
factory = RequestFactory()
post_request = factory.post('/',
data=REPLACE_RESULT_XML,
content_type='application/xml'
)
request = OutcomeRequest.from_post_request(post_request)
self.assertEqual(request.operation, 'replaceResult')
self.assertEqual(request.lis_result_sourcedid, '261-154-728-17-784')
self.assertEqual(request.message_identifier, '123456789')
self.assertEqual(request.score, '5')
|