1
0
Fork 0
mirror of https://github.com/EDeev/y.calendarkin.git synced 2026-10-08 00:39:27 +03:00
y.calendarkin/tests/test_sql.py
Egor Deev abafd7a55d Хранилище — PostgreSQL вместо двух файлов SQLite
code/sql.py на psycopg 3 с пулом соединений (переподключается сам); таблицы users, urls,
alarms — в PostgreSQL user и url зарезервированы. Внутренние номера пользователей сохраняются:
на них ссылаются файлы календарей data/icals/<номер>.ics. scripts/migrate_sqlite.py переносит
старые базы со сверкой (проверено на копии рабочих: 25 пользователей, 9 подписок).
Тесты хранилища и переноса — на PostgreSQL в CI; compose поднимает бота вместе с базой.
2026-10-06 11:46:39 +00:00

69 lines
2.7 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
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
du.add_user(777)
assert du.get_user_id(777) == 6