"""SOAP PropertyCollector / TaskManager fidelity tests.""" from __future__ import annotations import os import pytest from httpx import ASGITransport, AsyncClient from app.config import Settings from app.main import create_app from app.vsphere.seed import seed_vsphere_inventory pytestmark = pytest.mark.integration @pytest.fixture async def client() -> AsyncClient: database_url = os.getenv("TEST_DATABASE_URL") or os.getenv("DATABASE_URL") if not database_url: pytest.skip("TEST_DATABASE_URL / DATABASE_URL required") settings = Settings( database_url=database_url, # type: ignore[arg-type] contract_snapshot=None, enable_pve_stub=False, ) app = create_app(settings=settings, worker_factories=()) async with app.router.lifespan_context(app): await seed_vsphere_inventory(app.state.database, force=True, profile="small") async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as http: yield http async def _soap_login(client: AsyncClient) -> str: login = await client.post( "/sdk", content=""" <_this type="SessionManager">SessionManager administrator@vsphere.local VMware1! """, headers={"Content-Type": "text/xml"}, ) assert login.status_code == 200 assert "LoginResponse" in login.text cookie = login.headers.get("set-cookie") or "" assert "vmware_soap_session" in cookie return cookie.split(";")[0] async def test_folder_child_entity_and_path(client: AsyncClient) -> None: cookie = await _soap_login(client) props = await client.post( "/sdk", content=""" <_this type="PropertyCollector">propertyCollector FolderchildEntityname group-d1 """, headers={"Content-Type": "text/xml", "Cookie": cookie}, ) assert props.status_code == 200 assert "childEntity" in props.text assert "datacenter-21" in props.text path = await client.post( "/sdk", content=""" <_this type="SearchIndex">SearchIndex /Datacenters/Datacenter/vm/web-01 """, headers={"Content-Type": "text/xml", "Cookie": cookie}, ) assert path.status_code == 200 assert "vm-101" in path.text async def test_wait_for_updates_version_and_power_task_id(client: AsyncClient) -> None: cookie = await _soap_login(client) first = await client.post( "/sdk", content=""" <_this type="PropertyCollector">propertyCollector """, headers={"Content-Type": "text/xml", "Cookie": cookie}, ) assert first.status_code == 200 assert "1" in first.text assert "enter" in first.text second = await client.post( "/sdk", content=""" <_this type="PropertyCollector">propertyCollector 1 """, headers={"Content-Type": "text/xml", "Cookie": cookie}, ) assert second.status_code == 200 assert "enter" not in second.text power = await client.post( "/sdk", content=""" <_this type="VirtualMachine">vm-104 """, headers={"Content-Type": "text/xml", "Cookie": cookie}, ) assert power.status_code == 200 assert "task-" in power.text assert "task-1<" not in power.text about = await client.get("/sdk/about.do") assert about.status_code == 200 assert "vCenter" in about.text wsdl = await client.get("/sdk/vimService.wsdl") assert "WaitForUpdatesEx" in wsdl.text assert "CancelTask" in wsdl.text async def test_legacy_rest_value_wrapper(client: AsyncClient) -> None: login = await client.post( "/api/session", auth=("administrator@vsphere.local", "VMware1!"), ) headers = {"vmware-api-session-id": login.json()} resp = await client.get("/rest/vcenter/vm", headers=headers, params={"limit": 2}) assert resp.status_code == 200 body = resp.json() assert "value" in body assert len(body["value"]) == 2