@@ -494,6 +494,135 @@ def test_user_external_unconfirmed(self, app, institution, url_auth_institution)
494494 assert accepted_terms_of_service == user .accepted_terms_of_service
495495 assert not user .has_usable_password ()
496496
497+ def test_duplicate_emails_and_names_success_existing_user (self , app , institution , url_auth_institution ):
498+ username , fullname , password = 'user_deanseu@user.edu' , 'Foo Bar' , 'FuAsKeEr'
499+ exiting_user = make_user (username , fullname )
500+ exiting_user .set_password (password )
501+ exiting_user .save ()
502+ sso_email = f'{ username } ;{ username } '
503+ with capture_signals () as mock_signals :
504+ res = app .post (
505+ url_auth_institution ,
506+ make_payload (
507+ institution ,
508+ sso_email ,
509+ family_name = 'User;User' ,
510+ given_name = 'Fake;Fake' ,
511+ fullname = 'Fake User;Fake User' ,
512+ )
513+ )
514+ assert res .status_code == 204
515+ assert not mock_signals .signals_sent ()
516+ user = OSFUser .objects .filter (username = username ).first ()
517+ assert user
518+ assert user .fullname == fullname
519+ affiliation = user .get_institution_affiliation (institution ._id )
520+ assert affiliation .sso_mail == username
521+ assert user .has_usable_password ()
522+ assert user .check_password (password )
523+ assert institution in user .get_affiliated_institutions ()
524+
525+ def test_duplicate_emails_and_names_success_new_user (self , app , institution , url_auth_institution ):
526+ username , fullname , family_name , given_name = 'user_deansnu@user.edu' , 'Fake User' , 'User' , 'Fake'
527+ sso_email = f'{ username } ;{ username } '
528+ with capture_signals () as mock_signals :
529+ res = app .post (
530+ url_auth_institution ,
531+ make_payload (
532+ institution ,
533+ sso_email ,
534+ family_name = f'{ family_name } ;{ family_name } ' ,
535+ given_name = f'{ given_name } ;{ given_name } ' ,
536+ fullname = f'{ fullname } ;{ fullname } ' ,
537+ )
538+ )
539+ assert res .status_code == 204
540+ assert mock_signals .signals_sent ()
541+ user = OSFUser .objects .filter (username = username ).first ()
542+ assert user
543+ assert user .fullname == fullname
544+ assert user .family_name == family_name
545+ assert user .given_name == given_name
546+ affiliation = user .get_institution_affiliation (institution ._id )
547+ assert affiliation .sso_mail == username
548+ assert user .has_usable_password ()
549+ assert institution in user .get_affiliated_institutions ()
550+
551+ def test_multiple_names_warning_exiting_user (self , app , institution , url_auth_institution ):
552+ username , fullname , password = 'user_mnweu@user.edu' , 'Foo Bar' , 'FuAsKeEr'
553+ exiting_user = make_user (username , fullname )
554+ exiting_user .set_password (password )
555+ exiting_user .save ()
556+ with capture_signals () as mock_signals :
557+ res = app .post (
558+ url_auth_institution ,
559+ make_payload (
560+ institution ,
561+ username ,
562+ family_name = 'User1;User2' ,
563+ given_name = 'Fake1;Fake2' ,
564+ fullname = 'Fake1 User1;Fake2 User2' ,
565+ )
566+ )
567+ assert res .status_code == 204
568+ assert not mock_signals .signals_sent ()
569+ user = OSFUser .objects .filter (username = username ).first ()
570+ assert user
571+ assert user .fullname == fullname
572+ affiliation = user .get_institution_affiliation (institution ._id )
573+ assert affiliation .sso_mail == username
574+ assert user .has_usable_password ()
575+ assert user .check_password (password )
576+ assert institution in user .get_affiliated_institutions ()
577+
578+ def test_multiple_names_warning_new_user (self , app , institution , url_auth_institution ):
579+ sso_email , fullname , family_name , given_name = 'user_deansnu@user.edu' , 'Fake User;Foo Bar' , 'User;Bar' , 'Fake;Foo'
580+ with capture_signals () as mock_signals :
581+ res = app .post (
582+ url_auth_institution ,
583+ make_payload (institution , sso_email , family_name = family_name , given_name = given_name , fullname = fullname ),
584+ )
585+ assert res .status_code == 204
586+ assert mock_signals .signals_sent ()
587+ user = OSFUser .objects .filter (username = sso_email ).first ()
588+ assert user
589+ assert user .fullname == fullname
590+ assert user .family_name == family_name
591+ assert user .given_name == given_name
592+ affiliation = user .get_institution_affiliation (institution ._id )
593+ assert affiliation .sso_mail == sso_email
594+ assert user .has_usable_password ()
595+ assert institution in user .get_affiliated_institutions ()
596+
597+ def test_multiple_emails_failure_existing_user (self , app , institution , url_auth_institution ):
598+ username , second_email , fullname , password = 'user_mefeu_a' , 'user_mefeu_b@user.edu' , 'Fake User' , 'FuAsKeEr'
599+ existing_uesr = make_user (username , fullname )
600+ existing_uesr .set_password (password )
601+ existing_uesr .save ()
602+ sso_email = f'{ username } ;{ second_email } '
603+ with capture_signals () as mock_signals :
604+ res = app .post (
605+ url_auth_institution ,
606+ make_payload (institution , sso_email = sso_email , fullname = fullname ),
607+ expect_errors = True ,
608+ )
609+ assert res .status_code == 403
610+ assert res .json ['errors' ][0 ]['detail' ] == 'InstitutionSsoMultipleEmailsNotSupported'
611+ assert not mock_signals .signals_sent ()
612+
613+ def test_multiple_emails_failure_new_user (self , app , institution , url_auth_institution ):
614+ first_email , second_email , family_name , given_name = 'user_mefeu_a' , 'user_mefeu_b@user.edu' , 'User' , 'Fake'
615+ sso_email = f'{ first_email } ;{ second_email } '
616+ with capture_signals () as mock_signals :
617+ res = app .post (
618+ url_auth_institution ,
619+ make_payload (institution , sso_email , family_name = family_name , given_name = given_name ),
620+ expect_errors = True ,
621+ )
622+ assert res .status_code == 403
623+ assert res .json ['errors' ][0 ]['detail' ] == 'InstitutionSsoMultipleEmailsNotSupported'
624+ assert not mock_signals .signals_sent ()
625+
497626
498627@pytest .mark .django_db
499628class TestInstitutionStorageRegion :
0 commit comments