Blame view

tests/test_translator_failure_semantics.py 3.9 KB
cd4ce66d   tangwang   trans logs
1
2
  from translation.cache import TranslationCache
  from translation.service import TranslationService
a7bb846c   tangwang   monitor
3
4
  
  
cd4ce66d   tangwang   trans logs
5
  class _FakeCache:
a7bb846c   tangwang   monitor
6
      def __init__(self):
cd4ce66d   tangwang   trans logs
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
          self.available = True
          self.storage = {}
          self.get_calls = []
          self.set_calls = []
  
      def get(self, *, model, target_lang, source_text):
          self.get_calls.append((model, target_lang, source_text))
          return self.storage.get((model, target_lang, source_text))
  
      def set(self, *, model, target_lang, source_text, translated_text):
          self.set_calls.append((model, target_lang, source_text, translated_text))
          self.storage[(model, target_lang, source_text)] = translated_text
  
  
  def test_translation_cache_key_format(monkeypatch):
      monkeypatch.setattr(TranslationCache, "_init_redis_client", staticmethod(lambda: None))
      cache = TranslationCache({"ttl_seconds": 60, "sliding_expiration": True})
      key = cache.build_key(model="llm", target_lang="en", source_text="商品标题")
      assert key.startswith("trans:llm:en:商品标题")
      assert len(key) == len("trans:llm:en:商品标题") + 64
  
  
  def test_service_caches_all_capabilities(monkeypatch):
      monkeypatch.setattr(TranslationCache, "_init_redis_client", staticmethod(lambda: None))
      created = {}
  
      def _fake_create_backend(self, *, name, backend_type, cfg):
          del self, backend_type, cfg
  
          class _Backend:
              model = name
  
              @property
              def supports_batch(self):
                  return True
  
              def translate(self, text, target_lang, source_lang=None, scene=None):
                  del target_lang, source_lang, scene
                  if isinstance(text, list):
                      return [f"{name}:{item}" for item in text]
                  return f"{name}:{text}"
  
          backend = _Backend()
          created[name] = backend
          return backend
  
      monkeypatch.setattr(TranslationService, "_create_backend", _fake_create_backend)
      config = {
          "service_url": "http://127.0.0.1:6006",
          "timeout_sec": 10.0,
          "default_model": "llm",
          "default_scene": "general",
          "capabilities": {
              "llm": {
                  "enabled": True,
                  "backend": "llm",
                  "model": "dummy-llm",
                  "base_url": "https://example.com",
                  "timeout_sec": 10.0,
                  "use_cache": True,
              },
              "opus-mt-zh-en": {
                  "enabled": True,
                  "backend": "local_marian",
                  "model_id": "dummy",
                  "model_dir": "dummy",
                  "device": "cpu",
                  "torch_dtype": "float32",
                  "batch_size": 8,
                  "max_input_length": 16,
                  "max_new_tokens": 16,
                  "num_beams": 1,
                  "use_cache": True,
              },
          },
          "cache": {
              "ttl_seconds": 60,
              "sliding_expiration": True,
          },
      }
  
      service = TranslationService(config)
      fake_cache = _FakeCache()
      service._translation_cache = fake_cache
  
      first = service.translate("商品标题", target_lang="en", source_lang="zh", model="llm")
      second = service.translate("商品标题", target_lang="en", source_lang="zh", model="llm")
      batch = service.translate(["连衣裙", "衬衫"], target_lang="en", source_lang="zh", model="opus-mt-zh-en")
  
      assert first == "llm:商品标题"
      assert second == "llm:商品标题"
      assert batch == ["opus-mt-zh-en:连衣裙", "opus-mt-zh-en:衬衫"]
      assert fake_cache.get_calls == [
          ("llm", "en", "商品标题"),
          ("llm", "en", "商品标题"),
          ("opus-mt-zh-en", "en", "连衣裙"),
          ("opus-mt-zh-en", "en", "衬衫"),
      ]
      assert fake_cache.set_calls == [
          ("llm", "en", "商品标题", "llm:商品标题"),
          ("opus-mt-zh-en", "en", "连衣裙", "opus-mt-zh-en:连衣裙"),
          ("opus-mt-zh-en", "en", "衬衫", "opus-mt-zh-en:衬衫"),
      ]