79 lines
3.2 KiB
Python
79 lines
3.2 KiB
Python
"""Тесты применения миграций локальной базы данных."""
|
||
|
||
from pathlib import Path
|
||
from tempfile import TemporaryDirectory
|
||
from unittest import TestCase
|
||
|
||
from db.db import Database
|
||
|
||
|
||
class MigrationTestCase(TestCase):
|
||
"""Проверяет миграцию связи Redmine с активностями Clockify."""
|
||
|
||
def test_migration_creates_one_to_many_relation_and_runs_once(self):
|
||
"""Миграция переносит связь и не выполняется повторно."""
|
||
with TemporaryDirectory() as directory:
|
||
db_path = Path(directory) / "tracker.db"
|
||
db = Database(str(db_path), "config/RedmineTracker.sql")
|
||
|
||
db.run_migrations("migrations")
|
||
db.run_migrations("migrations")
|
||
|
||
activity_columns = {
|
||
row[1]
|
||
for row in db.cursor.execute("PRAGMA table_info(activity)").fetchall()
|
||
}
|
||
time_entry_columns = {
|
||
row[1]
|
||
for row in db.cursor.execute("PRAGMA table_info(time_entry)").fetchall()
|
||
}
|
||
migration = db.cursor.execute(
|
||
"SELECT name, executed_at FROM migration"
|
||
).fetchall()
|
||
activity_foreign_keys = {
|
||
row[3]: row[2]
|
||
for row in db.cursor.execute(
|
||
"PRAGMA foreign_key_list(activity)"
|
||
).fetchall()
|
||
}
|
||
|
||
self.assertIn("time_entry_id", activity_columns)
|
||
self.assertNotIn("activity_id", time_entry_columns)
|
||
self.assertEqual(activity_foreign_keys["time_entry_id"], "time_entry")
|
||
self.assertEqual(len(migration), 1)
|
||
self.assertEqual(
|
||
migration[0][0],
|
||
"a7f3c9e1_redmine_clockify_relation.py",
|
||
)
|
||
self.assertIsNotNone(migration[0][1])
|
||
db.con.close()
|
||
|
||
def test_multiple_activities_can_reference_one_time_entry(self):
|
||
"""Несколько активностей Clockify могут ссылаться на одну запись Redmine."""
|
||
with TemporaryDirectory() as directory:
|
||
db_path = Path(directory) / "tracker.db"
|
||
db = Database(str(db_path), "config/RedmineTracker.sql")
|
||
db.run_migrations("migrations")
|
||
db.cursor.execute("PRAGMA foreign_keys = OFF")
|
||
db.cursor.execute(
|
||
"""INSERT INTO time_entry(
|
||
id, description, date, time_spent,
|
||
task_id, activity_type_id, author_id
|
||
) VALUES(42, 'Работа', '2026-07-14', 1, 51906, 9, 1)"""
|
||
)
|
||
for activity_id in ("first", "second"):
|
||
db.cursor.execute(
|
||
"""INSERT INTO activity(
|
||
id, description, author_id, time_spent, date_start,
|
||
tag_id, time_entry_id
|
||
) VALUES(?, 'Работа', 1, 0.5, '2026-07-14', 'tag', 42)""",
|
||
(activity_id,),
|
||
)
|
||
|
||
count = db.cursor.execute(
|
||
"SELECT COUNT(*) FROM activity WHERE time_entry_id = 42"
|
||
).fetchone()[0]
|
||
|
||
self.assertEqual(count, 2)
|
||
db.con.close()
|