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

50 lines
1.9 KiB
Python
Raw Permalink 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.

from datetime import date
from app.services.merge import merge_schedules_data
from app.services.schedule_helpers import _parse_date_range, _time_sort_key, build_day_view, get_all_subjects
from tests.conftest import SAMPLE_DATA
def test_period_across_new_year_ends_next_year():
start, end = _parse_date_range('01.09-03.01')
assert start < end
assert end.year == start.year + 1
def test_period_within_year():
start, end = _parse_date_range('01.02-31.05')
assert (start.month, end.month) == (2, 5)
assert start.year == end.year
def test_whole_period_and_garbage():
assert _parse_date_range('Весь период') == (None, None)
assert _parse_date_range('ерунда') == (None, None)
def test_time_sort_key_handles_missing_leading_zero():
times = ['10:40-12:10', '9:00-10:30', None, '08:00-09:30']
assert sorted(times, key=_time_sort_key) == ['08:00-09:30', '9:00-10:30', '10:40-12:10', None]
def test_day_view_is_sorted_by_time():
monday = date(date.today().year, 9, 1)
while monday.weekday() != 0:
monday = monday.replace(day=monday.day + 1)
groups = build_day_view(SAMPLE_DATA, monday)
times = [g['time'] if isinstance(g, dict) else g[0]['time'] for g in groups]
assert times == ['9:00-10:30', '10:40-12:10']
def test_merge_combines_slots_without_duplicates():
other = [{'subject': 'Базы данных', 'types': {'Практика': {'color': 'green', 'dates': {
'01.09-31.12': [['среда', '12:20-13:50', 'АВ-210', 'Петров П.П.']]}}}}]
merged = merge_schedules_data([SAMPLE_DATA, SAMPLE_DATA, other])
assert len(merged) == 1
types = merged[0]['types']
assert set(types) == {'Лекция', 'Практика'}
assert len(types['Лекция']['dates']['01.09-31.12']) == 2
def test_get_all_subjects():
assert 'Базы данных' in get_all_subjects(SAMPLE_DATA)