from hookvision.config_loader import load_config from hookvision.models import ModuleType, CameraPosition class TestLoadConfig: def test_load_rfid_config(self, sample_config_path): config = load_config(sample_config_path) assert config.app_name == "测试系统" assert config.module_type == ModuleType.RFID assert config.rfid is not None assert config.rfid.ip == "192.168.1.1" assert config.rfid.port == 60000 assert config.modbus is None assert config.ai.enabled is False def test_load_buckets(self, sample_config_path): config = load_config(sample_config_path) assert len(config.buckets) == 1 bucket = config.buckets[0] assert bucket.id == 1 assert bucket.description == "测试工位" assert bucket.code_x == "TEST001" assert len(bucket.cameras) == 2 def test_load_cameras(self, sample_config_path): config = load_config(sample_config_path) bucket = config.buckets[0] left = next(c for c in bucket.cameras if c.position == CameraPosition.LEFT) right = next(c for c in bucket.cameras if c.position == CameraPosition.RIGHT) assert left.rtsp_url == "rtsp://test:test@192.168.1.10:554/stream1" assert left.topic == "test/left" assert right.rtsp_url == "rtsp://test:test@192.168.1.11:554/stream2" assert right.topic == "test/right" def test_load_video_config(self, sample_config_path): config = load_config(sample_config_path) assert config.video.rtsp_timeout == 5.0 def test_config_file_not_exists(self, tmp_path): from configparser import NoSectionError path = tmp_path / "nonexistent.ini" import pytest with pytest.raises(NoSectionError): load_config(str(path)) def _write_ai_config(path, extra_ai_lines=""): path.write_text( f"""[App] name = 测试系统 copyright = 测试 screen = 0 [Video] rtsp_timeout = 5 [Hardware] module_type = RFID [RFID] ip = 192.168.1.1 port = 60000 stability_time = 5 stability_count = 3 [AI] enabled = true {extra_ai_lines} """, encoding="utf-8" ) class TestAutoCalibConfig: def test_missing_keys_use_defaults(self, tmp_path): path = tmp_path / "config.ini" _write_ai_config(path) config = load_config(str(path)) assert config.ai.auto_calib_ready_frames == 3 assert config.ai.auto_calib_duration_secs == 1.0 assert config.ai.auto_calib_min_samples == 2 def test_custom_values_loaded(self, tmp_path): path = tmp_path / "config.ini" _write_ai_config( path, "auto_calib_ready_frames = 10\n" "auto_calib_duration_secs = 2.5\n" "auto_calib_min_samples = 4\n", ) config = load_config(str(path)) assert config.ai.auto_calib_ready_frames == 10 assert config.ai.auto_calib_duration_secs == 2.5 assert config.ai.auto_calib_min_samples == 4 def test_missing_keys_auto_initialized(self, tmp_path): path = tmp_path / "config.ini" _write_ai_config(path) load_config(str(path)) text = path.read_text(encoding="utf-8") assert "auto_calib_ready_frames = 3" in text assert "auto_calib_duration_secs = 1.0" in text assert "auto_calib_min_samples = 2" in text reloaded = load_config(str(path)) assert reloaded.ai.auto_calib_ready_frames == 3 assert reloaded.ai.auto_calib_duration_secs == 1.0 assert reloaded.ai.auto_calib_min_samples == 2 def test_existing_custom_keys_not_overwritten(self, tmp_path): path = tmp_path / "config.ini" _write_ai_config(path, "auto_calib_ready_frames = 7\n") load_config(str(path)) text = path.read_text(encoding="utf-8") assert "auto_calib_ready_frames = 7" in text assert "auto_calib_duration_secs = 1.0" in text