login: left panel 1/4, distrib button, text tweaks, dashboard light theme polish
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
"""
|
||||
Smoke-tests: проверяем что все ключевые роуты не падают с NameError/ImportError.
|
||||
Не проверяем бизнес-логику — только что страницы отдают ответ.
|
||||
"""
|
||||
import pytest
|
||||
|
||||
|
||||
# ── Публичные страницы ──────────────────────────────────────────────────────
|
||||
|
||||
def test_index_anonymous(client):
|
||||
"""Главная без авторизации — либо страница сервисов, либо логин."""
|
||||
r = client.get("/", follow_redirects=True)
|
||||
assert r.status_code == 200
|
||||
|
||||
|
||||
def test_login_form_on_index(client):
|
||||
"""Форма логина рендерится на /."""
|
||||
r = client.get("/", follow_redirects=True)
|
||||
assert r.status_code == 200
|
||||
assert "csrf" in r.text.lower() or "login" in r.text.lower() or "пароль" in r.text.lower()
|
||||
|
||||
|
||||
def _get_csrf(client):
|
||||
from conftest import _extract_csrf
|
||||
return _extract_csrf(client)
|
||||
|
||||
|
||||
def test_login_wrong_password(client):
|
||||
csrf = _get_csrf(client)
|
||||
r = client.post("/login", data={
|
||||
"username": "admin",
|
||||
"password": "wrongpass",
|
||||
"csrf_token": csrf,
|
||||
})
|
||||
assert r.status_code in (200, 401)
|
||||
|
||||
|
||||
def test_login_csrf_fail(client):
|
||||
r = client.post("/login", data={
|
||||
"username": "admin",
|
||||
"password": "testpass123",
|
||||
"csrf_token": "bad-token",
|
||||
})
|
||||
assert r.status_code == 403
|
||||
|
||||
|
||||
def test_login_no_such_method(client):
|
||||
r = client.get("/login")
|
||||
assert r.status_code in (200, 405) # только документируем поведение
|
||||
|
||||
|
||||
# ── Авторизованные страницы ─────────────────────────────────────────────────
|
||||
|
||||
def test_login_success(auth_client):
|
||||
r = auth_client.get("/", follow_redirects=True)
|
||||
assert r.status_code == 200
|
||||
|
||||
|
||||
def test_admin_page(auth_client):
|
||||
r = auth_client.get("/admin")
|
||||
assert r.status_code == 200
|
||||
|
||||
|
||||
def test_admin_requires_auth(client):
|
||||
from fastapi.testclient import TestClient
|
||||
import main as app_module
|
||||
fresh = TestClient(app_module.app, raise_server_exceptions=False)
|
||||
r = fresh.get("/admin", follow_redirects=False)
|
||||
assert r.status_code in (302, 303, 401, 403)
|
||||
|
||||
|
||||
# ── API роуты ───────────────────────────────────────────────────────────────
|
||||
|
||||
def test_api_services_list(auth_client):
|
||||
r = auth_client.get("/api/admin/services")
|
||||
assert r.status_code in (200, 404, 405)
|
||||
|
||||
|
||||
def test_api_users_list(auth_client):
|
||||
r = auth_client.get("/api/admin/users")
|
||||
assert r.status_code in (200, 404, 405)
|
||||
|
||||
|
||||
def test_api_categories(auth_client):
|
||||
r = auth_client.get("/api/admin/categories")
|
||||
assert r.status_code in (200, 404, 405)
|
||||
|
||||
|
||||
# ── Несуществующие роуты ────────────────────────────────────────────────────
|
||||
|
||||
def test_404(client):
|
||||
r = client.get("/this-does-not-exist-xyz")
|
||||
assert r.status_code == 404
|
||||
|
||||
|
||||
def test_session_unknown(auth_client):
|
||||
r = auth_client.get("/s/00000000-0000-0000-0000-000000000000/")
|
||||
assert r.status_code in (200, 302, 303, 404)
|
||||
|
||||
|
||||
def test_go_unknown_slug(auth_client):
|
||||
r = auth_client.get("/go/nonexistent-service-slug", follow_redirects=False)
|
||||
assert r.status_code in (302, 303, 404)
|
||||
Reference in New Issue
Block a user