fix: seed outfit factory config

This commit is contained in:
2026-06-23 17:51:46 +08:00
parent cad8b61bcf
commit f033943db0
8 changed files with 233 additions and 12 deletions
+102 -1
View File
@@ -66,7 +66,10 @@ class TestOutfitConfigHelpers(unittest.TestCase):
models = cs.load_ai_models()
self.assertEqual([m["name"] for m in models], ["GPT Image 2", "Nano Banana 2"])
self.assertEqual(
[m["name"] for m in models],
["GPT Image 2", "Nano Banana 2", "GPT-5.5 文本"],
)
self.assertTrue(all(m.get("api_key") == "" for m in models))
def test_load_ai_models_seeds_missing_user_file_from_factory_template(self):
@@ -103,11 +106,85 @@ class TestOutfitConfigHelpers(unittest.TestCase):
self.assertEqual(cs.load_ai_models(), [])
self.assertFalse((self.config_dir / "ai_models.json").exists())
def test_load_ai_models_appends_missing_title_model_from_factory(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "ai_models.json").write_text(
json.dumps({
"models": [
{"name": "GPT Image 2", "api_key": ""},
{"name": "GPT-5.5 文本", "api_type": "chat", "api_key": ""},
]
}),
encoding="utf-8",
)
(self.config_dir / "ai_models.json").write_text(
json.dumps({"models": [{"name": "user", "api_key": "keep"}]}),
encoding="utf-8",
)
models = cs.load_ai_models()
self.assertEqual([m["name"] for m in models], ["user", "GPT-5.5 文本"])
self.assertEqual(models[0]["api_key"], "keep")
self.assertEqual(models[1]["api_key"], "")
saved = json.loads((self.config_dir / "ai_models.json").read_text(encoding="utf-8"))
self.assertEqual([m["name"] for m in saved["models"]], ["user", "GPT-5.5 文本"])
def test_load_ai_models_does_not_duplicate_existing_title_model(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "ai_models.json").write_text(
json.dumps({"models": [{"name": "GPT-5.5 文本", "api_key": ""}]}),
encoding="utf-8",
)
(self.config_dir / "ai_models.json").write_text(
json.dumps({"models": [{"name": "GPT-5.5 文本", "api_key": "keep"}]}),
encoding="utf-8",
)
models = cs.load_ai_models()
self.assertEqual(len(models), 1)
self.assertEqual(models[0]["api_key"], "keep")
def test_load_ai_models_factory_without_title_model_does_not_append(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "ai_models.json").write_text(
json.dumps({"models": [{"name": "other", "api_key": ""}]}),
encoding="utf-8",
)
(self.config_dir / "ai_models.json").write_text(
json.dumps({"models": [{"name": "user", "api_key": "keep"}]}),
encoding="utf-8",
)
models = cs.load_ai_models()
self.assertEqual([m["name"] for m in models], ["user"])
# -- outfit_prompt.txt ----------------------------------------------
def test_prompt_default_when_missing(self):
self.assertEqual(cs.load_outfit_prompt(), cs.DEFAULT_OUTFIT_PROMPT)
def test_prompt_seeds_missing_user_file_from_factory_template(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "outfit_prompt.txt").write_text(
"factory {title}", encoding="utf-8")
self.assertEqual(cs.load_outfit_prompt(), "factory {title}")
self.assertEqual(
(self.config_dir / "outfit_prompt.txt").read_text(encoding="utf-8"),
"factory {title}",
)
def test_prompt_does_not_overwrite_existing_user_file(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "outfit_prompt.txt").write_text(
"factory", encoding="utf-8")
(self.config_dir / "outfit_prompt.txt").write_text("user", encoding="utf-8")
self.assertEqual(cs.load_outfit_prompt(), "user")
def test_prompt_save_then_load_roundtrip(self):
cs.save_outfit_prompt("hello {title} {product_id}")
self.assertEqual(cs.load_outfit_prompt(), "hello {title} {product_id}")
@@ -160,6 +237,30 @@ class TestOutfitConfigHelpers(unittest.TestCase):
"".encode("utf-8") + json.dumps([{"name": "z", "text": "t"}]).encode("utf-8"))
self.assertEqual(cs.load_outfit_prompts()[0]["name"], "z")
# -- title_prompt.txt -----------------------------------------------
def test_title_prompt_default_when_missing(self):
self.assertEqual(cs.load_title_prompt(), cs.DEFAULT_TITLE_PROMPT)
def test_title_prompt_seeds_missing_user_file_from_factory_template(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "title_prompt.txt").write_text(
"factory title prompt", encoding="utf-8")
self.assertEqual(cs.load_title_prompt(), "factory title prompt")
self.assertEqual(
(self.config_dir / "title_prompt.txt").read_text(encoding="utf-8"),
"factory title prompt",
)
def test_title_prompt_does_not_overwrite_existing_user_file(self):
self.factory_config_dir.mkdir(parents=True, exist_ok=True)
(self.factory_config_dir / "title_prompt.txt").write_text(
"factory", encoding="utf-8")
(self.config_dir / "title_prompt.txt").write_text("user", encoding="utf-8")
self.assertEqual(cs.load_title_prompt(), "user")
if __name__ == "__main__":
unittest.main()
+18
View File
@@ -27,6 +27,10 @@ class _Base(unittest.TestCase):
(self.app / "config" / "templates.json").write_text("{}", encoding="utf-8")
(self.app / "config" / "ai_models.json").write_text(
json.dumps({"models": [{"name": "factory"}]}), encoding="utf-8")
(self.app / "config" / "outfit_prompt.txt").write_text(
"factory outfit", encoding="utf-8")
(self.app / "config" / "title_prompt.txt").write_text(
"factory title", encoding="utf-8")
self.data = self.tmp / "data"
self._prev = os.environ.get("CMBOT_DATA_DIR")
os.environ["CMBOT_DATA_DIR"] = str(self.data)
@@ -51,17 +55,31 @@ class TestSeed(_Base):
self.assertTrue((self.data / "config" / "app_config.json").exists())
self.assertTrue((self.data / "config" / "templates.json").exists())
self.assertTrue((self.data / "config" / "ai_models.json").exists())
self.assertTrue((self.data / "config" / "outfit_prompt.txt").exists())
self.assertTrue((self.data / "config" / "title_prompt.txt").exists())
def test_seed_does_not_overwrite(self):
(self.data / "config").mkdir(parents=True)
(self.data / "config" / "app_config.json").write_text('{"update_source":"USER"}', encoding="utf-8")
(self.data / "config" / "ai_models.json").write_text(
json.dumps({"models": [{"name": "user"}]}), encoding="utf-8")
(self.data / "config" / "outfit_prompt.txt").write_text(
"user outfit", encoding="utf-8")
(self.data / "config" / "title_prompt.txt").write_text(
"user title", encoding="utf-8")
launcher.seed_defaults(self.app, self.data)
kept = json.loads((self.data / "config" / "app_config.json").read_text(encoding="utf-8"))
self.assertEqual(kept["update_source"], "USER")
kept_models = json.loads((self.data / "config" / "ai_models.json").read_text(encoding="utf-8"))
self.assertEqual(kept_models["models"][0]["name"], "user")
self.assertEqual(
(self.data / "config" / "outfit_prompt.txt").read_text(encoding="utf-8"),
"user outfit",
)
self.assertEqual(
(self.data / "config" / "title_prompt.txt").read_text(encoding="utf-8"),
"user title",
)
class TestRun(_Base):