mirror of
https://github.com/EDeev/tablo.git
synced 2026-10-07 20:49:31 +03:00
24 теста pytest на настоящей базе (адрес — TEST_DATABASE_URL): владелец, посторонний, редактор и ссылка на просмотр; экспорт по id только для владельца и редакторов; регистрация и вход, защита next; периоды через Новый год, сортировка времени, сборка дня и слияние расписаний. SQLAlchemy и alembic закреплены по продакшену: SQLAlchemy 2.1 по умолчанию требует другой драйвер PostgreSQL (psycopg 3).
76 lines
2.8 KiB
Python
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})
|