"""Тесты применения миграций локальной базы данных.""" 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()