@@ -2312,3 +2312,217 @@ async def test_get_user_personal_team_filters_correctly(self, mock_db):
23122312 # Verify execute was called (query construction is internal)
23132313 mock_db .execute .assert_called_once ()
23142314 mock_db .commit .assert_called_once ()
2315+
2316+ def test_should_include_personal_team_all_filters_pass (self ):
2317+ """Test should_include_personal_team returns True when all filters pass."""
2318+ mock_team = MagicMock (spec = EmailTeam )
2319+ mock_team .is_active = True
2320+ mock_team .visibility = "private"
2321+ mock_team .name = "Test Team"
2322+ mock_team .slug = "test-team"
2323+ mock_team .description = "A test description"
2324+
2325+ result = TeamManagementService .should_include_personal_team (
2326+ mock_team , include_inactive = True , visibility = None , search_query = None
2327+ )
2328+
2329+ assert result is True
2330+
2331+ def test_should_include_personal_team_filters_inactive_team (self ):
2332+ """Test should_include_personal_team filters out inactive teams when include_inactive=False."""
2333+ mock_team = MagicMock (spec = EmailTeam )
2334+ mock_team .is_active = False
2335+ mock_team .visibility = "private"
2336+ mock_team .name = "Inactive Team"
2337+ mock_team .slug = "inactive-team"
2338+ mock_team .description = "An inactive team"
2339+
2340+ result = TeamManagementService .should_include_personal_team (
2341+ mock_team , include_inactive = False , visibility = None , search_query = None
2342+ )
2343+
2344+ assert result is False
2345+
2346+ def test_should_include_personal_team_includes_inactive_when_flag_set (self ):
2347+ """Test should_include_personal_team includes inactive teams when include_inactive=True."""
2348+ mock_team = MagicMock (spec = EmailTeam )
2349+ mock_team .is_active = False
2350+ mock_team .visibility = "private"
2351+ mock_team .name = "Inactive Team"
2352+ mock_team .slug = "inactive-team"
2353+ mock_team .description = "An inactive team"
2354+
2355+ result = TeamManagementService .should_include_personal_team (
2356+ mock_team , include_inactive = True , visibility = None , search_query = None
2357+ )
2358+
2359+ assert result is True
2360+
2361+ def test_should_include_personal_team_filters_by_visibility (self ):
2362+ """Test should_include_personal_team filters teams by visibility."""
2363+ mock_team = MagicMock (spec = EmailTeam )
2364+ mock_team .is_active = True
2365+ mock_team .visibility = "private"
2366+ mock_team .name = "Private Team"
2367+ mock_team .slug = "private-team"
2368+ mock_team .description = "A private team"
2369+
2370+ # Should filter out when visibility doesn't match
2371+ result = TeamManagementService .should_include_personal_team (
2372+ mock_team , include_inactive = False , visibility = "public" , search_query = None
2373+ )
2374+
2375+ assert result is False
2376+
2377+ def test_should_include_personal_team_matches_visibility (self ):
2378+ """Test should_include_personal_team includes teams when visibility matches."""
2379+ mock_team = MagicMock (spec = EmailTeam )
2380+ mock_team .is_active = True
2381+ mock_team .visibility = "public"
2382+ mock_team .name = "Public Team"
2383+ mock_team .slug = "public-team"
2384+ mock_team .description = "A public team"
2385+
2386+ result = TeamManagementService .should_include_personal_team (
2387+ mock_team , include_inactive = False , visibility = "public" , search_query = None
2388+ )
2389+
2390+ assert result is True
2391+
2392+ def test_should_include_personal_team_search_matches_name (self ):
2393+ """Test should_include_personal_team search query matches team name."""
2394+ mock_team = MagicMock (spec = EmailTeam )
2395+ mock_team .is_active = True
2396+ mock_team .visibility = "private"
2397+ mock_team .name = "Engineering Team"
2398+ mock_team .slug = "eng-team"
2399+ mock_team .description = "Team for engineers"
2400+
2401+ result = TeamManagementService .should_include_personal_team (
2402+ mock_team , include_inactive = False , visibility = None , search_query = "engineering"
2403+ )
2404+
2405+ assert result is True
2406+
2407+ def test_should_include_personal_team_search_matches_slug (self ):
2408+ """Test should_include_personal_team search query matches team slug."""
2409+ mock_team = MagicMock (spec = EmailTeam )
2410+ mock_team .is_active = True
2411+ mock_team .visibility = "private"
2412+ mock_team .name = "Team Alpha"
2413+ mock_team .slug = "alpha-squad"
2414+ mock_team .description = "First team"
2415+
2416+ result = TeamManagementService .should_include_personal_team (
2417+ mock_team , include_inactive = False , visibility = None , search_query = "squad"
2418+ )
2419+
2420+ assert result is True
2421+
2422+ def test_should_include_personal_team_search_matches_description (self ):
2423+ """Test should_include_personal_team search query matches team description."""
2424+ mock_team = MagicMock (spec = EmailTeam )
2425+ mock_team .is_active = True
2426+ mock_team .visibility = "private"
2427+ mock_team .name = "Team Beta"
2428+ mock_team .slug = "beta"
2429+ mock_team .description = "Specialized operations team"
2430+
2431+ result = TeamManagementService .should_include_personal_team (
2432+ mock_team , include_inactive = False , visibility = None , search_query = "operations"
2433+ )
2434+
2435+ assert result is True
2436+
2437+ def test_should_include_personal_team_search_case_insensitive (self ):
2438+ """Test should_include_personal_team search is case-insensitive."""
2439+ mock_team = MagicMock (spec = EmailTeam )
2440+ mock_team .is_active = True
2441+ mock_team .visibility = "private"
2442+ mock_team .name = "DevOps Team"
2443+ mock_team .slug = "devops"
2444+ mock_team .description = "Infrastructure team"
2445+
2446+ result = TeamManagementService .should_include_personal_team (
2447+ mock_team , include_inactive = False , visibility = None , search_query = "DEVOPS"
2448+ )
2449+
2450+ assert result is True
2451+
2452+ def test_should_include_personal_team_search_no_match (self ):
2453+ """Test should_include_personal_team filters out teams when search doesn't match."""
2454+ mock_team = MagicMock (spec = EmailTeam )
2455+ mock_team .is_active = True
2456+ mock_team .visibility = "private"
2457+ mock_team .name = "Marketing Team"
2458+ mock_team .slug = "marketing"
2459+ mock_team .description = "Marketing operations"
2460+
2461+ result = TeamManagementService .should_include_personal_team (
2462+ mock_team , include_inactive = False , visibility = None , search_query = "engineering"
2463+ )
2464+
2465+ assert result is False
2466+
2467+ def test_should_include_personal_team_search_with_none_description (self ):
2468+ """Test should_include_personal_team handles None description in search."""
2469+ mock_team = MagicMock (spec = EmailTeam )
2470+ mock_team .is_active = True
2471+ mock_team .visibility = "private"
2472+ mock_team .name = "Sales Team"
2473+ mock_team .slug = "sales"
2474+ mock_team .description = None
2475+
2476+ # Should not match description (None), but should match name
2477+ result = TeamManagementService .should_include_personal_team (
2478+ mock_team , include_inactive = False , visibility = None , search_query = "sales"
2479+ )
2480+
2481+ assert result is True
2482+
2483+ def test_should_include_personal_team_search_no_match_with_none_description (self ):
2484+ """Test should_include_personal_team filters out when search doesn't match and description is None."""
2485+ mock_team = MagicMock (spec = EmailTeam )
2486+ mock_team .is_active = True
2487+ mock_team .visibility = "private"
2488+ mock_team .name = "Finance Team"
2489+ mock_team .slug = "finance"
2490+ mock_team .description = None
2491+
2492+ result = TeamManagementService .should_include_personal_team (
2493+ mock_team , include_inactive = False , visibility = None , search_query = "marketing"
2494+ )
2495+
2496+ assert result is False
2497+
2498+ def test_should_include_personal_team_multiple_filters_combined (self ):
2499+ """Test should_include_personal_team with multiple filters applied together."""
2500+ mock_team = MagicMock (spec = EmailTeam )
2501+ mock_team .is_active = True
2502+ mock_team .visibility = "public"
2503+ mock_team .name = "Open Source Team"
2504+ mock_team .slug = "opensource"
2505+ mock_team .description = "Public contributions"
2506+
2507+ # All filters should pass
2508+ result = TeamManagementService .should_include_personal_team (
2509+ mock_team , include_inactive = False , visibility = "public" , search_query = "open"
2510+ )
2511+
2512+ assert result is True
2513+
2514+ def test_should_include_personal_team_multiple_filters_one_fails (self ):
2515+ """Test should_include_personal_team returns False when one filter fails."""
2516+ mock_team = MagicMock (spec = EmailTeam )
2517+ mock_team .is_active = True
2518+ mock_team .visibility = "private"
2519+ mock_team .name = "Internal Team"
2520+ mock_team .slug = "internal"
2521+ mock_team .description = "Private operations"
2522+
2523+ # Visibility filter should fail
2524+ result = TeamManagementService .should_include_personal_team (
2525+ mock_team , include_inactive = False , visibility = "public" , search_query = "internal"
2526+ )
2527+
2528+ assert result is False
0 commit comments