@@ -146,29 +146,40 @@ def test_role(self):
146146 """
147147 fake_user = Mock ()
148148 fake_user .opt_attrs = {
149- 'edx-platform.user_role' : 'student'
149+ 'edx-platform.user_role' : 'student' ,
150+ 'edx-platform.is_authenticated' : True ,
150151 }
151152 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
152153 self .assertEqual (self .xblock .role , 'Student,Learner' )
153154
154155 fake_user .opt_attrs = {
155- 'edx-platform.user_role' : 'guest'
156+ 'edx-platform.user_role' : 'guest' ,
157+ 'edx-platform.is_authenticated' : True ,
156158 }
157159 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
158160 self .assertEqual (self .xblock .role , 'Student,Learner' )
159161
160162 fake_user .opt_attrs = {
161- 'edx-platform.user_role' : 'staff'
163+ 'edx-platform.user_role' : 'staff' ,
164+ 'edx-platform.is_authenticated' : True ,
162165 }
163166 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
164167 self .assertEqual (self .xblock .role , 'Administrator' )
165168
166169 fake_user .opt_attrs = {
167- 'edx-platform.user_role' : 'instructor'
170+ 'edx-platform.user_role' : 'instructor' ,
171+ 'edx-platform.is_authenticated' : True ,
168172 }
169173 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
170174 self .assertEqual (self .xblock .role , 'Instructor' )
171175
176+ fake_user .opt_attrs = {
177+ 'edx-platform.user_role' : 'student' ,
178+ 'edx-platform.is_authenticated' : False ,
179+ }
180+ with self .assertRaises (LtiError ):
181+ _ = self .xblock .role
182+
172183 def test_course (self ):
173184 """
174185 Test `course` calls modulestore.get_course
@@ -593,7 +604,8 @@ def test_get_real_user_callable(self):
593604 fake_user .emails = [fake_user_email ]
594605 fake_username = 'fake'
595606 fake_user .opt_attrs = {
596- "edx-platform.username" : fake_username
607+ "edx-platform.username" : fake_username ,
608+ "edx-platform.is_authenticated" : True ,
597609 }
598610
599611 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
@@ -616,14 +628,29 @@ def test_get_real_user_callable_with_language_preference(self):
616628 fake_user .opt_attrs = {
617629 "edx-platform.user_preferences" : {
618630 "pref-lang" : "en"
619- }
631+ },
632+ "edx-platform.is_authenticated" : True ,
620633 }
621634
622635 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
623636
624637 real_user_data = self .xblock .extract_real_user_data ()
625638 self .assertEqual (real_user_data ['user_language' ], pref_language )
626639
640+ def test_unauthenticated_user (self ):
641+ """
642+ Test that an LtiError is raised when the user is unauthenticated.
643+ """
644+ fake_user = Mock ()
645+ fake_user .opt_attrs = {
646+ "edx-platform.is_authenticated" : False ,
647+ }
648+
649+ self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
650+
651+ with self .assertRaises (LtiError ):
652+ self .xblock .extract_real_user_data ()
653+
627654
628655class TestStudentView (TestLtiConsumerXBlock ):
629656 """
@@ -734,7 +761,8 @@ def setUp(self):
734761 fake_user .emails = [fake_user_email ]
735762 fake_username = 'fake'
736763 fake_user .opt_attrs = {
737- "edx-platform.username" : fake_username
764+ "edx-platform.username" : fake_username ,
765+ "edx-platform.is_authenticated" : True ,
738766 }
739767
740768 self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
@@ -757,6 +785,36 @@ def test_generate_launch_request_called(self, mock_course):
757785 self .assertEqual (response .status_code , 200 )
758786 self .assertEqual (response .content_type , 'text/html' )
759787
788+ @patch ('lti_consumer.lti_xblock.LtiConsumerXBlock.course' )
789+ def test_lti_launch_handler_unauthenticated (self , mock_course ):
790+ """
791+ Test that a 400 response an an appropriate template is rendered when a user is unauthenticated
792+ during an LTI launch according to the LMS's user service.
793+ """
794+ provider = 'lti_provider'
795+ key = 'test'
796+ secret = 'secret'
797+ type(mock_course ).lti_passports = PropertyMock (return_value = [f"{ provider } :{ key } :{ secret } " ])
798+
799+ fake_user = Mock ()
800+ fake_user_email = 'abc@example.com'
801+ fake_user .emails = [fake_user_email ]
802+ fake_username = 'fake'
803+ fake_user .opt_attrs = {
804+ "edx-platform.username" : fake_username ,
805+ "edx-platform.is_authenticated" : True ,
806+ }
807+ self .xblock .runtime .service (self , 'user' ).get_current_user = Mock (return_value = fake_user )
808+
809+ request = make_request ('' , 'GET' )
810+ response = self .xblock .lti_launch_handler (request )
811+
812+ self .assertEqual (response .status_code , 400 )
813+ self .assertEqual (response .content_type , 'text/html' )
814+
815+ response_body = response .body .decode ('utf-8' )
816+ self .assertIn ("There was an error while launching the LTI tool." , response_body )
817+
760818 @patch ('lti_consumer.lti_xblock.LtiConsumerXBlock.course' )
761819 @patch ('lti_consumer.lti_xblock.LtiConsumerXBlock.user_id' , PropertyMock (return_value = FAKE_USER_ID ))
762820 def test_publish_tracking_event (self , mock_course ):
0 commit comments