fix(portfolio): name 검증에 한글+공백 허용 (minor-change, CHG-20260627-03)

_PORTFOLIO_NAME_RE + CLI _NAME_RE를 ^[a-zA-Z0-9가-힣 ._:-]{1,100}$로 완화. name은 (owner,name) 조회 키일 뿐 wire 식별자 아님. 475 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
This commit is contained in:
2026-06-27 12:03:33 +09:00
co-authored by Claude Opus 4.8
parent 853a9bdab8
commit 233cbc3df6
5 changed files with 74 additions and 4 deletions
+42
View File
@@ -563,6 +563,48 @@ def test_alice_cannot_delete_bobs_portfolio() -> None:
assert len(repo._portfolios) == 1, "Bob's portfolio must not be deleted"
# ---------------------------------------------------------------------------
# name 검증: 한글 허용 (change-req CHG-20260627-03 in REQ-025)
# ---------------------------------------------------------------------------
def test_name_validation_accepts_korean() -> None:
"""한글 이름이 포함된 포트폴리오를 허용한다."""
repo = FakeRepo()
repo.create_user("alice", permission="read")
runner = build_runner(repo)
result = runner.invoke(
runner.app,
["portfolio", "create", "삼성전자 포트폴리오", "--asset-id", _TEST_ASSET_ID, "--user", "alice", "--force"],
)
assert result.exit_code == 0, result.output
def test_name_validation_accepts_ascii_unchanged() -> None:
"""기존 ASCII name은 완화 후에도 통과한다."""
repo = FakeRepo()
repo.create_user("alice", permission="read")
runner = build_runner(repo)
result = runner.invoke(
runner.app,
["portfolio", "create", "my-portfolio_v1:test.01", "--asset-id", _TEST_ASSET_ID, "--user", "alice", "--force"],
)
assert result.exit_code == 0, result.output
def test_name_validation_rejects_over_100_chars() -> None:
"""101자 초과 이름은 거부한다."""
from app.schemas.portfolio import CreatePortfolioRequest
import pytest
long_name = "가" * 101
with pytest.raises(Exception):
CreatePortfolioRequest(name=long_name, asset_id="some-uuid")
def test_update_new_name_renames_portfolio() -> None:
repo = FakeRepo()
repo.create_user("alice", permission="read")