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

99 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Тесты на настоящем PostgreSQL (JSON-поля): адрес базы — в TEST_DATABASE_URL."""
import os
import pytest
from sqlalchemy import text
from app import create_app, db
from app.models import Schedule, Share, ShareEditor, User
DB_URL = os.getenv('TEST_DATABASE_URL', 'postgresql://tablo:tablo@localhost:5432/tablo_test')
SAMPLE_DATA = [
{
'subject': 'Базы данных',
'types': {
'Лекция': {'color': 'blue', 'dates': {'01.09-31.12': [
['понедельник', '10:40-12:10', 'АВ-301', 'Иванов И.И.'],
['понедельник', '9:00-10:30', 'АВ-301', 'Иванов И.И.'],
]}},
},
},
]
@pytest.fixture(scope='session')
def _app():
app = create_app({
'TESTING': True,
'SECRET_KEY': 'test-secret',
'WTF_CSRF_ENABLED': False,
'SQLALCHEMY_DATABASE_URI': DB_URL,
})
with app.app_context():
db.drop_all()
db.create_all()
yield app
with app.app_context():
db.drop_all()
@pytest.fixture(autouse=True)
def app(_app):
"""Свой контекст приложения на каждый тест, после теста таблицы очищаются."""
ctx = _app.app_context()
ctx.push()
yield _app
db.session.remove()
tables = ', '.join(t.name for t in db.metadata.sorted_tables)
with db.engine.begin() as conn:
conn.execute(text(f'TRUNCATE {tables} RESTART IDENTITY CASCADE'))
ctx.pop()
def make_user(login, password='password123'):
user = User(login=login)
user.set_password(password)
db.session.add(user)
db.session.commit()
return user
@pytest.fixture
def owner():
return make_user('owner')
@pytest.fixture
def stranger():
return make_user('stranger')
@pytest.fixture
def schedule(owner):
s = Schedule(user_id=owner.id, name='Весенний семестр', data=SAMPLE_DATA)
db.session.add(s)
db.session.commit()
return s
def login(client, user_login, password='password123'):
return client.post('/login', data={'login': user_login, 'password': password})
@pytest.fixture
def share_edit(schedule, owner):
share = Share(schedule_id=schedule.id, owner_id=owner.id, share_type='edit')
db.session.add(share)
db.session.commit()
return share
def add_editor(share, user):
db.session.add(ShareEditor(share_id=share.id, user_id=user.id))
db.session.commit()
@pytest.fixture
def client(app):
return app.test_client()