import pytest from unittest.mock import patch, AsyncMock, MagicMock from src.services.user_service import user_service from src.models.users import UserCreate, UserUpdate, UserStatus from src.core.exceptions import UserNotFoundException, SambaAPIException class TestUserService: """Test user service functionality""" @patch('src.services.user_service.samba_service._run_samba_tool') @patch('src.services.user_service.user_service.get_user') async def test_create_user_success(self, mock_get_user, mock_run_samba_tool): """Test successful user creation""" # Mock data user_data = UserCreate( username="testuser", password="TestPassword123!", first_name="Test", last_name="User", email="testuser@example.com" ) # Mock samba-tool command mock_run_samba_tool.return_value = {"returncode": 0, "stdout": "", "stderr": ""} # Mock get_user response from src.models.users import UserResponse mock_user_response = UserResponse( username="testuser", first_name="Test", last_name="User", email="testuser@example.com", dn="CN=testuser,CN=Users,DC=example,DC=com", status=UserStatus.ACTIVE, groups=[] ) mock_get_user.return_value = mock_user_response # Test user creation result = await user_service.create_user(user_data) assert result.username == "testuser" assert result.first_name == "Test" assert result.last_name == "User" mock_run_samba_tool.assert_called_once() @patch('src.services.user_service.samba_service._get_connection') async def test_get_user_not_found(self, mock_get_connection): """Test get user when user doesn't exist""" # Mock LDAP connection with empty results mock_conn = MagicMock() mock_conn.entries = [] mock_get_connection.return_value = mock_conn with pytest.raises(UserNotFoundException): await user_service.get_user("nonexistent") @patch('src.services.user_service.samba_service._run_samba_tool') async def test_delete_user_success(self, mock_run_samba_tool): """Test successful user deletion""" mock_run_samba_tool.return_value = {"returncode": 0, "stdout": "", "stderr": ""} result = await user_service.delete_user("testuser") assert result is True mock_run_samba_tool.assert_called_once_with(['user', 'delete', 'testuser']) @patch('src.services.user_service.samba_service._run_samba_tool') async def test_change_password_success(self, mock_run_samba_tool): """Test successful password change""" mock_run_samba_tool.return_value = {"returncode": 0, "stdout": "", "stderr": ""} result = await user_service.change_password("testuser", "NewPassword123!") assert result is True mock_run_samba_tool.assert_called_once_with([ 'user', 'setpassword', 'testuser', '--newpassword', 'NewPassword123!' ])