"""Live read-only smoke test against a real ISPConfig panel. Gated on env vars: ``ISPCONFIG_TEST_URL``, ``ISPCONFIG_TEST_USER``, ``ISPCONFIG_TEST_PASS``. These tests are skipped if any is unset. They are **read-only** — no ``_add`` / ``_update`` / ``_delete`` calls. Safe to run against production (Rackham). """ from __future__ import annotations import pytest from ispconfig import ISPConfigClient @pytest.fixture() def client(live_creds: dict[str, str]) -> ISPConfigClient: with ISPConfigClient(live_creds["url"], live_creds["user"], live_creds["password"]) as c: yield c # type: ignore[misc] def test_login_returns_session(live_creds: dict[str, str]) -> None: c = ISPConfigClient(live_creds["url"], live_creds["user"], live_creds["password"]) c.login() assert c.session_id and len(c.session_id) > 10 assert c.logout() is True def test_get_domain_156(client: ISPConfigClient) -> None: site = client.sites.web_domain_get(156) assert site["domain"] == "mcbindustrial.com" assert site["php"] == "fast-cgi" def test_dns_zone_lookup(client: ISPConfigClient) -> None: zone_id = client.dns.zone_get_id("mcbindustrial.com.") assert zone_id > 0, "zone_get_id returned 0 — is the zone present?" def test_mail_users_under_mcbindustrial(client: ISPConfigClient) -> None: # mail_user_get accepts a filter-dict and returns a list. users = client.mail.user_get({"email": "%@mcbindustrial.com"}) assert isinstance(users, list) # Don't assert count — just shape. Zero mailboxes is a valid state. for u in users: assert "email" in u