переименовывание аккаунтов админом
This commit is contained in:
@@ -5,10 +5,16 @@ from typing import Any
|
||||
|
||||
from sqlmodel import Session, select
|
||||
|
||||
from app.core.errors import InvalidCredentialsError, NotFoundError, ValidationError
|
||||
from app.core.errors import (
|
||||
InvalidCredentialsError,
|
||||
NicknameTakenError,
|
||||
NotFoundError,
|
||||
ValidationError,
|
||||
)
|
||||
from app.core.security import verify_password
|
||||
from app.core.timeutil import iso_utc
|
||||
from app.models import AuditLog, Faction, Group, Match, MatchParticipant, User
|
||||
from app.services import user_service
|
||||
|
||||
|
||||
def authenticate_admin(session: Session, username: str, password: str) -> User:
|
||||
@@ -39,7 +45,14 @@ def update_user(session: Session, user_id: int, *, nickname: str | None = None,
|
||||
if user is None:
|
||||
raise NotFoundError("Пользователь не найден.")
|
||||
if nickname is not None:
|
||||
user.nickname = nickname.strip()
|
||||
nickname = nickname.strip()
|
||||
# Та же валидация, что и для самостоятельной смены ника игроком:
|
||||
# корректный формат и уникальность (иначе занятый ник упал бы в 500).
|
||||
if not user_service.nickname_format_ok(nickname):
|
||||
raise ValidationError("Ник: 2–64 символа, буквы/цифры/пробел/.-_")
|
||||
if not user_service.nickname_available(session, nickname, exclude_user_id=user_id):
|
||||
raise NicknameTakenError()
|
||||
user.nickname = nickname
|
||||
if is_active is not None:
|
||||
user.is_active = is_active
|
||||
session.add(user)
|
||||
|
||||
@@ -106,6 +106,29 @@ def test_admin_edit_match_and_filters(client: TestClient, make_admin):
|
||||
assert bp["faction_name"] == "Хаоситы"
|
||||
|
||||
|
||||
def test_admin_rename_account(client: TestClient, make_admin):
|
||||
"""Админ переименовывает аккаунт: валидируется формат и уникальность ника."""
|
||||
a = login(client, "Старое")
|
||||
client.post("/api/auth/dev/users", json={"nickname": "Занятое"}, headers=csrf_headers(client))
|
||||
_admin_login(client, make_admin)
|
||||
|
||||
r = client.patch(
|
||||
f"/api/admin/users/{a['id']}", json={"nickname": "Новое"}, headers=csrf_headers(client)
|
||||
)
|
||||
assert r.status_code == 200, r.text
|
||||
assert r.json()["nickname"] == "Новое"
|
||||
|
||||
# Занятый ник → 409, некорректный формат → 422.
|
||||
r = client.patch(
|
||||
f"/api/admin/users/{a['id']}", json={"nickname": "Занятое"}, headers=csrf_headers(client)
|
||||
)
|
||||
assert r.status_code == 409 and r.json()["error"]["code"] == "NICKNAME_TAKEN", r.text
|
||||
r = client.patch(
|
||||
f"/api/admin/users/{a['id']}", json={"nickname": "x"}, headers=csrf_headers(client)
|
||||
)
|
||||
assert r.status_code == 422, r.text
|
||||
|
||||
|
||||
def test_dev_delete_account_keeps_matches(client: TestClient, make_admin):
|
||||
"""DEV-удаление: аккаунт удаляется, партии живут (игрок вычёркивается),
|
||||
его созданные партии и группы переназначаются на админа."""
|
||||
|
||||
Reference in New Issue
Block a user