import asyncio from services.integrations import nacos_service from services.integrations.nacos_service import NacosConfig, NacosManager, ServiceConfig, load_service_config class _FakeConfigParser: def get(self, section, option, fallback=None): if section == "app" and option == "host": return "0.0.0.0" if section == "app" and option == "service_name": return fallback if section == "app" and option == "version": return "1.2.3" if section == "app" and option == "model_section": return "qwen-80b" return fallback def getint(self, section, option, fallback=None): if section == "app" and option == "port": return 8000 return fallback class _RetryNacosManager(NacosManager): def __init__(self, nacos_config: NacosConfig, service_config: ServiceConfig): super().__init__(nacos_config, service_config) self.register_attempts = 0 def register_service(self) -> bool: self.register_attempts += 1 # First attempt fails, later attempts succeed. self.is_registered = self.register_attempts >= 2 return self.is_registered def test_load_service_config_streaming_metadata_and_service_name_fallback(monkeypatch): monkeypatch.setattr(nacos_service.Config, "_config", _FakeConfigParser()) monkeypatch.setattr(nacos_service.Config, "DEFAULT_MODEL_SECTION", "gpt-4o") monkeypatch.setattr(nacos_service.Config, "get_section", lambda section: {} if section == "metadata" else {}) monkeypatch.setattr(nacos_service, "_get_local_ip", lambda: "10.0.0.8") cfg = load_service_config() assert cfg.service_name == "apbo-boat-agent" assert cfg.ip == "10.0.0.8" assert cfg.metadata["streaming"] == "true" def test_nacos_manager_start_keeps_retry_loop_when_first_register_fails(): nacos_cfg = NacosConfig( enabled=True, server_addresses="localhost:8848", namespace="public", group_name="DEFAULT_GROUP", cluster_name="DEFAULT", username=None, password=None, heartbeat_interval=1, weight=1.0, ephemeral=True, register_port=None, ) service_cfg = ServiceConfig( service_name="apbo-boat-agent", host="0.0.0.0", port=8000, ip="10.0.0.8", metadata={}, ) manager = _RetryNacosManager(nacos_cfg, service_cfg) async def _run_case(): await manager.start() await asyncio.sleep(1.2) await manager.stop() asyncio.run(_run_case()) assert manager.register_attempts >= 2 assert manager.is_registered is True class _CaptureClient: def __init__(self): self.register_calls = [] self.heartbeat_calls = [] self.remove_calls = [] def add_naming_instance(self, **kwargs): self.register_calls.append(kwargs) def send_heartbeat(self, **kwargs): self.heartbeat_calls.append(kwargs) def remove_naming_instance(self, **kwargs): self.remove_calls.append(kwargs) def test_nacos_manager_uses_register_port_override_for_registry_calls(): nacos_cfg = NacosConfig( enabled=True, server_addresses="localhost:8848", namespace="public", group_name="DEFAULT_GROUP", cluster_name="DEFAULT", username=None, password=None, heartbeat_interval=1, weight=1.0, ephemeral=True, register_port=26004, ) service_cfg = ServiceConfig( service_name="apbo-boat-agent", host="0.0.0.0", port=8000, ip="10.0.0.8", metadata={}, ) manager = NacosManager(nacos_cfg, service_cfg) manager.client = _CaptureClient() assert manager._registration_port() == 26004 assert manager.register_service() is True manager._send_heartbeat() manager.deregister_service() assert manager.client.register_calls[0]["port"] == 26004 assert manager.client.heartbeat_calls[0]["port"] == 26004 assert manager.client.remove_calls[0]["port"] == 26004