1
0
Fork 0
mirror of https://github.com/EDeev/tablo.git synced 2026-10-07 20:49:31 +03:00
tablo/tests/test_access.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

76 lines
2.8 KiB
Python

import pytest
from app import db
from app.models import Share
from tests.conftest import add_editor, login, make_user
EXPORTS = ['json', 'csv']
def test_owner_sees_schedule(client, owner, schedule):
login(client, 'owner')
assert client.get(f'/schedules/{schedule.id}').status_code == 200
def test_anonymous_is_redirected_to_login(client, schedule):
response = client.get(f'/schedules/{schedule.id}')
assert response.status_code == 302
assert '/login' in response.headers['Location']
def test_stranger_cannot_open_schedule(client, schedule, stranger):
login(client, 'stranger')
response = client.get(f'/schedules/{schedule.id}', follow_redirects=False)
assert response.status_code in (302, 403)
@pytest.mark.parametrize('fmt', EXPORTS)
def test_owner_can_export(client, schedule, fmt):
login(client, 'owner')
response = client.get(f'/schedules/{schedule.id}/export/{fmt}')
assert response.status_code == 200
assert 'Базы данных' in response.get_data(as_text=True)
@pytest.mark.parametrize('fmt', EXPORTS)
def test_view_share_does_not_open_export_by_id(client, schedule, owner, stranger, fmt):
"""Ссылка на просмотр открывает расписание по токену, но не экспорт по id."""
db.session.add(Share(schedule_id=schedule.id, owner_id=owner.id, share_type='view'))
db.session.commit()
login(client, 'stranger')
response = client.get(f'/schedules/{schedule.id}/export/{fmt}')
assert response.status_code == 302
assert 'Базы данных' not in response.get_data(as_text=True)
def test_editor_can_view_and_export(client, schedule, share_edit):
editor = make_user('editor')
add_editor(share_edit, editor)
login(client, 'editor')
assert client.get(f'/schedules/{schedule.id}').status_code == 200
assert client.get(f'/schedules/{schedule.id}/export/json').status_code == 200
def test_view_share_link_works_without_login(client, schedule, owner):
share = Share(schedule_id=schedule.id, owner_id=owner.id, share_type='view')
db.session.add(share)
db.session.commit()
response = client.get(f'/shared/{share.token}')
assert response.status_code == 200
assert 'Базы данных' in response.get_data(as_text=True)
def test_stranger_cannot_rename(client, schedule, stranger):
login(client, 'stranger')
client.post(f'/schedules/{schedule.id}/rename', data={'name': 'Взлом'})
db.session.refresh(schedule)
assert schedule.name == 'Весенний семестр'
def test_app_refuses_to_start_without_secret_key(monkeypatch):
from app import create_app
monkeypatch.delenv('SECRET_KEY', raising=False)
monkeypatch.delenv('FLASK_DEBUG', raising=False)
with pytest.raises(RuntimeError):
create_app({'SECRET_KEY': None})