"""Regression: AlicloudIntlProvider must hit the international domain endpoint (2026-04-24). Domestic ``domain.aliyuncs.com`` rejects international Aliyun account keys with HTTP 400. The intl subclass now overrides ``_DOMAIN_API_HOST``; this test locks in both (a) the intl host gets called, and (b) the domestic class still points at the domestic host — so the override doesn't bleed across subclasses. """ from __future__ import annotations from unittest.mock import patch import pytest from app.domains.cmdb.providers.alicloud_intl import AlicloudIntlProvider from app.domains.cmdb.providers.aliyun import AliyunProvider from app.domains.cmdb.providers.base import ProviderCredentials def _creds(provider_type: str = "aliyun") -> ProviderCredentials: return ProviderCredentials( provider_id="test-aliyun", provider_type=provider_type, account_alias="test", fields={ "access_key_id": "AKID", "access_key_secret": "SECRET", }, ) def test_domestic_host_default() -> None: assert AliyunProvider._DOMAIN_API_HOST == "https://domain.aliyuncs.com/" def test_intl_overrides_domain_host() -> None: assert ( AlicloudIntlProvider._DOMAIN_API_HOST == "https://domain-intl.aliyuncs.com/" ) # Parent class remains domestic — subclass override doesn't leak. assert AliyunProvider._DOMAIN_API_HOST == "https://domain.aliyuncs.com/" def test_intl_overrides_domain_api_version() -> None: """Intl domain service is pinned to 2017-12-18; domestic is 2018-01-29. Each host rejects the other's version with ``InvalidVersion``, so they must NOT share a value.""" assert AliyunProvider._DOMAIN_API_VERSION == "2018-01-29" assert AlicloudIntlProvider._DOMAIN_API_VERSION == "2017-12-18" assert ( AliyunProvider._DOMAIN_API_VERSION != AlicloudIntlProvider._DOMAIN_API_VERSION ) @pytest.mark.asyncio async def test_intl_list_domains_calls_intl_endpoint() -> None: provider = AlicloudIntlProvider(_creds("alicloud_intl")) captured: dict = {"url": None, "params": None} async def fake_call(url, params): captured["url"] = url captured["params"] = params # Empty response ends the pagination loop on the first page. return {"Data": {"Domain": []}} with patch.object(provider, "_call", side_effect=fake_call): rows = await provider.list_domains() assert rows == [] assert captured["url"] == "https://domain-intl.aliyuncs.com/" # Intl pins Version=2017-12-18; 2018-01-29 is rejected as # InvalidVersion by domain-intl.aliyuncs.com (probed against the # live endpoint 2026-04-24, see alicloud_intl._DOMAIN_API_VERSION). assert captured["params"]["Version"] == "2017-12-18" assert captured["params"]["Action"] == "QueryDomainList" @pytest.mark.asyncio async def test_domestic_list_domains_still_calls_domestic_endpoint() -> None: provider = AliyunProvider(_creds("aliyun")) captured: dict = {"url": None, "params": None} async def fake_call(url, params): captured["url"] = url captured["params"] = params return {"Data": {"Domain": []}} with patch.object(provider, "_call", side_effect=fake_call): await provider.list_domains() assert captured["url"] == "https://domain.aliyuncs.com/" # Domestic pins Version=2018-01-29 (different from intl's 2017-12-18 # — each host rejects the other's version with InvalidVersion). assert captured["params"]["Version"] == "2018-01-29"