mirror of
https://github.com/EDeev/y.calendarkin.git
synced 2026-10-08 00:39:27 +03:00
При обновлении календаря (раз в 13 минут) старая выгрузка сравнивается с новой по UID события. Бот присылает одно сообщение со списком изменений: новое событие, удалено, перенесено (было/стало). Учитываются и отдельные вхождения повторяющихся событий — перенос (RECURRENCE-ID) и удаление (EXDATE). Прошедшие события пропускаются: Яндекс выгружает всю историю календаря. В сообщении — не больше 10 изменений, остальные одной строкой «…и ещё N». Команда /changes включает и выключает эти уведомления; по умолчанию включены у всех, колонка alarms.changes добавляется при запуске. При подписке и замене ссылки сравнения нет. Closes #2
73 lines
2.9 KiB
Python
73 lines
2.9 KiB
Python
import os
|
||
import sqlite3
|
||
import sys
|
||
|
||
import psycopg
|
||
import pytest
|
||
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "scripts"))
|
||
|
||
DSN = os.environ.get("TEST_DATABASE_URL")
|
||
pytestmark = pytest.mark.skipif(not DSN, reason="нужен TEST_DATABASE_URL (PostgreSQL)")
|
||
|
||
|
||
@pytest.fixture
|
||
def pool():
|
||
with psycopg.connect(DSN, autocommit=True) as conn:
|
||
conn.execute("DROP SCHEMA public CASCADE; CREATE SCHEMA public;")
|
||
import sql
|
||
p = sql.connect(DSN)
|
||
yield p
|
||
p.close()
|
||
|
||
|
||
def test_users_and_alarms(pool):
|
||
from sql import Clock, Users
|
||
du, dc = Users(pool), Clock(pool)
|
||
du.add_user(555)
|
||
du.add_user(555) # повторно — без ошибки
|
||
uid = du.get_user_id(555)
|
||
assert du.user_exists(555) and du.get_first_user_id(uid) == 555
|
||
du.add_url(uid, "https://calendar.yandex.ru/x", "Asia/Krasnoyarsk")
|
||
dc.add_clock(uid)
|
||
assert du.get_tz(uid).zone == "Asia/Krasnoyarsk" and du.get_status(uid) is True
|
||
du.update_status(uid)
|
||
assert du.get_status(uid) is False
|
||
assert dc.get_alarm(uid) == (15, 5) and dc.get_start(uid) is True and dc.get_daily(uid) is False
|
||
dc.update_alarm1(uid, 30)
|
||
dc.update_daily(uid)
|
||
assert dc.get_alarm(uid) == (30, 5) and dc.get_daily(uid) is True
|
||
assert dc.get_changes(uid) is True
|
||
dc.update_changes(uid)
|
||
assert dc.get_changes(uid) is False
|
||
du.delete_url(uid)
|
||
assert not du.url_exists(uid)
|
||
assert du.all_users() == [(uid,)]
|
||
|
||
|
||
def test_migration(pool, tmp_path):
|
||
import migrate_sqlite
|
||
users = sqlite3.connect(tmp_path / "users.db")
|
||
users.executescript("""
|
||
CREATE TABLE user (id INTEGER PRIMARY KEY, user_id INTEGER NOT NULL);
|
||
CREATE TABLE url (user_id INTEGER NOT NULL, status BOOLEAN NOT NULL DEFAULT (True), url_ical STRING, time_zone STRING);
|
||
INSERT INTO user VALUES (1, 111), (5, 555);
|
||
INSERT INTO url VALUES (5, 1, 'https://calendar.yandex.ru/a', 'Europe/Moscow');
|
||
""")
|
||
users.commit()
|
||
clock = sqlite3.connect(tmp_path / "clock.db")
|
||
clock.executescript("""
|
||
CREATE TABLE alarm (user_id INTEGER NOT NULL, daily BOOLEAN NOT NULL DEFAULT (False), start BOOLEAN NOT NULL DEFAULT (True),
|
||
alarm_1 INTEGER, alarm_2 INTEGER, status_2 BOOLEAN NOT NULL DEFAULT (True));
|
||
INSERT INTO alarm VALUES (5, 1, 0, 20, 10, 1);
|
||
""")
|
||
clock.commit()
|
||
assert migrate_sqlite.migrate(str(tmp_path), DSN, force=True)
|
||
|
||
from sql import Clock, Users
|
||
du, dc = Users(pool), Clock(pool)
|
||
assert du.get_user_id(555) == 5 # внутренний номер сохранён — на него ссылаются файлы календарей
|
||
assert dc.get_alarm(5) == (20, 10) and dc.get_daily(5) is True and dc.get_start(5) is False
|
||
assert dc.get_changes(5) is True # новая настройка включена и у перенесённых пользователей
|
||
du.add_user(777)
|
||
assert du.get_user_id(777) == 6
|