fix: seed outfit factory config
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user