Skip to content

Commit e99ce81

Browse files
authored
Merge pull request #22 from ubc/fix-old-lti-module-compat
Add a compatibility function for get_course_lti_endpoints
2 parents 2c53cb6 + 43ee768 commit e99ce81

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

lti_consumer/lti_consumer.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,20 @@ def outcome_service_url(self):
562562
"""
563563
return self.runtime.handler_url(self, "outcome_service_handler", thirdparty=True).rstrip('/?')
564564

565+
@property
566+
def result_service_url(self):
567+
"""
568+
Return URL for results.
569+
570+
To test LTI on sandbox we must use http scheme.
571+
572+
While testing locally and on Jenkins, mock_lti_server use http.referer
573+
to obtain scheme, so it is ok to have http(s) anyway.
574+
575+
The scheme logic is handled in lms/lib/xblock/runtime.py
576+
"""
577+
return self.runtime.handler_url(self, "result_service_handler", thirdparty=True).rstrip('/?')
578+
565579
@property
566580
def prefixed_custom_parameters(self):
567581
"""
@@ -860,3 +874,17 @@ def _get_modal_position_offset(self, viewport_percentage):
860874
float: The css position offset to apply to the modal window
861875
"""
862876
return (100 - viewport_percentage) / 2
877+
878+
def get_outcome_service_url(self, service_name="grade_handler"):
879+
"""
880+
This function is called by get_course_lti_endpoints when using LTI result service to
881+
discover the LTI result endpoints.
882+
"""
883+
884+
# using string as mapped value instead of attributes to avoid unnecessary calls as both urls
885+
# are @property.
886+
mapping = {
887+
'grade_handler': 'outcome_service_url',
888+
'lti_2_0_result_rest_handler': 'result_service_url'
889+
}
890+
return getattr(self, mapping[service_name])

lti_consumer/tests/unit/test_lti_consumer.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,17 @@ def test_outcome_service_url(self):
185185
self.xblock.runtime.handler_url.assert_called_with(self.xblock, 'outcome_service_handler', thirdparty=True)
186186
self.assertEqual(url, handler_url)
187187

188+
def test_result_service_url(self):
189+
"""
190+
Test `result_service_url` calls `runtime.handler_url` with thirdparty kwarg
191+
"""
192+
handler_url = 'http://localhost:8005/result_service_handler'
193+
self.xblock.runtime.handler_url = Mock(return_value="{}/?".format(handler_url))
194+
url = self.xblock.result_service_url
195+
196+
self.xblock.runtime.handler_url.assert_called_with(self.xblock, 'result_service_handler', thirdparty=True)
197+
self.assertEqual(url, handler_url)
198+
188199
def test_prefixed_custom_parameters(self):
189200
"""
190201
Test `prefixed_custom_parameters` appropriately prefixes the configured custom params
@@ -528,6 +539,39 @@ def test_delete_result_called(self, mock_parse_suffix, mock_delete_result):
528539
assert mock_delete_result.called
529540
self.assertEqual(response.status_code, 200)
530541

542+
def test_get_outcome_service_url_with_default_parameter(self):
543+
"""
544+
Test `get_outcome_service_url` with default parameter
545+
"""
546+
handler_url = 'http://localhost:8005/outcome_service_handler'
547+
self.xblock.runtime.handler_url = Mock(return_value="{}/?".format(handler_url))
548+
url = self.xblock.get_outcome_service_url()
549+
550+
self.xblock.runtime.handler_url.assert_called_with(self.xblock, 'outcome_service_handler', thirdparty=True)
551+
self.assertEqual(url, handler_url)
552+
553+
def test_get_outcome_service_url_with_service_name_grade_handler(self):
554+
"""
555+
Test `get_outcome_service_url` calls service name grade_handler
556+
"""
557+
handler_url = 'http://localhost:8005/outcome_service_handler'
558+
self.xblock.runtime.handler_url = Mock(return_value="{}/?".format(handler_url))
559+
url = self.xblock.get_outcome_service_url('grade_handler')
560+
561+
self.xblock.runtime.handler_url.assert_called_with(self.xblock, 'outcome_service_handler', thirdparty=True)
562+
self.assertEqual(url, handler_url)
563+
564+
def test_get_outcome_service_url_with_service_name_lti_2_0_result_rest_handler(self):
565+
"""
566+
Test `get_outcome_service_url` calls with service name lti_2_0_result_rest_handler
567+
"""
568+
handler_url = 'http://localhost:8005/result_service_handler'
569+
self.xblock.runtime.handler_url = Mock(return_value="{}/?".format(handler_url))
570+
url = self.xblock.get_outcome_service_url('lti_2_0_result_rest_handler')
571+
572+
self.xblock.runtime.handler_url.assert_called_with(self.xblock, 'result_service_handler', thirdparty=True)
573+
self.assertEqual(url, handler_url)
574+
531575

532576
class TestMaxScore(TestLtiConsumerXBlock):
533577
"""

0 commit comments

Comments
 (0)