#!/usr/bin/env python3 """ Unit tests for TeamManager class in team_manager.py Run with: python -m pytest scripts/test_team_manager.py -v Or: python scripts/test_team_manager.py """ import json import os import shutil import sys import tempfile import unittest from pathlib import Path # Add parent directory to path to import team_manager sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from scripts.team_manager import ( TeamManager, Role, Team, validate_project_name, UserContext, StructuredLogger, PermissionDenied ) def create_admin_context() -> UserContext: """Create an admin user context for testing.""" return UserContext(user_id="test-admin", role="admin") def create_team_lead_context(team_id: int = None) -> UserContext: """Create a team-lead user context for testing.""" return UserContext(user_id="test-lead", role="team-lead", team_id=team_id) def create_test_logger() -> StructuredLogger: """Create a test logger.""" return StructuredLogger("test", request_id="test-123") class TestValidateProjectName(unittest.TestCase): """Tests for validate_project_name function.""" def test_valid_names(self): """Test valid project names.""" valid_names = [ "my-project", "my_project", "project123", "ProjectName", "a", "A" * 64, ] for name in valid_names: with self.subTest(name=name): # Should not raise validate_project_name(name) def test_empty_name(self): """Test empty project name raises error.""" with self.assertRaises(ValueError) as ctx: validate_project_name("") self.assertIn("required", str(ctx.exception).lower()) def test_none_name(self): """Test None project name raises error.""" with self.assertRaises((ValueError, TypeError)) as ctx: validate_project_name(None) def test_name_too_long(self): """Test project name over 64 characters raises error.""" with self.assertRaises(ValueError) as ctx: validate_project_name("a" * 65) self.assertIn("64", str(ctx.exception)) def test_invalid_characters(self): """Test invalid characters in project name raise error.""" invalid_names = [ "project with spaces", "project;rm -rf", "project/test", "project.json", "project$(whoami)", "project|cat /etc/passwd", "project`id`", "project