chore(release): harden nick contract for v0.1.2

This commit is contained in:
2026-08-15 23:46:57 +09:00
parent e6a90800ec
commit c292df0a4b
8 changed files with 97 additions and 22 deletions
+48
View File
@@ -194,6 +194,36 @@ def test_admin_create_custom_nick_and_patch_nick_only_preserve_id_and_increment_
assert repo.strategies[strategy_id].nick == "mom-primary"
def test_admin_create_trims_nick() -> None:
repo = FakeStrategyRepo()
with _repos(repo):
created = _client().post(
"/v1/admin/strategies",
json={"name": "momentum", "nick": " mom-20 ", "config": {"window": 20}},
headers=_auth("admin-token"),
)
assert created.status_code == 201
assert created.json()["nick"] == "mom-20"
def test_admin_create_and_patch_reject_whitespace_only_nick() -> None:
repo = FakeStrategyRepo()
with _repos(repo):
created = _client().post(
"/v1/admin/strategies",
json={"name": "momentum", "nick": " \t ", "config": {"window": 20}},
headers=_auth("admin-token"),
)
changed = _client().patch(
"/v1/admin/strategies/active-1",
json={"nick": " \n "},
headers=_auth("admin-token"),
)
assert created.status_code == 422
assert changed.status_code == 422
assert repo.strategies["active-1"].nick == "target_value:base"
def test_admin_patch_omitting_nick_preserves_custom_nick_when_name_and_config_change() -> None:
repo = FakeStrategyRepo()
with _repos(repo):
@@ -227,6 +257,24 @@ def test_admin_create_omitting_nick_retains_legacy_generated_value() -> None:
assert created.json()["nick"] == expected
def test_admin_create_and_patch_accept_explicit_null_nick() -> None:
repo = FakeStrategyRepo()
with _repos(repo):
created = _client().post(
"/v1/admin/strategies",
json={"name": "legacy-null", "nick": None, "config": {}},
headers=_auth("admin-token"),
)
changed = _client().patch(
"/v1/admin/strategies/active-1",
json={"nick": None},
headers=_auth("admin-token"),
)
assert created.status_code == 201
assert changed.status_code == 200
assert repo.strategies["active-1"].nick == "target_value:base"
def test_admin_duplicate_nick_returns_conflict() -> None:
repo = FakeStrategyRepo()
with _repos(repo):