Reject duplicate module migration revisions

This commit is contained in:
2026-08-03 15:04:18 +02:00
parent fa32cca03f
commit ad57fad1ea
3 changed files with 93 additions and 0 deletions
+22
View File
@@ -1,11 +1,13 @@
from __future__ import annotations
import logging
import os
import tempfile
import unittest
from pathlib import Path
from alembic import command
from alembic.config import Config
from alembic.runtime.migration import MigrationContext
from alembic.script import ScriptDirectory
from sqlalchemy import create_engine, inspect, text
@@ -16,6 +18,7 @@ from govoplan_core.db.migrations import (
migrate_database,
reconcile_change_sequence_retention_floor_drift,
reconcile_namespace_table_drift,
validate_unique_migration_revisions,
)
@@ -40,6 +43,25 @@ def database_migration_heads(connection) -> set[str]:
class DatabaseMigrationTests(unittest.TestCase):
def test_duplicate_module_revision_ids_are_rejected_with_file_provenance(self) -> None:
with tempfile.TemporaryDirectory(prefix="govoplan-duplicate-revision-test-") as directory:
root = Path(directory)
first = root / "first"
second = root / "second"
first.mkdir()
second.mkdir()
(first / "first.py").write_text('revision = "duplicate123"\n', encoding="utf-8")
(second / "second.py").write_text('revision: str = "duplicate123"\n', encoding="utf-8")
config = Config()
config.set_main_option("version_locations", os.pathsep.join((str(first), str(second))))
with self.assertRaisesRegex(ValueError, "duplicate123") as raised:
validate_unique_migration_revisions(config)
message = str(raised.exception)
self.assertIn("first.py", message)
self.assertIn("second.py", message)
def test_migration_logging_keeps_application_loggers_enabled(self) -> None:
logger = logging.getLogger("govoplan.request")
previous_disabled = logger.disabled