All checks were successful
Publish Python Package to Gitea / publish (push) Successful in 17s
Co-authored-by: Cursor <cursoragent@cursor.com>
108 lines
4.0 KiB
Python
108 lines
4.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""config 三级优先级与 ensure_env_file 测试。"""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
|
|
from jiangchang_skill_core import config
|
|
|
|
|
|
class TestConfig(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
config.reset_cache()
|
|
self._saved_env = dict(os.environ)
|
|
|
|
def tearDown(self) -> None:
|
|
os.environ.clear()
|
|
os.environ.update(self._saved_env)
|
|
config.reset_cache()
|
|
|
|
def test_ensure_env_file_copies_once(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
example = os.path.join(tmp, ".env.example")
|
|
with open(example, "w", encoding="utf-8") as f:
|
|
f.write("FOO=from_example\nBAR=2\n")
|
|
|
|
os.environ["JIANGCHANG_DATA_ROOT"] = tmp
|
|
os.environ["JIANGCHANG_USER_ID"] = "testuser"
|
|
|
|
dest = config.ensure_env_file("demo-skill", example)
|
|
self.assertTrue(os.path.isfile(dest))
|
|
with open(dest, encoding="utf-8") as f:
|
|
content = f.read()
|
|
self.assertIn("FOO=from_example", content)
|
|
|
|
with open(dest, "w", encoding="utf-8") as f:
|
|
f.write("FOO=user_edited\n")
|
|
|
|
dest2 = config.ensure_env_file("demo-skill", example)
|
|
self.assertEqual(dest, dest2)
|
|
with open(dest2, encoding="utf-8") as f:
|
|
self.assertIn("user_edited", f.read())
|
|
|
|
def test_three_level_priority(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
example = os.path.join(tmp, ".env.example")
|
|
with open(example, "w", encoding="utf-8") as f:
|
|
f.write("KEY_A=example\nKEY_B=example\nKEY_C=example\n")
|
|
|
|
os.environ["JIANGCHANG_DATA_ROOT"] = tmp
|
|
os.environ["JIANGCHANG_USER_ID"] = "u1"
|
|
dest = config.ensure_env_file("sk", example)
|
|
|
|
with open(dest, "w", encoding="utf-8") as f:
|
|
f.write("KEY_B=user_env\n")
|
|
|
|
config.reset_cache()
|
|
self.assertEqual(config.get("KEY_A"), "example")
|
|
self.assertEqual(config.get("KEY_B"), "user_env")
|
|
self.assertEqual(config.get("KEY_C"), "example")
|
|
self.assertIsNone(config.get("MISSING"))
|
|
|
|
os.environ["KEY_C"] = "process_env"
|
|
self.assertEqual(config.get("KEY_C"), "process_env")
|
|
|
|
def test_get_bool_float_int(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
example = os.path.join(tmp, ".env.example")
|
|
with open(example, "w", encoding="utf-8") as f:
|
|
f.write("FLAG=1\nRATE=2.5\nCOUNT=42\nBAD=x\n")
|
|
|
|
os.environ["JIANGCHANG_DATA_ROOT"] = tmp
|
|
os.environ["JIANGCHANG_USER_ID"] = "u1"
|
|
config.ensure_env_file("sk", example)
|
|
|
|
self.assertTrue(config.get_bool("FLAG"))
|
|
self.assertFalse(config.get_bool("MISSING", default=False))
|
|
self.assertAlmostEqual(config.get_float("RATE", 0.0), 2.5)
|
|
self.assertEqual(config.get_int("COUNT", 0), 42)
|
|
self.assertEqual(config.get_float("BAD", 9.9), 9.9)
|
|
self.assertEqual(config.get_int("BAD", 7), 7)
|
|
|
|
def test_merge_missing_env_keys_appends_only_new(self) -> None:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
example = os.path.join(tmp, ".env.example")
|
|
dest = os.path.join(tmp, ".env")
|
|
with open(example, "w", encoding="utf-8") as f:
|
|
f.write("EXISTING=1\nNEW_KEY=abc\n")
|
|
with open(dest, "w", encoding="utf-8") as f:
|
|
f.write("EXISTING=keep\n")
|
|
|
|
added = config.merge_missing_env_keys(
|
|
example,
|
|
dest,
|
|
comment_skill="demo-skill",
|
|
)
|
|
self.assertEqual(added, ["NEW_KEY"])
|
|
with open(dest, encoding="utf-8") as f:
|
|
content = f.read()
|
|
self.assertIn("EXISTING=keep", content)
|
|
self.assertIn("NEW_KEY=abc", content)
|
|
self.assertIn("Added by demo-skill", content)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|