55import textwrap
66import unittest
77from copy import copy
8-
98from unittest .mock import Mock , PropertyMock , patch
109
10+ import ddt
11+
1112from lti_consumer .exceptions import LtiError
1213from lti_consumer .outcomes import OutcomeService , parse_grade_xml_body
13- from lti_consumer .tests .unit .test_lti_xblock import TestLtiConsumerXBlock
1414from lti_consumer .tests .test_utils import make_request
15+ from lti_consumer .tests .unit .test_lti_xblock import TestLtiConsumerXBlock
1516
1617REQUEST_BODY_TEMPLATE_VALID = textwrap .dedent ("""
1718 <?xml version="1.0" encoding="UTF-8"?>
@@ -326,14 +327,25 @@ def test_string_with_unicode_chars(self):
326327 self .assertEqual (action , 'ţéšţ_action' )
327328
328329
330+ @ddt .ddt
329331class TestOutcomeService (TestLtiConsumerXBlock ):
330332 """
331333 Unit tests for OutcomeService
332334 """
333335
334336 def setUp (self ):
335337 super ().setUp ()
336- self .outcome_servce = OutcomeService (self .xblock )
338+ self .outcome_service = OutcomeService (self .xblock )
339+
340+ # Set up user mock for LtiConsumerXBlock.get_lti_1p1_user_from_user_id method.
341+ self .mock_get_user_id_patcher = patch ('lti_consumer.lti_xblock.LtiConsumerXBlock.get_lti_1p1_user_from_user_id' )
342+ self .addCleanup (self .mock_get_user_id_patcher .stop )
343+ self .mock_get_user_id_patcher_enabled = self .mock_get_user_id_patcher .start ()
344+
345+ mock_user = Mock ()
346+ mock_id = PropertyMock (return_value = 1 )
347+ type(mock_user ).id = mock_id
348+ self .mock_get_user_id_patcher_enabled .return_value = mock_user
337349
338350 @patch ('lti_consumer.outcomes.verify_oauth_body_signature' , Mock (return_value = True ))
339351 @patch ('lti_consumer.lti_xblock.LtiConsumerXBlock.lti_provider_key_secret' , PropertyMock (return_value = ('t' , 's' )))
@@ -343,6 +355,7 @@ def test_handle_replace_result_success(self):
343355 Test replace result request returns with success indicator
344356 """
345357 request = make_request ('' )
358+
346359 values = {
347360 'code' : 'success' ,
348361 'description' : 'Score for is now 0.5' ,
@@ -351,7 +364,7 @@ def test_handle_replace_result_success(self):
351364 }
352365
353366 self .assertEqual (
354- self .outcome_servce .handle_request (request ).strip (),
367+ self .outcome_service .handle_request (request ).strip (),
355368 RESPONSE_BODY_TEMPLATE .format (** values ).strip ()
356369 )
357370
@@ -362,7 +375,7 @@ def test_grade_past_due(self):
362375 """
363376 request = make_request ('' )
364377 self .xblock .accept_grades_past_due = False
365- response = self .outcome_servce .handle_request (request )
378+ response = self .outcome_service .handle_request (request )
366379
367380 self .assertIn ('failure' , response )
368381 self .assertIn ('Grade is past due' , response )
@@ -376,7 +389,7 @@ def test_lti_error_not_raises_type_error(self, mock_parse):
376389 request = make_request ('test_string' )
377390
378391 mock_parse .side_effect = LtiError
379- response = self .outcome_servce .handle_request (request )
392+ response = self .outcome_service .handle_request (request )
380393 self .assertNotIn ('TypeError' , response )
381394 self .assertNotIn ('a bytes-like object is required' , response )
382395 self .assertIn ('Request body XML parsing error' , response )
@@ -389,7 +402,7 @@ def test_xml_parse_lti_error(self, mock_parse):
389402 request = make_request ('' )
390403
391404 mock_parse .side_effect = LtiError
392- response = self .outcome_servce .handle_request (request )
405+ response = self .outcome_service .handle_request (request )
393406 self .assertIn ('failure' , response )
394407 self .assertIn ('Request body XML parsing error' , response )
395408
@@ -403,10 +416,10 @@ def test_invalid_signature(self, mock_verify):
403416 request = make_request ('' )
404417
405418 mock_verify .side_effect = ValueError
406- self .assertIn ('failure' , self .outcome_servce .handle_request (request ))
419+ self .assertIn ('failure' , self .outcome_service .handle_request (request ))
407420
408421 mock_verify .side_effect = LtiError
409- self .assertIn ('failure' , self .outcome_servce .handle_request (request ))
422+ self .assertIn ('failure' , self .outcome_service .handle_request (request ))
410423
411424 @patch ('lti_consumer.outcomes.verify_oauth_body_signature' , Mock (return_value = True ))
412425 @patch ('lti_consumer.lti_xblock.LtiConsumerXBlock.lti_provider_key_secret' , PropertyMock (return_value = ('t' , 's' )))
@@ -416,12 +429,9 @@ def test_user_not_found(self):
416429 Test user not found returns failure response
417430 """
418431 request = make_request ('' )
419- self .xblock .runtime .service = Mock (
420- return_value = Mock (
421- get_user_by_anonymous_id = Mock (return_value = None )
422- )
423- )
424- response = self .outcome_servce .handle_request (request )
432+
433+ self .mock_get_user_id_patcher_enabled .return_value = None
434+ response = self .outcome_service .handle_request (request )
425435
426436 self .assertIn ('failure' , response )
427437 self .assertIn ('User not found' , response )
@@ -434,7 +444,7 @@ def test_unsupported_action(self):
434444 Test unsupported action returns unsupported response
435445 """
436446 request = make_request ('' )
437- response = self .outcome_servce .handle_request (request )
447+ response = self .outcome_service .handle_request (request )
438448
439449 self .assertIn ('unsupported' , response )
440450 self .assertIn ('Target does not support the requested operation.' , response )
0 commit comments