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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user