119 lines
3.9 KiB
Python
119 lines
3.9 KiB
Python
import os
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
|
|
|
|
from app import cmhub_models
|
|
|
|
|
|
class CMHubModelDisplayTests(unittest.TestCase):
|
|
def tearDown(self):
|
|
cmhub_models.clear_model_catalog_cache()
|
|
|
|
def test_alias_label_prefers_display_name_tier_and_points(self):
|
|
label = cmhub_models.alias_label(
|
|
{
|
|
"alias": "image-hq",
|
|
"display_name": "商品图高质量",
|
|
"operation_type": "image",
|
|
"tier": "high_quality",
|
|
"requires_image": True,
|
|
"prices": [{"resolution": "1K", "points_cost": 5}],
|
|
}
|
|
)
|
|
|
|
self.assertIn("高质量档", label)
|
|
self.assertIn("商品图高质量", label)
|
|
self.assertIn("1K:5点", label)
|
|
self.assertIn("需参考图", label)
|
|
self.assertNotIn("OpenAI", label)
|
|
|
|
def test_tier_detection_uses_tags_and_safe_default(self):
|
|
self.assertEqual(
|
|
cmhub_models.TIER_ECONOMICAL,
|
|
cmhub_models.model_tier({"alias": "draft", "tags": ["high-volume", "low-cost"]}),
|
|
)
|
|
self.assertEqual(
|
|
cmhub_models.TIER_HIGH_QUALITY,
|
|
cmhub_models.model_tier({"alias": "image-hd"}),
|
|
)
|
|
self.assertEqual(cmhub_models.TIER_DEFAULT, cmhub_models.model_tier({"alias": "image"}))
|
|
|
|
def test_configured_alias_summary_is_user_facing(self):
|
|
summary = cmhub_models.configured_alias_summary("image-hd")
|
|
|
|
self.assertIn("cmhub 托管高质量档", summary)
|
|
self.assertIn("生图别名 image-hd", summary)
|
|
self.assertIn("扣点以返回结果为准", summary)
|
|
|
|
def test_catalog_price_only_accepts_one_unconditional_matching_vision_model(self):
|
|
models = [
|
|
{
|
|
"alias": "vision-standard",
|
|
"operation_type": "vision",
|
|
"requires_image": True,
|
|
"pricing_status": "priced",
|
|
"prices": [{"points_cost": 2}],
|
|
}
|
|
]
|
|
|
|
cmhub_models.cache_model_catalog("https://CMHUB.example.com/", models, now=100)
|
|
cached = cmhub_models.cached_model_catalog(
|
|
"https://cmhub.example.com",
|
|
"vision-standard",
|
|
now=120,
|
|
)
|
|
|
|
self.assertEqual("2", cmhub_models.format_points_cost(
|
|
cmhub_models.unambiguous_points_cost(
|
|
cached,
|
|
"vision-standard",
|
|
"vision",
|
|
requires_image=True,
|
|
)
|
|
))
|
|
|
|
def test_catalog_price_rejects_conditional_missing_or_ambiguous_prices(self):
|
|
base = {
|
|
"alias": "vision-standard",
|
|
"operation_type": "vision",
|
|
"requires_image": True,
|
|
"pricing_status": "priced",
|
|
}
|
|
cases = [
|
|
dict(base, prices=[{"resolution": "1K", "points_cost": 2}]),
|
|
dict(base, prices=[{"points_cost": 2}, {"points_cost": 3}]),
|
|
dict(base, pricing_status="unpriced", prices=[{"points_cost": 2}]),
|
|
dict(base, requires_image=False, prices=[{"points_cost": 2}]),
|
|
dict(base, prices=[{}]),
|
|
]
|
|
for model in cases:
|
|
with self.subTest(model=model):
|
|
self.assertIsNone(
|
|
cmhub_models.unambiguous_points_cost(
|
|
[model],
|
|
"vision-standard",
|
|
"vision",
|
|
requires_image=True,
|
|
)
|
|
)
|
|
|
|
cmhub_models.cache_model_catalog(
|
|
"https://cmhub.example.com",
|
|
[dict(base, prices=[{"points_cost": 2}])],
|
|
now=100,
|
|
)
|
|
self.assertIsNone(
|
|
cmhub_models.cached_model_catalog(
|
|
"https://cmhub.example.com",
|
|
"vision-standard",
|
|
max_age_seconds=20,
|
|
now=121,
|
|
)
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|