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"]