"""当前 Client 本地身份服务测试。""" import tempfile import unittest from pathlib import Path from src.current_client_service import ( CurrentClientService, load_admin_base_url, ) from src.http_admin_gateway import DEFAULT_ADMIN_BASE_URL from src.settings_repository import SettingsRepository class CurrentClientServiceTest(unittest.TestCase): def setUp(self): self.temp_directory = tempfile.TemporaryDirectory() path = Path(self.temp_directory.name) / "client.db" self.repository = SettingsRepository(path) self.generated_count = 0 def generate_id(): self.generated_count += 1 return f"CLIENT-GENERATED-{self.generated_count}" self.service = CurrentClientService(self.repository, generate_id) def tearDown(self): self.temp_directory.cleanup() def test_first_save_generates_id_and_later_save_reuses_it(self): first = self.service.save(" 办公室电脑 ") second = self.service.save("仓库电脑") self.assertEqual(first.client_id, "CLIENT-GENERATED-1") self.assertEqual(second.client_id, first.client_id) self.assertEqual(second.client_name, "仓库电脑") self.assertEqual(self.generated_count, 1) self.assertEqual(self.service.load(), second) def test_empty_name_is_allowed_but_more_than_50_chars_is_rejected(self): saved = self.service.save(" ") self.assertEqual(saved.client_name, "") with self.assertRaisesRegex(ValueError, "最多 50"): self.service.save("测" * 51) self.assertEqual(self.service.load(), saved) def test_non_string_corrupted_values_are_treated_as_missing(self): self.repository.set("admin.client_id", {"bad": "value"}) self.repository.set("admin.client_name", 123) saved = self.service.save("新设备") self.assertEqual(saved.client_id, "CLIENT-GENERATED-1") self.assertEqual(saved.client_name, "新设备") def test_missing_admin_base_url_is_saved_as_current_default(self): self.assertEqual( load_admin_base_url(self.repository), DEFAULT_ADMIN_BASE_URL, ) self.assertEqual( self.repository.get("admin.base_url"), DEFAULT_ADMIN_BASE_URL, ) def test_legacy_admin_base_url_is_migrated(self): self.repository.set("admin.base_url", "http://127.0.0.1:8080/") self.assertEqual( load_admin_base_url(self.repository), DEFAULT_ADMIN_BASE_URL, ) self.assertEqual( self.repository.get("admin.base_url"), DEFAULT_ADMIN_BASE_URL, ) def test_custom_admin_base_url_is_preserved(self): custom_url = "https://admin.example.com/service/" self.repository.set("admin.base_url", custom_url) self.assertEqual( load_admin_base_url(self.repository), "https://admin.example.com/service", ) self.assertEqual( self.repository.get("admin.base_url"), custom_url, ) if __name__ == "__main__": unittest.main()