작업 내용 저장
This commit is contained in:
@@ -143,6 +143,20 @@ class FakeRepo:
|
||||
raise ValueError("토큰을 찾을 수 없습니다")
|
||||
token.revoked_at = datetime.now(timezone.utc)
|
||||
|
||||
def list_service_tokens(
|
||||
self,
|
||||
user_id: str | None = None,
|
||||
*,
|
||||
include_revoked: bool = False,
|
||||
) -> list[AuthToken]:
|
||||
results = [
|
||||
t for t in self._auth_tokens.values()
|
||||
if t.token_type == "service"
|
||||
and (user_id is None or t.user_id == user_id)
|
||||
and (include_revoked or t.revoked_at is None)
|
||||
]
|
||||
return sorted(results, key=lambda t: t.created_at or datetime.min, reverse=True)
|
||||
|
||||
def get(self, portfolio_id: str) -> Portfolio:
|
||||
if self._portfolio is None or self._portfolio.portfolio_id != portfolio_id:
|
||||
raise ValueError("포트폴리오를 찾을 수 없습니다")
|
||||
@@ -906,3 +920,125 @@ def test_cli_service_token_revoke_force_succeeds() -> None:
|
||||
payload = json.loads(result.stdout)
|
||||
assert payload["name"] == "to-revoke"
|
||||
assert payload["revoked"] is True
|
||||
|
||||
|
||||
def test_cli_service_token_list_returns_active_tokens() -> None:
|
||||
repo = FakeRepo(_portfolio())
|
||||
user = repo.create_user("alice", permission="read")
|
||||
repo.create_auth_token(
|
||||
user.id,
|
||||
name="active-token",
|
||||
token_hash=hash_token("tok-1"),
|
||||
token_prefix=token_prefix("tok-1"),
|
||||
permission="read",
|
||||
token_type="service",
|
||||
)
|
||||
runner = build_runner(repo)
|
||||
|
||||
result = runner.invoke(runner.app, ["--format", "json", "service-token", "list"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
payload = json.loads(result.stdout)
|
||||
assert isinstance(payload, list)
|
||||
assert len(payload) == 1
|
||||
assert payload[0]["name"] == "active-token"
|
||||
|
||||
|
||||
def test_cli_service_token_list_excludes_revoked_by_default() -> None:
|
||||
repo = FakeRepo(_portfolio())
|
||||
user = repo.create_user("alice", permission="read")
|
||||
token = repo.create_auth_token(
|
||||
user.id,
|
||||
name="old-token",
|
||||
token_hash=hash_token("tok-2"),
|
||||
token_prefix=token_prefix("tok-2"),
|
||||
permission="read",
|
||||
token_type="service",
|
||||
)
|
||||
repo.revoke_auth_token(user.id, token.id)
|
||||
runner = build_runner(repo)
|
||||
|
||||
result = runner.invoke(runner.app, ["--format", "json", "service-token", "list"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
payload = json.loads(result.stdout)
|
||||
assert payload == []
|
||||
|
||||
|
||||
def test_cli_service_token_list_show_revoked_includes_revoked() -> None:
|
||||
repo = FakeRepo(_portfolio())
|
||||
user = repo.create_user("alice", permission="read")
|
||||
token = repo.create_auth_token(
|
||||
user.id,
|
||||
name="old-token",
|
||||
token_hash=hash_token("tok-3"),
|
||||
token_prefix=token_prefix("tok-3"),
|
||||
permission="read",
|
||||
token_type="service",
|
||||
)
|
||||
repo.revoke_auth_token(user.id, token.id)
|
||||
runner = build_runner(repo)
|
||||
|
||||
result = runner.invoke(
|
||||
runner.app, ["--format", "json", "service-token", "list", "--show-revoked"]
|
||||
)
|
||||
|
||||
assert result.exit_code == 0
|
||||
payload = json.loads(result.stdout)
|
||||
assert len(payload) == 1
|
||||
assert payload[0]["name"] == "old-token"
|
||||
assert payload[0]["revoked_at"] is not None
|
||||
|
||||
|
||||
def test_cli_service_token_list_filter_by_user() -> None:
|
||||
repo = FakeRepo(_portfolio())
|
||||
alice = repo.create_user("alice", permission="read")
|
||||
bob = repo.create_user("bob", permission="read")
|
||||
repo.create_auth_token(
|
||||
alice.id,
|
||||
name="alice-token",
|
||||
token_hash=hash_token("tok-a"),
|
||||
token_prefix=token_prefix("tok-a"),
|
||||
permission="read",
|
||||
token_type="service",
|
||||
)
|
||||
repo.create_auth_token(
|
||||
bob.id,
|
||||
name="bob-token",
|
||||
token_hash=hash_token("tok-b"),
|
||||
token_prefix=token_prefix("tok-b"),
|
||||
permission="read",
|
||||
token_type="service",
|
||||
)
|
||||
runner = build_runner(repo)
|
||||
|
||||
result = runner.invoke(
|
||||
runner.app, ["--format", "json", "service-token", "list", "--user", "alice"]
|
||||
)
|
||||
|
||||
assert result.exit_code == 0
|
||||
payload = json.loads(result.stdout)
|
||||
assert len(payload) == 1
|
||||
assert payload[0]["name"] == "alice-token"
|
||||
|
||||
|
||||
def test_cli_service_token_list_unknown_user_exits_error() -> None:
|
||||
repo = FakeRepo(_portfolio())
|
||||
runner = build_runner(repo)
|
||||
|
||||
result = runner.invoke(
|
||||
runner.app, ["service-token", "list", "--user", "nobody"]
|
||||
)
|
||||
|
||||
assert result.exit_code == 1
|
||||
assert "nobody" in result.stdout
|
||||
|
||||
|
||||
def test_cli_service_token_list_empty_message() -> None:
|
||||
repo = FakeRepo(_portfolio())
|
||||
runner = build_runner(repo)
|
||||
|
||||
result = runner.invoke(runner.app, ["service-token", "list"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "No service tokens found." in result.stdout
|
||||
|
||||
Reference in New Issue
Block a user