Turn position/margin/sizing/direction env fields into dropdown selects.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-17 19:41:47 +08:00
parent 53e55aa4b4
commit aabbbef0a9
5 changed files with 150 additions and 10 deletions
@@ -59,6 +59,39 @@ class TestEnvSchema(unittest.TestCase):
clean, errors = validate_env_updates(groups, {"B": "1"})
self.assertTrue(errors)
def test_select_fields_and_validate(self):
from lib.env.env_schema import SELECT_OPTIONS, normalize_select_value, select_options_for
from lib.env.env_ui_manifest import build_env_ui_payload
self.assertEqual(normalize_select_value("BINANCE_MARGIN_MODE", "cross_margin"), "cross")
opts = select_options_for("TRADE_DIRECTION")
self.assertEqual({o["value"] for o in opts}, {"both", "long_only", "short_only"})
for key in (
"OKX_TD_MODE",
"OKX_POS_MODE",
"POSITION_SIZING_MODE",
"TRADE_DIRECTION",
):
self.assertIn(key, SELECT_OPTIONS)
root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
example = os.path.join(root, "crypto_monitor_okx", ".env.example")
env_path = os.path.join(root, "crypto_monitor_okx", ".env")
if not os.path.isfile(example):
self.skipTest("missing okx .env.example")
groups = build_env_ui_payload("okx", example, env_path if os.path.isfile(env_path) else example)
by_key = {f["key"]: f for g in groups for f in g["fields"]}
for key in ("OKX_TD_MODE", "OKX_POS_MODE", "POSITION_SIZING_MODE", "TRADE_DIRECTION"):
self.assertEqual(by_key[key]["type"], "select")
self.assertTrue(by_key[key]["options"])
groups_v = [{"title": "t", "fields": [by_key["TRADE_DIRECTION"]]}]
clean, errors = validate_env_updates(groups_v, {"TRADE_DIRECTION": "long_only"})
self.assertEqual(errors, [])
self.assertEqual(clean["TRADE_DIRECTION"], "long_only")
_, bad = validate_env_updates(groups_v, {"TRADE_DIRECTION": "sideways"})
self.assertTrue(bad)
if __name__ == "__main__":
unittest.main()