Добавлена форма изменения ника при регистрации аккаунта на случай, когда уже существует аакунт с ником, совпадающим с ТГ тегом регистрируемого аккаунта

This commit is contained in:
2026-06-17 16:17:14 +03:00
parent 65bebf8b85
commit 865c967d5e
10 changed files with 409 additions and 28 deletions
+61
View File
@@ -79,3 +79,64 @@ def test_telegram_login_bad_signature_rejected(client: TestClient, monkeypatch):
r = client.post("/api/auth/telegram", json=payload)
assert r.status_code == 401
_ = csrf_headers # (для единообразия импорта)
def test_telegram_same_id_no_duplicate_account(client: TestClient, monkeypatch):
"""Вход с двух устройств / после смены тега — один аккаунт (ключ = числовой id)."""
from app.core.config import settings
monkeypatch.setattr(settings, "telegram_bot_token", "TEST_BOT_TOKEN")
r1 = client.post("/api/auth/telegram", json=_telegram_payload("TEST_BOT_TOKEN", username="firsttag"))
assert r1.status_code == 200, r1.text
client.cookies.clear() # «другое устройство» — без сессии
# Тот же telegram id (777), но другой тег и свежий auth_date.
r2 = client.post("/api/auth/telegram", json=_telegram_payload("TEST_BOT_TOKEN", username="changedtag"))
assert r2.status_code == 200, r2.text
assert r2.json()["id"] == r1.json()["id"] # тот же пользователь
assert r2.json()["nickname"] == r1.json()["nickname"] # ник не пересоздаётся
def test_telegram_register_nickname_collision_then_pick(client: TestClient, engine, monkeypatch):
"""Первый вход через ТГ, тег совпал с чужим ником → просим выбрать ник → регистрируем."""
from sqlmodel import Session
from app.core.config import settings
from app.models import User
monkeypatch.setattr(settings, "telegram_bot_token", "TEST_BOT_TOKEN")
with Session(engine) as s: # существующий игрок с ником = тегу из payload (ivan_tg)
s.add(User(nickname="ivan_tg", role="player", auth_provider="stub"))
s.commit()
payload = _telegram_payload("TEST_BOT_TOKEN") # id=777, username=ivan_tg
r = client.post("/api/auth/telegram", json=payload)
assert r.status_code == 409, r.text
err = r.json()["error"]
assert err["code"] == "TELEGRAM_NICKNAME_REQUIRED"
assert err["details"]["suggested"] == "ivan_tg"
# Повтор с выбранным свободным ником (та же подпись виджета).
r2 = client.post("/api/auth/telegram/register", json={**payload, "nickname": "Иван-новый"})
assert r2.status_code == 200, r2.text
assert r2.json()["nickname"] == "Иван-новый"
assert r2.json()["telegram_id"] == 777
def test_telegram_register_rejects_taken_nickname(client: TestClient, engine, monkeypatch):
"""На шаге выбора ника всё ещё занятый ник отклоняется (NICKNAME_TAKEN)."""
from sqlmodel import Session
from app.core.config import settings
from app.models import User
monkeypatch.setattr(settings, "telegram_bot_token", "TEST_BOT_TOKEN")
with Session(engine) as s:
s.add(User(nickname="ivan_tg", role="player", auth_provider="stub"))
s.add(User(nickname="занятый", role="player", auth_provider="stub"))
s.commit()
payload = _telegram_payload("TEST_BOT_TOKEN")
r = client.post("/api/auth/telegram/register", json={**payload, "nickname": "занятый"})
assert r.status_code == 409, r.text
assert r.json()["error"]["code"] == "NICKNAME_TAKEN"