114 lines
3.2 KiB
Python
114 lines
3.2 KiB
Python
import pytest
|
|
|
|
from app.native.wndb.core import database
|
|
|
|
|
|
def _command(statement: str) -> database.DatabaseCommand:
|
|
return database.DatabaseCommand(statement, [])
|
|
|
|
|
|
def test_database_command_has_no_removed_undo_state() -> None:
|
|
changes = [{"operation": "update", "type": "title", "value": "new"}]
|
|
|
|
command = database.DatabaseCommand("SELECT 1", changes)
|
|
|
|
assert vars(command) == {"sql": "SELECT 1", "changes": changes}
|
|
assert not hasattr(command, "undo_sql")
|
|
assert not hasattr(command, "undo_cs")
|
|
|
|
|
|
def test_direct_model_write_refreshes_materialized_views(monkeypatch) -> None:
|
|
events: list[str] = []
|
|
monkeypatch.setattr(
|
|
database,
|
|
"write",
|
|
lambda _name, _statement: events.append("write"),
|
|
)
|
|
monkeypatch.setattr(
|
|
database,
|
|
"is_project_transaction_active",
|
|
lambda _name: False,
|
|
)
|
|
monkeypatch.setattr(
|
|
database,
|
|
"refresh_materialized_views_after_commit",
|
|
lambda _name: events.append("refresh"),
|
|
)
|
|
|
|
result = database.execute_command(
|
|
"project_a",
|
|
database.DatabaseCommand(
|
|
"UPDATE network.junctions SET elevation = 1",
|
|
[{"operation": "update", "type": "junction", "id": "J-1"}],
|
|
),
|
|
)
|
|
|
|
assert events == ["write", "refresh"]
|
|
assert result.operations == [
|
|
{"operation": "update", "type": "junction", "id": "J-1"}
|
|
]
|
|
|
|
|
|
def test_batch_model_write_defers_materialized_view_refresh(monkeypatch) -> None:
|
|
events: list[str] = []
|
|
monkeypatch.setattr(
|
|
database,
|
|
"write",
|
|
lambda _name, _statement: events.append("write"),
|
|
)
|
|
monkeypatch.setattr(
|
|
database,
|
|
"is_project_transaction_active",
|
|
lambda _name: True,
|
|
)
|
|
monkeypatch.setattr(
|
|
database,
|
|
"refresh_materialized_views_after_commit",
|
|
lambda _name: events.append("refresh"),
|
|
)
|
|
|
|
database.execute_command(
|
|
"project_a",
|
|
_command("UPDATE network.junctions SET elevation = 1"),
|
|
)
|
|
|
|
assert events == ["write"]
|
|
|
|
|
|
def test_refresh_after_commit_reports_that_changes_are_durable(monkeypatch) -> None:
|
|
def fail_refresh(_name: str) -> None:
|
|
raise RuntimeError("refresh failed")
|
|
|
|
monkeypatch.setattr(database, "refresh_materialized_views", fail_refresh)
|
|
|
|
with pytest.raises(
|
|
database.MaterializedViewRefreshAfterCommitError,
|
|
match="changes were committed",
|
|
) as exc_info:
|
|
database.refresh_materialized_views_after_commit("project_a")
|
|
|
|
assert exc_info.value.project == "project_a"
|
|
assert exc_info.value.changes_committed is True
|
|
assert isinstance(exc_info.value.__cause__, RuntimeError)
|
|
|
|
|
|
def test_non_gis_model_write_does_not_refresh_materialized_views(monkeypatch) -> None:
|
|
events: list[str] = []
|
|
monkeypatch.setattr(
|
|
database,
|
|
"write",
|
|
lambda _name, _statement: events.append("write"),
|
|
)
|
|
monkeypatch.setattr(
|
|
database,
|
|
"refresh_materialized_views",
|
|
lambda _name: events.append("refresh"),
|
|
)
|
|
|
|
database.execute_command(
|
|
"project_a",
|
|
_command("UPDATE network.time_settings SET value = '01:00'"),
|
|
)
|
|
|
|
assert events == ["write"]
|