Добавлена форма изменения ника при регистрации аккаунта на случай, когда уже существует аакунт с ником, совпадающим с ТГ тегом регистрируемого аккаунта
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user