#!/usr/bin/env python3 """ Unit tests for team management functionality """ import unittest from unittest.mock import Mock, patch, MagicMock import sys import os # Add parent directory to path to import modules sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) from team_management import TeamManager from user_management import UserManager from sigma_api_client import SigmaAPIClient, SigmaConfig class TestTeamManager(unittest.TestCase): """Test cases for TeamManager""" def setUp(self): """Set up test fixtures""" self.mock_client = Mock(spec=SigmaAPIClient) self.team_manager = TeamManager(self.mock_client) def test_init(self): """Test TeamManager initialization""" self.assertEqual(self.team_manager.api, self.mock_client) self.assertIsInstance(self.team_manager.user_manager, UserManager) def test_list_teams_success(self): """Test successful team listing""" mock_response = { 'entries': [ {'teamId': '1', 'name': 'Team One', 'createdAt': '2025-01-01'}, {'teamId': '2', 'name': 'Team Two', 'createdAt': '2025-01-02'} ] } self.mock_client.get.return_value = mock_response result = self.team_manager.list_teams() self.assertEqual(len(result), 2) self.assertEqual(result[0]['name'], 'Team One') self.mock_client.get.assert_called_once_with('/v2/teams', params={'limit': 50}) def test_list_teams_error_handling(self): """Test team listing error handling""" self.mock_client.get.side_effect = Exception("API Error") result = self.team_manager.list_teams() self.assertEqual(result, []) def test_get_team_by_name_found(self): """Test finding team by name""" mock_teams = [ {'teamId': '1', 'name': 'Team One'}, {'teamId': '2', 'name': 'Team Two'} ] with patch.object(self.team_manager, 'list_teams', return_value=mock_teams): result = self.team_manager.get_team_by_name('Team Two') self.assertIsNotNone(result) self.assertEqual(result['teamId'], '2') self.assertEqual(result['name'], 'Team Two') def test_get_team_by_name_case_insensitive(self): """Test case insensitive team name search""" mock_teams = [ {'teamId': '1', 'name': 'Team One'} ] with patch.object(self.team_manager, 'list_teams', return_value=mock_teams): result = self.team_manager.get_team_by_name('team one') self.assertIsNotNone(result) self.assertEqual(result['teamId'], '1') def test_get_team_by_name_not_found(self): """Test team not found by name""" mock_teams = [ {'teamId': '1', 'name': 'Team One'} ] with patch.object(self.team_manager, 'list_teams', return_value=mock_teams): result = self.team_manager.get_team_by_name('Nonexistent Team') self.assertIsNone(result) def test_get_team_details_success(self): """Test successful team details retrieval""" mock_response = { 'teamId': 'test_team_id', 'name': 'Test Team', 'members': ['user1', 'user2'] } self.mock_client.get.return_value = mock_response result = self.team_manager.get_team_details('test_team_id') self.assertEqual(result['name'], 'Test Team') self.assertEqual(len(result['members']), 2) self.mock_client.get.assert_called_once_with('/v2/teams/test_team_id') def test_list_team_members_success(self): """Test successful team members listing""" mock_team_details = { 'teamId': 'test_team_id', 'members': ['user1', 'user2', 'user3'] } self.mock_client.get.return_value = mock_team_details result = self.team_manager.list_team_members('test_team_id') self.assertEqual(len(result), 3) self.assertEqual(result[0]['memberId'], 'user1') self.assertEqual(result[1]['memberId'], 'user2') self.assertEqual(result[2]['memberId'], 'user3') def test_list_team_members_empty(self): """Test team members listing with no members""" mock_team_details = { 'teamId': 'test_team_id', 'members': [] } self.mock_client.get.return_value = mock_team_details result = self.team_manager.list_team_members('test_team_id') self.assertEqual(len(result), 0) def test_add_users_to_team_success(self): """Test successful user addition to team""" # Mock current team members with patch.object(self.team_manager, 'list_team_members', return_value=[]): # Mock user lookup mock_user1 = {'memberId': 'user1_id', 'email': 'user1@test.com', 'isInactive': False} mock_user2 = {'memberId': 'user2_id', 'email': 'user2@test.com', 'isInactive': False} self.team_manager.user_manager.get_member_by_email = Mock(side_effect=[mock_user1, mock_user2]) # Mock API patch call self.mock_client.patch.return_value = {'success': True} # Test result = self.team_manager.add_users_to_team( 'team_id', ['user1@test.com', 'user2@test.com'] ) # Assertions self.assertEqual(len(result['successful_additions']), 2) self.assertEqual(len(result['failed_additions']), 0) self.assertEqual(len(result['users_not_found']), 0) self.assertIn('user1@test.com', result['successful_additions']) self.assertIn('user2@test.com', result['successful_additions']) def test_add_users_to_team_inactive_user(self): """Test adding inactive user to team""" with patch.object(self.team_manager, 'list_team_members', return_value=[]): # Mock inactive user mock_user = {'memberId': 'user1_id', 'email': 'user1@test.com', 'isInactive': True} self.team_manager.user_manager.get_member_by_email = Mock(return_value=mock_user) result = self.team_manager.add_users_to_team('team_id', ['user1@test.com']) # Should fail because user is inactive self.assertEqual(len(result['successful_additions']), 0) self.assertEqual(len(result['failed_additions']), 1) self.assertEqual(result['failed_additions'][0]['email'], 'user1@test.com') self.assertIn('inactive', result['failed_additions'][0]['error'].lower()) def test_add_users_to_team_user_not_found(self): """Test adding non-existent user to team""" with patch.object(self.team_manager, 'list_team_members', return_value=[]): # Mock user not found self.team_manager.user_manager.get_member_by_email = Mock(return_value=None) result = self.team_manager.add_users_to_team('team_id', ['nonexistent@test.com']) # Should be in users_not_found self.assertEqual(len(result['successful_additions']), 0) self.assertEqual(len(result['users_not_found']), 1) self.assertIn('nonexistent@test.com', result['users_not_found']) def test_add_users_to_team_already_member(self): """Test adding user who is already a team member""" # Mock current team members current_members = [{'memberId': 'existing_user_id'}] with patch.object(self.team_manager, 'list_team_members', return_value=current_members): # Mock user lookup returns existing member mock_user = {'memberId': 'existing_user_id', 'email': 'existing@test.com', 'isInactive': False} self.team_manager.user_manager.get_member_by_email = Mock(return_value=mock_user) result = self.team_manager.add_users_to_team('team_id', ['existing@test.com']) # Should be in already_members self.assertEqual(len(result['successful_additions']), 0) self.assertEqual(len(result['already_members']), 1) self.assertIn('existing@test.com', result['already_members']) def test_remove_users_from_team_success(self): """Test successful user removal from team""" # Mock current team members current_members = [ {'memberId': 'user1_id'}, {'memberId': 'user2_id'}, {'memberId': 'user3_id'} ] with patch.object(self.team_manager, 'list_team_members', return_value=current_members): # Mock user lookup mock_user = {'memberId': 'user2_id', 'email': 'user2@test.com'} self.team_manager.user_manager.get_member_by_email = Mock(return_value=mock_user) # Mock API patch call self.mock_client.patch.return_value = {'success': True} result = self.team_manager.remove_users_from_team('team_id', ['user2@test.com']) # Assertions self.assertEqual(len(result['successful_removals']), 1) self.assertIn('user2@test.com', result['successful_removals']) def test_remove_users_from_team_not_member(self): """Test removing user who is not a team member""" # Mock current team members current_members = [{'memberId': 'other_user_id'}] with patch.object(self.team_manager, 'list_team_members', return_value=current_members): # Mock user lookup mock_user = {'memberId': 'user1_id', 'email': 'user1@test.com'} self.team_manager.user_manager.get_member_by_email = Mock(return_value=mock_user) result = self.team_manager.remove_users_from_team('team_id', ['user1@test.com']) # Should be in not_members self.assertEqual(len(result['successful_removals']), 0) self.assertEqual(len(result['not_members']), 1) self.assertIn('user1@test.com', result['not_members']) def test_get_team_summary_success(self): """Test successful team summary retrieval""" # Mock team lookup mock_team = {'teamId': 'test_id', 'name': 'Test Team'} with patch.object(self.team_manager, 'get_team_by_name', return_value=mock_team): # Mock team details with patch.object(self.team_manager, 'get_team_details', return_value=mock_team): # Mock team members mock_members = [{'memberId': 'user1_id'}] with patch.object(self.team_manager, 'list_team_members', return_value=mock_members): # Mock all users list mock_all_users = [ {'memberId': 'user1_id', 'email': 'user1@test.com', 'firstName': 'User', 'lastName': 'One'} ] self.team_manager.user_manager.list_members = Mock(return_value=mock_all_users) result = self.team_manager.get_team_summary('Test Team') # Assertions self.assertNotIn('error', result) self.assertEqual(result['team']['name'], 'Test Team') self.assertEqual(result['member_count'], 1) self.assertEqual(result['members'][0]['email'], 'user1@test.com') def test_get_team_summary_team_not_found(self): """Test team summary when team is not found""" with patch.object(self.team_manager, 'get_team_by_name', return_value=None): result = self.team_manager.get_team_summary('Nonexistent Team') self.assertIn('error', result) self.assertIn('not found', result['error']) if __name__ == '__main__': unittest.main()