1
0
Fork 0
mirror of https://github.com/EDeev/tablo.git synced 2026-10-07 20:49:31 +03:00
tablo/tests/test_auth.py
Egor Deev ac8859d9d3 Тесты на PostgreSQL: права доступа, экспорт, ссылки, вход, разбор периодов и времени
24 теста pytest на настоящей базе (адрес — TEST_DATABASE_URL): владелец, посторонний,
редактор и ссылка на просмотр; экспорт по id только для владельца и редакторов;
регистрация и вход, защита next; периоды через Новый год, сортировка времени,
сборка дня и слияние расписаний. SQLAlchemy и alembic закреплены по продакшену:
SQLAlchemy 2.1 по умолчанию требует другой драйвер PostgreSQL (psycopg 3).
2026-10-02 13:24:18 +00:00

36 lines
1.5 KiB
Python

from app.models import User
def test_register_and_login(client, app):
response = client.post('/register', data={'login': 'student', 'password': 'secret123', 'confirm': 'secret123'})
assert response.status_code in (200, 302)
assert User.query.filter_by(login='student').one().check_password('secret123')
client.get('/logout')
response = client.post('/login', data={'login': 'student', 'password': 'secret123'})
assert response.status_code == 302
def test_wrong_password_is_rejected(client, owner):
response = client.post('/login', data={'login': 'owner', 'password': 'wrong'})
assert response.status_code == 200
assert client.get('/').status_code == 302
def test_password_is_hashed(owner):
assert owner.password_hash != 'password123'
def test_login_next_redirect_stays_on_site(client, owner):
response = client.post('/login?next=https://evil.example/phish', data={'login': 'owner', 'password': 'password123'})
assert response.status_code == 302
assert 'evil.example' not in response.headers['Location']
def test_login_next_relative_path_is_kept(client, owner):
response = client.post('/login?next=/schedules/upload', data={'login': 'owner', 'password': 'password123'})
assert response.headers['Location'].endswith('/schedules/upload')
def test_login_next_backslash_trick_is_rejected(client, owner):
response = client.post('/login?next=/%5Cevil.example', data={'login': 'owner', 'password': 'password123'})
assert 'evil.example' not in response.headers['Location']