@@ -26702,6 +26702,32 @@ async def test_transfer_gateway_ownership_success(self, monkeypatch, allow_permi
2670226702 )
2670326703 assert result is expected
2670426704
26705+ @pytest.mark.asyncio
26706+ async def test_transfer_gateway_ownership_passes_token_team_scope(self, monkeypatch, allow_permission, mock_db):
26707+ """Transfer route forwards the normalized token-team scope to the service."""
26708+ expected = MagicMock(spec=GatewayRead)
26709+ transfer_service = AsyncMock(return_value=expected)
26710+ monkeypatch.setattr("mcpgateway.admin.gateway_service.transfer_gateway_ownership", transfer_service)
26711+ monkeypatch.setattr("mcpgateway.admin.get_user_email", MagicMock(return_value="admin@x.com"))
26712+
26713+ result = await transfer_gateway_ownership(
26714+ gateway_id="gw-1",
26715+ transfer=GatewayOwnershipTransferRequest(target_owner_email="new@x.com", target_team_id="team-1"),
26716+ db=mock_db,
26717+ _user={"email": "admin@x.com", "is_admin": True, "token_teams": ["team-1"]},
26718+ )
26719+
26720+ assert result is expected
26721+ transfer_service.assert_awaited_once_with(
26722+ db=mock_db,
26723+ gateway_id="gw-1",
26724+ target_owner_email="new@x.com",
26725+ actor_email="admin@x.com",
26726+ target_team_id="team-1",
26727+ token_teams=["team-1"],
26728+ )
26729+
26730+
2670526731 @pytest.mark.asyncio
2670626732 async def test_transfer_gateway_ownership_not_found(self, monkeypatch, allow_permission, mock_db):
2670726733 monkeypatch.setattr(
@@ -26791,6 +26817,43 @@ async def test_admin_register_catalog_permission_error(self, monkeypatch, allow_
2679126817 await register_catalog_server("srv-1", request, db=mock_db, _user={"email": "admin@test.com"})
2679226818 assert exc_info.value.status_code == 403
2679326819
26820+
26821+ @pytest.mark.asyncio
26822+ async def test_admin_register_catalog_requires_gateways_create(self, monkeypatch, allow_permission, mock_db):
26823+ """Catalog registration must require gateway creation permission too."""
26824+ monkeypatch.setattr("mcpgateway.admin.settings.mcpgateway_catalog_enabled", True, raising=False)
26825+ allow_permission.check_permission = AsyncMock(side_effect=[True, False])
26826+ monkeypatch.setattr(
26827+ "mcpgateway.admin.catalog_service.register_catalog_server",
26828+ AsyncMock(return_value=MagicMock()),
26829+ )
26830+
26831+ request = MagicMock(spec=Request)
26832+ request.headers = {}
26833+ with pytest.raises(HTTPException) as exc_info:
26834+ await register_catalog_server("srv-1", request, db=mock_db, _user={"email": "admin@test.com"})
26835+
26836+ assert exc_info.value.status_code == 403
26837+
26838+ @pytest.mark.asyncio
26839+ async def test_admin_bulk_register_catalog_requires_gateways_create(self, monkeypatch, allow_permission, mock_db):
26840+ """Bulk catalog registration must require gateway creation permission too."""
26841+ monkeypatch.setattr("mcpgateway.admin.settings.mcpgateway_catalog_enabled", True, raising=False)
26842+ allow_permission.check_permission = AsyncMock(side_effect=[True, False])
26843+
26844+ from mcpgateway.schemas import CatalogBulkRegisterRequest
26845+
26846+ request = MagicMock(spec=Request)
26847+ with pytest.raises(HTTPException) as exc_info:
26848+ await bulk_register_catalog_servers(
26849+ request,
26850+ CatalogBulkRegisterRequest(server_ids=["srv-1"]),
26851+ db=mock_db,
26852+ _user={"email": "admin@test.com"},
26853+ )
26854+
26855+ assert exc_info.value.status_code == 403
26856+
2679426857 @pytest.mark.asyncio
2679526858 async def test_admin_bulk_register_catalog_permission_error(self, monkeypatch, allow_permission, mock_db):
2679626859 monkeypatch.setattr("mcpgateway.admin.settings.mcpgateway_catalog_enabled", True, raising=False)
0 commit comments