def setUp(self): super(SignAndSendReplaceResultTest, self).setUp() self.course_key = CourseLocator(org='some_org', course='some_course', run='some_run') self.usage_key = BlockUsageLocator(course_key=self.course_key, block_type='problem', block_id='block_id') self.user = UserFactory.create() consumer = LtiConsumer(consumer_name='consumer', consumer_key='consumer_key', consumer_secret='secret') consumer.save() outcome = OutcomeService( lis_outcome_service_url='http://example.com/service_url', lti_consumer=consumer, ) outcome.save() self.assignment = GradedAssignment( user=self.user, course_key=self.course_key, usage_key=self.usage_key, outcome_service=outcome, lis_result_sourcedid='sourcedid', ) self.assignment.save()
class BaseOutcomeTest(TestCase): """ Super type for tests of both the leaf and composite outcome celery tasks. """ def setUp(self): super(BaseOutcomeTest, self).setUp() self.course_key = CourseLocator( org='some_org', course='some_course', run='some_run' ) self.usage_key = BlockUsageLocator( course_key=self.course_key, block_type='problem', block_id='block_id' ) self.user = UserFactory.create() self.consumer = LtiConsumer( consumer_name='Lti Consumer Name', consumer_key='consumer_key', consumer_secret='consumer_secret', instance_guid='tool_instance_guid' ) self.consumer.save() outcome = OutcomeService( lis_outcome_service_url='http://example.com/service_url', lti_consumer=self.consumer ) outcome.save() self.assignment = GradedAssignment( user=self.user, course_key=self.course_key, usage_key=self.usage_key, outcome_service=outcome, lis_result_sourcedid='sourcedid', version_number=1, ) self.assignment.save() self.send_score_update_mock = self.setup_patch( 'lms.djangoapps.lti_provider.outcomes.send_score_update', None ) def setup_patch(self, function_name, return_value): """ Patch a method with a given return value, and return the mock """ mock = MagicMock(return_value=return_value) new_patch = patch(function_name, new=mock) new_patch.start() self.addCleanup(new_patch.stop) return mock
def create_outcome_service(self, id_suffix): """ Create and save a new OutcomeService model in the test database. The OutcomeService model requires an LtiConsumer model, so we create one of those as well. The method takes an ID string that is used to ensure that unique fields do not conflict. """ lti_consumer = LtiConsumer( consumer_name='lti_consumer_name' + id_suffix, consumer_key='lti_consumer_key' + id_suffix, consumer_secret='lti_consumer_secret' + id_suffix, instance_guid='lti_instance_guid' + id_suffix) lti_consumer.save() outcome_service = OutcomeService( lis_outcome_service_url='https://example.com/outcomes/' + id_suffix, lti_consumer=lti_consumer) outcome_service.save() return outcome_service
def test_create_two_lti_consumers_with_empty_instance_guid(self): """ Test ability to create two or more LTI consumers through the Django admin with empty instance_guid field. A blank guid field is required when a customer enables a new secret/key combination for LTI integration with their LMS. """ lti_consumer_first = LtiConsumer( consumer_name='lti_consumer_name_second', consumer_key='lti_consumer_key_second', consumer_secret='lti_consumer_secret_second', instance_guid='') lti_consumer_first.save() lti_consumer_second = LtiConsumer( consumer_name='lti_consumer_name_third', consumer_key='lti_consumer_key_third', consumer_secret='lti_consumer_secret_third', instance_guid='') lti_consumer_second.save() count = LtiConsumer.objects.count() self.assertEqual(count, 3)
class StoreOutcomeParametersTest(TestCase): """ Tests for the store_outcome_parameters method in outcomes.py """ def setUp(self): super(StoreOutcomeParametersTest, self).setUp() self.user = UserFactory.create() self.course_key = CourseLocator(org='some_org', course='some_course', run='some_run') self.usage_key = BlockUsageLocator(course_key=self.course_key, block_type='problem', block_id='block_id') self.consumer = LtiConsumer(consumer_name='consumer', consumer_key='consumer_key', consumer_secret='secret') self.consumer.save() def get_valid_request_params(self): """ Returns a dictionary containing a complete set of required LTI parameters. """ return { 'lis_result_sourcedid': 'sourcedid', 'lis_outcome_service_url': 'http://example.com/service_url', 'oauth_consumer_key': 'consumer_key', 'tool_consumer_instance_guid': 'tool_instance_guid', 'usage_key': self.usage_key, 'course_key': self.course_key, } def test_graded_assignment_created(self): params = self.get_valid_request_params() with self.assertNumQueries(8): outcomes.store_outcome_parameters(params, self.user, self.consumer) assignment = GradedAssignment.objects.get( lis_result_sourcedid=params['lis_result_sourcedid']) self.assertEqual(assignment.course_key, self.course_key) self.assertEqual(assignment.usage_key, self.usage_key) self.assertEqual(assignment.user, self.user) def test_outcome_service_created(self): params = self.get_valid_request_params() with self.assertNumQueries(8): outcomes.store_outcome_parameters(params, self.user, self.consumer) outcome = OutcomeService.objects.get(lti_consumer=self.consumer) self.assertEqual(outcome.lti_consumer, self.consumer) def test_graded_assignment_references_outcome_service(self): params = self.get_valid_request_params() with self.assertNumQueries(8): outcomes.store_outcome_parameters(params, self.user, self.consumer) outcome = OutcomeService.objects.get(lti_consumer=self.consumer) assignment = GradedAssignment.objects.get( lis_result_sourcedid=params['lis_result_sourcedid']) self.assertEqual(assignment.outcome_service, outcome) def test_no_duplicate_graded_assignments(self): params = self.get_valid_request_params() with self.assertNumQueries(8): outcomes.store_outcome_parameters(params, self.user, self.consumer) with self.assertNumQueries(2): outcomes.store_outcome_parameters(params, self.user, self.consumer) assignments = GradedAssignment.objects.filter( lis_result_sourcedid=params['lis_result_sourcedid']) self.assertEqual(len(assignments), 1) def test_no_duplicate_outcome_services(self): params = self.get_valid_request_params() with self.assertNumQueries(8): outcomes.store_outcome_parameters(params, self.user, self.consumer) with self.assertNumQueries(2): outcomes.store_outcome_parameters(params, self.user, self.consumer) outcome_services = OutcomeService.objects.filter( lti_consumer=self.consumer) self.assertEqual(len(outcome_services), 1) def test_no_db_update_for_ungraded_assignment(self): params = self.get_valid_request_params() del params['lis_result_sourcedid'] with self.assertNumQueries(0): outcomes.store_outcome_parameters(params, self.user, self.consumer) def test_no_db_update_for_bad_request(self): params = self.get_valid_request_params() del params['lis_outcome_service_url'] with self.assertNumQueries(0): outcomes.store_outcome_parameters(params, self.user, self.consumer) def test_db_record_created_without_consumer_id(self): params = self.get_valid_request_params() del params['tool_consumer_instance_guid'] with self.assertNumQueries(8): outcomes.store_outcome_parameters(params, self.user, self.consumer) self.assertEqual(GradedAssignment.objects.count(), 1) self.assertEqual(OutcomeService.objects.count(), 1)