import unittest from pdf2zh.translator import BaseTranslator from pdf2zh.translator import OpenAIlikedTranslator from pdf2zh import cache from pdf2zh.config import ConfigManager class AutoIncreaseTranslator(BaseTranslator): name = "auto_increase" n = 0 def do_translate(self, text): self.n += 1 return str(self.n) class TestTranslator(unittest.TestCase): def setUp(self): self.test_db = cache.init_test_db() def tearDown(self): cache.clean_test_db(self.test_db) def test_cache(self): translator = AutoIncreaseTranslator("en", "zh", "test") # First translation should be cached text = "Hello World" first_result = translator.translate(text) # Second translation should return the same result from cache second_result = translator.translate(text) self.assertEqual(first_result, second_result) # Different input should give different result different_text = "Different Text" different_result = translator.translate(different_text) self.assertNotEqual(first_result, different_result) # Test cache with ignore_cache=True translator.ignore_cache = True no_cache_result = translator.translate(text) self.assertNotEqual(first_result, no_cache_result) def test_add_cache_impact_parameters(self): translator = AutoIncreaseTranslator("en", "zh", "test") # Test cache with added parameters text = "Hello World" first_result = translator.translate(text) translator.add_cache_impact_parameters("test", "value") second_result = translator.translate(text) self.assertNotEqual(first_result, second_result) # Test cache with ignore_cache=True no_cache_result1 = translator.translate(text, ignore_cache=True) self.assertNotEqual(first_result, no_cache_result1) translator.ignore_cache = True no_cache_result2 = translator.translate(text) self.assertNotEqual(no_cache_result1, no_cache_result2) # Test cache with ignore_cache=False translator.ignore_cache = False cache_result = translator.translate(text) self.assertEqual(no_cache_result2, cache_result) # Test cache with another parameter translator.add_cache_impact_parameters("test2", "value2") another_result = translator.translate(text) self.assertNotEqual(second_result, another_result) def test_base_translator_throw(self): translator = BaseTranslator("en", "zh", "test") with self.assertRaises(NotImplementedError): translator.translate("Hello World") class TestOpenAIlikedTranslator(unittest.TestCase): def setUp(self) -> None: self.default_envs = { "OPENAILIKED_BASE_URL": "https://api.openailiked.com", "OPENAILIKED_API_KEY": "test_api_key", "OPENAILIKED_MODEL": "test_model", } def test_missing_base_url_raises_error(self): """测试缺失 OPENAILIKED_BASE_URL 时抛出异常""" ConfigManager.clear() with self.assertRaises(ValueError) as context: OpenAIlikedTranslator( lang_in="en", lang_out="zh", model="test_model", envs={} ) self.assertIn("The OPENAILIKED_BASE_URL is missing.", str(context.exception)) def test_missing_model_raises_error(self): """测试缺失 OPENAILIKED_MODEL 时抛出异常""" envs_without_model = { "OPENAILIKED_BASE_URL": "https://api.openailiked.com", "OPENAILIKED_API_KEY": "test_api_key", } ConfigManager.clear() with self.assertRaises(ValueError) as context: OpenAIlikedTranslator( lang_in="en", lang_out="zh", model=None, envs=envs_without_model ) self.assertIn("The OPENAILIKED_MODEL is missing.", str(context.exception)) def test_initialization_with_valid_envs(self): """测试使用有效的环境变量初始化""" ConfigManager.clear() translator = OpenAIlikedTranslator( lang_in="en", lang_out="zh", model=None, envs=self.default_envs, ) self.assertEqual( translator.envs["OPENAILIKED_BASE_URL"], self.default_envs["OPENAILIKED_BASE_URL"], ) self.assertEqual( translator.envs["OPENAILIKED_API_KEY"], self.default_envs["OPENAILIKED_API_KEY"], ) self.assertEqual(translator.model, self.default_envs["OPENAILIKED_MODEL"]) def test_default_api_key_fallback(self): """测试当 OPENAILIKED_API_KEY 为空时使用默认值""" envs_without_key = { "OPENAILIKED_BASE_URL": "https://api.openailiked.com", "OPENAILIKED_MODEL": "test_model", } ConfigManager.clear() translator = OpenAIlikedTranslator( lang_in="en", lang_out="zh", model=None, envs=envs_without_key, ) self.assertEqual( translator.envs["OPENAILIKED_BASE_URL"], self.default_envs["OPENAILIKED_BASE_URL"], ) self.assertEqual(translator.envs["OPENAILIKED_API_KEY"], None) if __name__ == "__main__": unittest.main()