@@ -507,3 +507,58 @@ def test_endpoint_calls_email_service_client_with_change_notification(self, mock
507
507
mock_email_service_client .send_provider_email_change_notification .assert_called_once_with (
508
508
compact = DEFAULT_COMPACT , old_email_address = TEST_OLD_EMAIL , new_email_address = TEST_NEW_EMAIL
509
509
)
510
+
511
+ @patch ('cc_common.config._Config.email_service_client' )
512
+ def test_endpoint_returns_400_if_new_email_becomes_unavailable_during_verification (self , mock_email_service_client ):
513
+ from cc_common .data_model .schema .provider import ProviderData
514
+ from handlers .provider_users import provider_users_api_handler
515
+
516
+ # First create the old email user in Cognito so we can update it
517
+ self .config .cognito_client .admin_create_user (
518
+ UserPoolId = self .config .provider_user_pool_id ,
519
+ Username = TEST_OLD_EMAIL ,
520
+ UserAttributes = [
521
+ {'Name' : 'email' , 'Value' : TEST_OLD_EMAIL },
522
+ {'Name' : 'email_verified' , 'Value' : 'true' },
523
+ {'Name' : 'custom:compact' , 'Value' : DEFAULT_COMPACT },
524
+ {'Name' : 'custom:providerId' , 'Value' : DEFAULT_PROVIDER_ID },
525
+ ],
526
+ MessageAction = 'SUPPRESS' ,
527
+ )
528
+
529
+ # Create another user with the new email address to simulate it becoming unavailable
530
+ # This simulates someone else registering with this email between verification start and finish
531
+ self .config .cognito_client .admin_create_user (
532
+ UserPoolId = self .config .provider_user_pool_id ,
533
+ Username = TEST_NEW_EMAIL ,
534
+ UserAttributes = [
535
+ {'Name' : 'email' , 'Value' : TEST_NEW_EMAIL },
536
+ {'Name' : 'email_verified' , 'Value' : 'true' },
537
+ ],
538
+ MessageAction = 'SUPPRESS' ,
539
+ )
540
+
541
+ event = self ._when_testing_provider_user_event_with_custom_claims ()
542
+
543
+ resp = provider_users_api_handler (event , self .mock_context )
544
+
545
+ self .assertEqual (400 , resp ['statusCode' ])
546
+ resp_body = json .loads (resp ['body' ])
547
+ self .assertEqual (
548
+ 'Email address is no longer available. Please try again with a different email address.' ,
549
+ resp_body ['message' ],
550
+ )
551
+
552
+ # Verify pending fields were cleared from the provider record
553
+ test_provider_record = self .test_data_generator .generate_default_provider ()
554
+ stored_provider_data = ProviderData .from_database_record (
555
+ self .test_data_generator .load_provider_data_record_from_database (test_provider_record )
556
+ )
557
+
558
+ # Pending fields should be cleared
559
+ self .assertIsNone (stored_provider_data .pendingEmailAddress )
560
+ self .assertIsNone (stored_provider_data .emailVerificationCode )
561
+ self .assertIsNone (stored_provider_data .emailVerificationExpiry )
562
+
563
+ # Original email should remain unchanged
564
+ self .assertEqual (TEST_OLD_EMAIL , stored_provider_data .compactConnectRegisteredEmailAddress )
0 commit comments