Reject duplicate module migration revisions
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user