22Tests for the LTI user management functionality
33"""
44
5-
5+ import itertools
66import string
77from unittest .mock import MagicMock , PropertyMock , patch
88
9+ import ddt
910import pytest
1011from django .contrib .auth .models import AnonymousUser , User # lint-amnesty, pylint: disable=imported-auth-user
1112from django .core .exceptions import PermissionDenied
@@ -73,6 +74,7 @@ def test_random_username_generator(self):
7374 f"Username has forbidden character '{ username [char ]} '"
7475
7576
77+ @ddt .ddt
7678@patch ('lms.djangoapps.lti_provider.users.switch_user' , autospec = True )
7779@patch ('lms.djangoapps.lti_provider.users.create_lti_user' , autospec = True )
7880class AuthenticateLtiUserTest (TestCase ):
@@ -156,7 +158,10 @@ def test_auto_linking_of_users_using_lis_person_contact_email_primary(self, crea
156158 create_user .assert_called_with (self .lti_user_id , self .lti_consumer )
157159
158160 users .authenticate_lti_user (request , self .lti_user_id , self .auto_linking_consumer )
159- create_user .assert_called_with (self .lti_user_id , self .auto_linking_consumer , self .old_user .email )
161+ create_user .assert_called_with (self .lti_user_id , self .auto_linking_consumer , {
162+ "email" : self .old_user .email ,
163+ "full_name" : "" ,
164+ })
160165
161166 def test_auto_linking_of_users_using_lis_person_contact_email_primary_case_insensitive (self , create_user , switch_user ): # pylint: disable=line-too-long
162167 request = RequestFactory ().post ("/" , {"lis_person_contact_email_primary" : self .old_user .email .upper ()})
@@ -166,7 +171,10 @@ def test_auto_linking_of_users_using_lis_person_contact_email_primary_case_insen
166171 create_user .assert_called_with (self .lti_user_id , self .lti_consumer )
167172
168173 users .authenticate_lti_user (request , self .lti_user_id , self .auto_linking_consumer )
169- create_user .assert_called_with (self .lti_user_id , self .auto_linking_consumer , request .user .email )
174+ create_user .assert_called_with (self .lti_user_id , self .auto_linking_consumer , {
175+ "email" : self .old_user .email ,
176+ "full_name" : "" ,
177+ })
170178
171179 def test_raise_exception_trying_to_auto_link_unauthenticate_user (self , create_user , switch_user ):
172180 request = RequestFactory ().post ("/" )
@@ -190,7 +198,57 @@ def test_authenticate_unauthenticated_user_after_auto_linking_of_user_account(se
190198 assert not create_user .called
191199 switch_user .assert_called_with (self .request , lti_user , self .auto_linking_consumer )
192200
201+ @ddt .data (
202+ * itertools .product (
203+ (
204+ (
205+ {
206+ "lis_person_contact_email_primary" : "some_email@example.com" ,
207+ "lis_person_name_given" : "John" ,
208+ "lis_person_name_family" : "Doe" ,
209+ },
210+ "some_email@example.com" ,
211+ "John Doe" ,
212+ ),
213+ (
214+ {
215+ "lis_person_contact_email_primary" : "some_email@example.com" ,
216+ "lis_person_name_full" : "John Doe" ,
217+ "lis_person_name_given" : "Jacob" ,
218+ },
219+ "some_email@example.com" ,
220+ "John Doe" ,
221+ ),
222+ (
223+ {"lis_person_contact_email_primary" : "some_email@example.com" , "lis_person_name_full" : "John Doe" },
224+ "some_email@example.com" ,
225+ "John Doe" ,
226+ ),
227+ ({"lis_person_contact_email_primary" : "some_email@example.com" }, "some_email@example.com" , "" ),
228+ ({"lis_person_contact_email_primary" : "" }, "" , "" ),
229+ ({"lis_person_contact_email_primary" : "" }, "" , "" ),
230+ ({}, "" , "" ),
231+ ),
232+ [True , False ],
233+ )
234+ )
235+ @ddt .unpack
236+ def test_create_user_when_user_account_not_required (self , params , enable_lti_pii , create_user , switch_user ):
237+ post_params , email , name = params
238+ self .auto_linking_consumer .require_user_account = False
239+ self .auto_linking_consumer .use_lti_pii = enable_lti_pii
240+ self .auto_linking_consumer .save ()
241+ request = RequestFactory ().post ("/" , post_params )
242+ request .user = AnonymousUser ()
243+ users .authenticate_lti_user (request , self .lti_user_id , self .auto_linking_consumer )
244+ if enable_lti_pii :
245+ profile = {"email" : email , "full_name" : name , "username" : self .lti_user_id }
246+ create_user .assert_called_with (self .lti_user_id , self .auto_linking_consumer , profile )
247+ else :
248+ create_user .assert_called_with (self .lti_user_id , self .auto_linking_consumer )
249+
193250
251+ @ddt .ddt
194252class CreateLtiUserTest (TestCase ):
195253 """
196254 Tests for the create_lti_user function in users.py
@@ -222,22 +280,22 @@ def test_create_lti_user_creates_correct_user(self, uuid_mock, _username_mock):
222280 @patch ('lms.djangoapps.lti_provider.users.generate_random_edx_username' , side_effect = ['edx_id' , 'new_edx_id' ])
223281 def test_unique_username_created (self , username_mock ):
224282 User (username = 'edx_id' ).save ()
225- users .create_lti_user ('lti_user_id' , self .lti_consumer )
283+ users .create_lti_user ('lti_user_id' , self .lti_consumer , None )
226284 assert username_mock .call_count == 2
227285 assert User .objects .count () == 3
228286 user = User .objects .get (username = 'new_edx_id' )
229287 assert user .email == 'new_edx_id@lti.example.com'
230288
231289 def test_existing_user_is_linked (self ):
232- lti_user = users .create_lti_user ('lti_user_id' , self .lti_consumer , self .existing_user .email )
290+ lti_user = users .create_lti_user ('lti_user_id' , self .lti_consumer , { "email" : self .existing_user .email } )
233291 assert lti_user .lti_consumer == self .lti_consumer
234292 assert lti_user .edx_user == self .existing_user
235293
236294 def test_only_one_lti_user_edx_user_for_each_lti_consumer (self ):
237- users .create_lti_user ('lti_user_id' , self .lti_consumer , self .existing_user .email )
295+ users .create_lti_user ('lti_user_id' , self .lti_consumer , { "email" : self .existing_user .email } )
238296
239297 with pytest .raises (IntegrityError ):
240- users .create_lti_user ('lti_user_id' , self .lti_consumer , self .existing_user .email )
298+ users .create_lti_user ('lti_user_id' , self .lti_consumer , { "email" : self .existing_user .email } )
241299
242300 def test_create_multiple_lti_users_for_edx_user_if_lti_consumer_varies (self ):
243301 lti_consumer_2 = LtiConsumer (
@@ -247,11 +305,42 @@ def test_create_multiple_lti_users_for_edx_user_if_lti_consumer_varies(self):
247305 )
248306 lti_consumer_2 .save ()
249307
250- lti_user_1 = users .create_lti_user ('lti_user_id' , self .lti_consumer , self .existing_user .email )
251- lti_user_2 = users .create_lti_user ('lti_user_id' , lti_consumer_2 , self .existing_user .email )
308+ lti_user_1 = users .create_lti_user ('lti_user_id' , self .lti_consumer , { "email" : self .existing_user .email } )
309+ lti_user_2 = users .create_lti_user ('lti_user_id' , lti_consumer_2 , { "email" : self .existing_user .email } )
252310
253311 assert lti_user_1 .edx_user == lti_user_2 .edx_user
254312
313+ def test_create_lti_user_with_full_profile (self ):
314+ lti_user = users .create_lti_user ('lti_user_id' , self .lti_consumer , {
315+ "email" : "some.user@example.com" ,
316+ "full_name" : "John Doe" ,
317+ "username" : "john_doe" ,
318+ })
319+ assert lti_user .edx_user .email == "some.user@example.com"
320+ assert lti_user .edx_user .username == "john_doe"
321+ assert lti_user .edx_user .profile .name == "John Doe"
322+
323+ @patch ('lms.djangoapps.lti_provider.users.generate_random_edx_username' , side_effect = ['edx_id' ])
324+ def test_create_lti_user_with_missing_username_in_profile (self , mock ):
325+ lti_user = users .create_lti_user ('lti_user_id' , self .lti_consumer , {
326+ "email" : "some.user@example.com" ,
327+ "full_name" : "John Doe" ,
328+ })
329+ assert lti_user .edx_user .email == "some.user@example.com"
330+ assert lti_user .edx_user .username == "edx_id"
331+ assert lti_user .edx_user .profile .name == "John Doe"
332+
333+ @patch ('lms.djangoapps.lti_provider.users.generate_random_edx_username' , side_effect = ['edx_id' , 'edx_id123' ])
334+ def test_create_lti_user_with_duplicate_username_in_profile (self , mock ):
335+ lti_user = users .create_lti_user ('lti_user_id' , self .lti_consumer , {
336+ "email" : "some.user@example.com" ,
337+ "full_name" : "John Doe" ,
338+ "username" : self .existing_user .username ,
339+ })
340+ assert lti_user .edx_user .email == "some.user@example.com"
341+ assert lti_user .edx_user .username == "edx_id"
342+ assert lti_user .edx_user .profile .name == "John Doe"
343+
255344
256345class LtiBackendTest (TestCase ):
257346 """
0 commit comments