104 lines
3.6 KiB
Python
104 lines
3.6 KiB
Python
"""
|
||
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)
|