|
7 | 7 | from flexmeasures.data import db, register_at |
8 | 8 | from flexmeasures.data.utils import ( |
9 | 9 | DatabaseSchemaRevisionStatus, |
| 10 | + database_schema_has_revision, |
10 | 11 | format_database_schema_revision_status, |
11 | 12 | get_database_schema_revision_status, |
12 | 13 | ) |
@@ -40,6 +41,25 @@ def get_heads(self) -> tuple[str, ...]: |
40 | 41 | return self._heads |
41 | 42 |
|
42 | 43 |
|
| 44 | +class _DummyRevision: |
| 45 | + def __init__(self, revision: str): |
| 46 | + self.revision = revision |
| 47 | + |
| 48 | + |
| 49 | +class _DummyRevisionMap: |
| 50 | + def __init__(self, revisions: tuple[str, ...]): |
| 51 | + self._revisions = revisions |
| 52 | + |
| 53 | + def iterate_revisions(self, *args, **kwargs): |
| 54 | + return (_DummyRevision(revision) for revision in self._revisions) |
| 55 | + |
| 56 | + |
| 57 | +class _DummyScriptDirectoryWithRevisionMap(_DummyScriptDirectory): |
| 58 | + def __init__(self, heads: tuple[str, ...], revisions: tuple[str, ...]): |
| 59 | + super().__init__(heads) |
| 60 | + self.revision_map = _DummyRevisionMap(revisions) |
| 61 | + |
| 62 | + |
43 | 63 | def test_schema_mismatch_log_record_is_deduplicated( |
44 | 64 | app, clean_redis, monkeypatch, caplog |
45 | 65 | ): |
@@ -181,3 +201,39 @@ def raise_operational_error(): |
181 | 201 | assert status.expected_heads == ("head-a",) |
182 | 202 | assert status.inspection_error is not None |
183 | 203 | assert status.is_migrated_to_head is False |
| 204 | + |
| 205 | + |
| 206 | +def test_database_schema_has_revision_when_revision_is_in_current_history( |
| 207 | + app, monkeypatch |
| 208 | +): |
| 209 | + monkeypatch.setattr(db.engine, "connect", lambda: _DummyConnection()) |
| 210 | + monkeypatch.setattr( |
| 211 | + "flexmeasures.data.utils.MigrationContext.configure", |
| 212 | + lambda connection: _DummyMigrationContext(("head-a",)), |
| 213 | + ) |
| 214 | + monkeypatch.setattr( |
| 215 | + "flexmeasures.data.utils.ScriptDirectory.from_config", |
| 216 | + lambda config: _DummyScriptDirectoryWithRevisionMap( |
| 217 | + heads=("head-a",), revisions=("head-a", "required-a") |
| 218 | + ), |
| 219 | + ) |
| 220 | + |
| 221 | + assert database_schema_has_revision(app, "required-a") is True |
| 222 | + |
| 223 | + |
| 224 | +def test_database_schema_has_revision_false_when_revision_is_not_in_current_history( |
| 225 | + app, monkeypatch |
| 226 | +): |
| 227 | + monkeypatch.setattr(db.engine, "connect", lambda: _DummyConnection()) |
| 228 | + monkeypatch.setattr( |
| 229 | + "flexmeasures.data.utils.MigrationContext.configure", |
| 230 | + lambda connection: _DummyMigrationContext(("old-a",)), |
| 231 | + ) |
| 232 | + monkeypatch.setattr( |
| 233 | + "flexmeasures.data.utils.ScriptDirectory.from_config", |
| 234 | + lambda config: _DummyScriptDirectoryWithRevisionMap( |
| 235 | + heads=("head-a",), revisions=("old-a",) |
| 236 | + ), |
| 237 | + ) |
| 238 | + |
| 239 | + assert database_schema_has_revision(app, "required-a") is False |
0 commit comments