@@ -504,6 +504,71 @@ def test_lookup_user_by_permissions_jira_data_center_name_only(self, users_mixin
504504 "permissions" : "BROWSE" ,
505505 }
506506
507+ def test_determine_user_api_params_server_dc_email_resolved_to_username (
508+ self , users_mixin
509+ ):
510+ """Test Server/DC email is resolved via search, not passed directly as username."""
511+ users_mixin .config = MagicMock (spec = JiraConfig )
512+ users_mixin .config .is_cloud = False
513+ users_mixin ._lookup_user_directly = MagicMock (return_value = "jnovak" )
514+
515+ params = users_mixin ._determine_user_api_params ("jnovak@firma.cz" )
516+
517+ assert params == {"username" : "jnovak" }
518+ users_mixin ._lookup_user_directly .assert_called_once_with ("jnovak@firma.cz" )
519+
520+ def test_determine_user_api_params_server_dc_email_resolved_to_key (
521+ self , users_mixin
522+ ):
523+ """Test Server/DC email resolving to a key-style identifier."""
524+ users_mixin .config = MagicMock (spec = JiraConfig )
525+ users_mixin .config .is_cloud = False
526+ users_mixin ._lookup_user_directly = MagicMock (return_value = "JIRAUSER-12345" )
527+
528+ params = users_mixin ._determine_user_api_params ("jnovak@firma.cz" )
529+
530+ assert params == {"key" : "JIRAUSER-12345" }
531+
532+ def test_determine_user_api_params_server_dc_email_lookup_fails_fallback (
533+ self , users_mixin
534+ ):
535+ """Test Server/DC email falls back to direct username when lookup returns None."""
536+ users_mixin .config = MagicMock (spec = JiraConfig )
537+ users_mixin .config .is_cloud = False
538+ users_mixin ._lookup_user_directly = MagicMock (return_value = None )
539+
540+ params = users_mixin ._determine_user_api_params ("login@example.com" )
541+
542+ # Fallback: email used as username directly (e.g., when login IS the email)
543+ assert params == {"username" : "login@example.com" }
544+
545+ def test_get_user_profile_by_identifier_server_dc_email (self , users_mixin ):
546+ """Regression: Server/DC email lookup must search first, not pass email as username."""
547+ users_mixin .config = MagicMock (spec = JiraConfig )
548+ users_mixin .config .is_cloud = False
549+ users_mixin ._lookup_user_directly = MagicMock (return_value = "jnovak" )
550+
551+ with patch (
552+ "src.mcp_atlassian.jira.users.JiraUser.from_api_response"
553+ ) as mock_from_api_response :
554+ mock_user_instance = MagicMock ()
555+ mock_from_api_response .return_value = mock_user_instance
556+ mock_response_data = {
557+ "name" : "jnovak" ,
558+ "displayName" : "Jan Novák" ,
559+ "emailAddress" : "jnovak@firma.cz" ,
560+ "active" : True ,
561+ }
562+ users_mixin .jira .user = MagicMock (return_value = mock_response_data )
563+
564+ user = users_mixin .get_user_profile_by_identifier ("jnovak@firma.cz" )
565+
566+ assert user == mock_user_instance
567+ # Must resolve email to username first
568+ users_mixin ._lookup_user_directly .assert_called_once_with ("jnovak@firma.cz" )
569+ # Must call user() with resolved username, NOT the raw email
570+ users_mixin .jira .user .assert_called_once_with (username = "jnovak" )
571+
507572 def test_get_user_profile_by_identifier_cloud_account_id (self , users_mixin ):
508573 """Test get_user_profile_by_identifier with Cloud and accountId."""
509574 users_mixin .config = MagicMock (spec = JiraConfig )
0 commit comments